Bash: 同行赋值变量不改变输出行为

10
a=2
a=3 echo $a     #prints 2

有人能解释一下为什么会有人在第二行使用以上的代码吗? 因为a=3会被忽略,没有“回车”。 但我看到像上面这样的脚本中使用它,不确定目的是什么。

3
在执行a=3之前,变量$a已经被展开。通常情况下,使用var=val command设置环境变量,以便在command执行期间可见,但其他地方不可见。在这种情况下,变量$a将在echo命令中被解释为3,但其参数仍然是2 - Biffen
这很可能是因为有人想要测试你的结论。 - Maroun
@Biffen - 没错。你应该把它作为一个答案。 - Mr. Llama
即使它能够工作,我也无法想象在何种情况下您会希望使用a=$value echo $a而不是echo $value - chepner
1
@JohnnyLambada 这就是任何变量的作用。您不需要特殊的语法来允许它。预命令赋值是用于不同的目的; 改变命令执行的环境,而不是产生要执行的命令的命令行。 - chepner
显示剩余3条评论
2个回答

14

$aa=3被评估之前会被Shell(Bash)展开。因此,echo将其参数视为2,并打印出来。(如果您使用set -x,则可以看到执行的内容是a=3 echo 2。)

var=val command用于设置一个环境变量,在command执行期间可见,但其他地方不可见。因此,当command读取环境变量时(例如使用getenv()),$var的值为val

如果echo在运行时查找$a,它将具有值3


7

在设置环境并为变量 a 设置不同的值(3)之前,父进程会先展开 a。尽管通过 echo 将变量 a 设置为 3 执行了,但该值已经被提前展开。因此,现在已经太晚了。

你可以改为:

a=3 bash -c 'echo $a'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接