我只是想知道是什么的区别:
echo {$number1..$number2}
和
eval echo {$number1..$number2}
当然,假设有在$数字1和$数字2的值。随着第一个选项是不工作的,但它的工作原理的第二个选项。我不是典型的家伙,只是想要的东西的工作,我想明白为什么会发生这样的话,到底为什么会出现这种情况也是这样吗?
$number1..$number2
是不是一个有效的序列表达,所以整个表达式保持不变。{1..3}
(假定number1=1
和number2=3
)。第二个实施例的工作方式相同,不同之处在于可变膨胀({1..3}
)的结果被传递给经由eval
再次bash中,给予括号扩展的第二次机会:1..3
是正确的形成的序列的表达,并因此括号扩展产生预期的结果:
1 2 3
eval
使用eval
一般应避免,因为它很容易带来安全问题:如果number1
或number2
接收输入,并且没有正确消毒,恶意代码可以被注入到你的程序。见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
加入多线输出到这些例子一行。
这answer to a related question提供了有关主题的更多信息。
此外,在EXPANSION section的bash(1) manual page是顺序以及不同的扩展机制运作相当翔实。
变量的置换是晚期。
您可以避免eval
与
seq -s " " "$number1" "$number2"