变量值不为';bash脚本中没有更改

变量值不为';bash脚本中没有更改,bash,shell,Bash,Shell,运行以下代码: a=one; echo $a a=two echo $a a=three echo $a >$a 导致 一个 一个 以及一个名为“one”且内容为“one”的已创建文件 为什么变量在第2行没有变为two,在第3行没有变为two?当赋值本身用作命令时,与用作其他命令的前缀时(例如echo)有所不同。当单独用作命令时,它会将shell变量设置为该值。当用作其他命令的前缀时,它会在命令环境中设置该变量,但不会在shell中设置该变量 那么,看看第一个例子,a=one;echo$

运行以下代码:

a=one; echo $a
a=two echo $a
a=three echo $a >$a
导致

一个

一个

以及一个名为“one”且内容为“one”的已创建文件


为什么变量在第2行没有变为
two
,在第3行没有变为
two

当赋值本身用作命令时,与用作其他命令的前缀时(例如
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
仍然作为shell变量设置为“one”,因此使用该值

第三个例子,
a=three echo$a>$a
,与第二个例子非常相似。shell将
$a
s扩展为“一”(因为这是shell变量的值),然后执行
echo one
,将
a
在其环境中设置为“三”,并将输出定向到名为“一”的文件

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

  • 这将设置一个shell变量,该变量不会传递给命令的环境:

    a=one
    
  • 这将仅为该命令设置环境变量,而不为shell或更高版本的命令设置环境变量:

    b=two somecommand
    
  • 这将在shell中设置一个环境变量,以便shell可以使用该变量,并且所有后续命令都将从该shell运行:

    export c=three
    
  • 这也有同样的作用:

    d=four
    export d
    
    可以在指定shell变量之前、之后或同时将其导出到环境中

    • 在脚本上运行:

      In x.sh line 2:
      a=two echo $a
      ^-- SC2097: This assignment is only seen by the forked process.
             ^-- SC2098: This expansion will not see the mentioned assignment.
      In x.sh line 3:
      a=three echo $a >$a
      ^-- SC2097: This assignment is only seen by the forked process.
               ^-- SC2098: This expansion will not see the mentioned assignment.
               ^-- SC2094: Make sure not to read and write the same file in the same pipeline.
                   ^-- SC2094: Make sure not to read and write the same file in the same pipeline.
      
      然后查找SC。。。。代码,例如,根据需要

      在本例中,您的命令是
      var=。。。带有params的someCommand
      ,因此仅为该命令设置变量,即在该过程中

      这也是为什么带分号的第一行(
      a=one;echo$a
      )不同的原因<代码>曼巴什声明:

      命令之间用空格分隔;是按顺序执行的


      因此,您可以设置变量,然后作为两个单独的操作运行
      echo

      缺少
      a=two echo$a
      不会启动分叉进程,尽管对
      a
      的赋值在内置
      echo
      完成之前仍然是临时的。@chepner同意,但总比什么都没有好。