运行以下代码:
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行?
当赋值本身用作命令而不是某些其他命令(例如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运行的后续命令继承.所以...
这将设置一个shell变量,该变量不会传递给命令的环境:
a=one
Run Code Online (Sandbox Code Playgroud)这仅为此命令设置环境变量,而不是为shell或更高版本的命令设置:
b=two somecommand
Run Code Online (Sandbox Code Playgroud)这在shell中设置了一个环境变量,因此它可供shell使用,所有后续命令都从该shell运行:
export c=three
Run Code Online (Sandbox Code Playgroud)这也是一样的:
d=four
export d
Run Code Online (Sandbox Code Playgroud)
您可以在分配之前,之后或分配时将shell变量导出到环境中.