变量值不为';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
- 这也有同样的作用:
可以在指定shell变量之前、之后或同时将其导出到环境中d=four export d
- 在脚本上运行:
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
。缺少你能解释一下为什么缺少“;”吗导致跳过第一个表达式?请注意,shellcheck不会在此处给出最大的错误消息a=two echo$a
不会启动分叉进程,尽管对a
的赋值在内置echo
完成之前仍然是临时的。@chepner同意,但总比什么都没有好。