gpt4 book ai didi

linux - 这两件事有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 00:46:15 25 4
gpt4 key购买 nike

我只是想知道:

回显 {$number1..$number2}

eval echo {$number1..$number2}

当然,假设$number1 和$number2 中有一个值。第一个选项不起作用,但第二个选项有效。我不是那种只希望某些东西起作用的典型人,我想了解为什么会这样,为什么会这样?

最佳答案

为什么第一个表达式没有按预期工作

  1. 大括号展开在变量展开之前执行。 $number1..$number2 不是有效的序列表达式,因此整个表达式保持不变。
  2. 之后,发生变量扩展,产生表达式 {1..3}(假设 number1=1number2=3).

为什么第二个表达式会这样

您的第二个示例的工作方式相同,只是变量扩展的结果 ({1..3}) 通过 eval 再次传递给 Bash,给出大括号扩展第二次机会:1..3 是一个格式正确的序列表达式,因此大括号扩展会产生预期的结果:

1 2 3

避免使用eval

通常应避免使用 eval,因为它很容易引入安全问题:如果 number1number2 接收输入但未正确过滤,恶意代码可以注入(inject)到您的程序中。参见 this related question了解在各种用例中替换 eval 的方法。

在您的特定示例中,序列可以通过结合算术评估的 for 循环来创建:

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

一种流行的非 Bash 解决方案是使用 seq(正如 Walter A 在 his answer 中指出的那样),如 seq "$number1""$number2"| xargs.

注意:xargs 在这些示例中将多行输出连接到一行。

更多信息

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

另外,EXPANSION sectionbash(1) manual page对不同扩展机制的顺序和工作方式提供了非常丰富的信息。

关于linux - 这两件事有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54498761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com