我只是想知道两者之间的区别是什么:echo {$number1..$number2}
和eval echo {$number1..$number2}
当然,假设$ number1和$ number2中都有一个值。
使用第一个选项只是不起作用,但是使用第二个选项则可以。我不是只希望工作的典型人,我想了解为什么会这样发生,为什么会这样发生呢?
最佳答案
为什么第一个表达式不能按预期工作
$number1..$number2
不是有效的序列表达式,因此整个表达式保持不变。 {1..3}
(假定number1=1
和number2=3
)。 为什么第二个表达式可以
您的第二个示例的工作原理相同,只是变量扩展(
{1..3}
)的结果通过eval
再次传递给Bash,这使括号扩展有第二次机会:1..3
是格式正确的序列表达式,因此括号扩展产生了预期的结果:1 2 3
避免使用eval
通常应避免使用eval
,因为它很容易引起安全性问题:如果number1
或number2
收到输入并且未正确清理,则可以将恶意代码注入(inject)到您的程序中。有关在各种用例中替换eval
的方法,请参见this related question。在您的特定示例中,该序列可以由for循环结合算术评估来创建:
for ((i=number1 ; i<=number2; i+=1)); do echo -n "$i" ; done | xargs
1 2 3
流行的非Bash解决方案将使用seq
(如Walt A在his answer中指出的那样)。注意:在这些示例中,
seq "$number1" "$number2" | xargs
将多行输出连接到一行。更多的信息
此answer to a related question提供了有关该主题的更多信息。
另外,EXPANSION section中的bash(1) manual page可以很好地说明不同扩展机制的顺序和工作原理。