bash - bash 脚本中的变量值不会改变

标签 bash shell

<分区>

运行以下代码:

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到其环境中的“三”并将输出定向到名为“一”的文件。

顺便说一句,还有一个我没有提到的并发症:exporting 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/

相关文章:

linux - 强制为 shell 脚本中的每个命令运行 `tee`?

linux - 在 shell 脚本中使用相同的命令,只是带有前缀

bash - 如何使我的 shell 脚本可执行

linux - 加入两个文件,包括 Shell 中不匹配的行

BASH comm 命令,但适用于多列

linux - Linux 中的回收站脚本

bash - 如何在 Bash 中引用名称中具有不同数字的数组?

java - 如何使用java在shell脚本中传递用户名和密码

linux - 如何实现shell输入重定向

shell - Cut 命令指定制表符作为分隔符