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