我只是想知道两者之间的区别是什么:
echo {$number1..$number2}

eval echo {$number1..$number2}
当然,假设$ number1和$ number2中都有一个值。
使用第一个选项只是不起作用,但是使用第二个选项则可以。我不是只希望工作的典型人,我想了解为什么会这样发生,为什么会这样发生呢?

最佳答案

为什么第一个表达式不能按预期工作

  • 在变量扩展之前执行括号扩展。 $number1..$number2不是有效的序列表达式,因此整个表达式保持不变。
  • 之后,将进行变量扩展,生成表达式{1..3}(假定number1=1number2=3)。

  • 为什么第二个表达式可以
    您的第二个示例的工作原理相同,只是变量扩展({1..3})的结果通过eval再次传递给Bash,这使括号扩展有第二次机会:1..3是格式正确的序列表达式,因此括号扩展产生了预期的结果:
    1 2 3
    
    避免使用eval通常应避免使用eval,因为它很容易引起安全性问题:如果number1number2收到输入并且未正确清理,则可以将恶意代码注入(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可以很好地说明不同扩展机制的顺序和工作原理。

    10-06 08:08