<分区>
运行以下代码:
a=one; echo $a
a=two echo $a
a=three echo $a >$a
结果
一个
一个
和一个名为“one”且内容为“one”的已创建文件
为什么变量没有在第 2 行更改为 two
而在第 3 行更改为 three
?
<分区>
运行以下代码:
a=one; echo $a
a=two echo $a
a=three echo $a >$a
结果
一个
一个
和一个名为“one”且内容为“one”的已创建文件
为什么变量没有在第 2 行更改为 two
而在第 3 行更改为 three
?
最佳答案
当赋值本身用作命令与用作其他命令的前缀(例如 echo
)时,赋值会做一些不同的事情。当单独用作命令时,它会将 shell 变量设置为该值。当用作某些其他命令的前缀时,它会在命令的环境中设置一个那个变量但不在 shell 中。
所以,看第一个例子,a=one; echo $a
,其中分号使这两个命令位于同一行。第一个命令将 shell 变量 a
设置为值“one”,然后对于第二个命令,shell 将 a
扩展为“one”,然后将其作为一个echo
的参数。
在第二个例子中,a=two echo $a
,赋值是echo
命令的前缀,所以echo
将是在其环境中 a
设置为“two”时执行。但是 $a
被 shell 扩展,而不是 echo
命令,并且 a
仍然设置为“one”作为 shell 变量,以便使用该值。
第三个例子,a=three echo $a >$a
,和第二个很像。 shell 将两个 $a
扩展为“one”(因为这是 shell 变量的值),然后执行 echo one
并设置 a
到其环境中的“三”并将输出定向到名为“一”的文件。
顺便说一句,还有一个我没有提到的并发症:export
ing shell 变量。默认情况下,shell 变量不会在 shell 执行的命令环境中设置。也就是说,它们是 shell 变量,而不是环境变量。但是,如果您export
一个 shell 变量,它就会成为一个环境变量,并将由该 shell 运行的后续命令继承。所以……
这会设置一个 shell 变量,该变量不会传递到命令的环境中:
a=one
这仅为这个命令设置环境变量,而不是为 shell 或后续命令设置环境变量:
b=two somecommand
这会在 shell 中设置一个环境变量,因此它可用于 shell 和从该 shell 运行的所有后续命令:
export c=three
这做同样的事情:
d=four
export d
您可以在分配给它们之前、之后或同时将 shell 变量导出到环境。
关于bash - bash 脚本中的变量值不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46978838/