是什么这两件事之间有什么区别?

问题描述 投票:6回答:2

我只是想知道是什么的区别:

echo {$number1..$number2}

eval echo {$number1..$number2}

当然,假设有在$数字1和$数字2的值。随着第一个选项是不工作的,但它的工作原理的第二个选项。我不是典型的家伙,只是想要的东西的工作,我想明白为什么会发生这样的话,到底为什么会出现这种情况也是这样吗?

linux bash eval brace-expansion
2个回答
9
投票

Why the first expression does not work as expected

  1. 括号扩展是变量扩展之前执行。 $number1..$number2是不是一个有效的序列表达,所以整个表达式保持不变。
  2. 在此之后,变量发生膨胀,从而在表达{1..3}(假定number1=1number2=3)。

Why the second expression does

第二个实施例的工作方式相同,不同之处在于可变膨胀({1..3})的结果被传递给经由eval再次bash中,给予括号扩展的第二次机会:1..3是正确的形成的序列的表达,并因此括号扩展产生预期的结果:

1 2 3

Avoid using eval

使用eval一般应避免,因为它很容易带来安全问题:如果number1number2接收输入,并且没有正确消毒,恶意代码可以被注入到你的程序。见this related question办法在各种使用情况更换eval

在您的具体的例子,该序列可以替代地由一个for循环算术评价相结合产生:

for ((i=number1 ; i<=number2; i+=1)); do echo -n "$i" ; done | xargs
1 2 3

一种流行的非击的解决办法是使用seq(如在his answer指出由Walter A)如在seq "$number1" "$number2" | xargs

注:xargs加入多线输出到这些例子一行。

Further information

answer to a related question提供了有关主题的更多信息。

此外,在EXPANSION sectionbash(1) manual page是顺序以及不同的扩展机制运作相当翔实。


0
投票

变量的置换是晚期。 您可以避免eval

seq -s " " "$number1" "$number2"
© www.soinside.com 2019 - 2024. All rights reserved.