变量值在bash脚本中不会更改

Pet*_* D. 3 bash shell

运行以下代码:

a=one; echo $a
a=two echo $a
a=three echo $a >$a
Run Code Online (Sandbox Code Playgroud)

结果是

一

一

和一个名为"one"且内容为"one"的创建文件

为什么变量没有变为two第2行和three第3行?

Gor*_*son 6

当赋值本身用作命令而不是某些其他命令(例如echo)的前缀时,赋值会执行不同的操作.当它本身用作命令时,它将shell变量设置为该值.当用作其他命令的前缀时,它在命令的环境中设置该变量,但不在shell中设置.

所以,看看第一个例子,a=one; echo $a分号在同一行上生成这两个命令.第一个命令将shell变量a设置为值"one",然后对于第二个命令,shell将扩展a为"one",然后将其作为参数传递给echo.

在第二个示例中,a=two echo $a赋值是echo命令的前缀,因此echo将a在其环境中设置为"2" 执行.但是$a由shell而不是echo命令扩展,并且a仍然设置为"one"作为shell变量,以便使用该值.

第三个例子,a=three echo $a >$a很像第二个例子.外壳两侧展开的$as到"一"(因为这是shell变量的值),然后执行echo one与a设定在其环境和输出定向到一个名为"一个"文件"三化".

顺便说一句,我还没有提到另一个复杂因素:exportshell变量.默认情况下,shell变量不会在shell执行的命令环境中设置.也就是说,它们是shell变量,而不是环境变量.但是如果你export是一个shell变量,它将成为一个环境变量,并将由该shell运行的后续命令继承.所以...