Ale*_*lls 9 shell bash variable-substitution variable assignment
如果我这样做:
SUMAN_DEBUG=foo echo $SUMAN_DEBUG
Run Code Online (Sandbox Code Playgroud)
我没有输出
但如果我这样做:
SUMAN_DEBUG=foo && echo $SUMAN_DEBUG
Run Code Online (Sandbox Code Playgroud)
然后我得到
“富”
这是为什么?
[这个答案是不正确的。问题是由于在命令行上的变量赋值之前发生了变量扩展。请参阅下面的评论。此外,这个问题被宣布为重复,原始问题中有一个很好的讨论。-gt]
SUMAN_DEBUG=foo
是一个局部变量的局部环境变量赋值,该变量只存在于它前面的命令中。在您的第二种情况下,没有命令,因为它&&
启动了一个命令列表,在您的情况下,第一个命令为空(因此环境变量没有影响命令),第二个命令已执行但没有为其设置环境变量.
您可以添加export
到赋值中,以便该变量成为全局环境变量。但是在命令列表完成后它会持续存在。
另一种选择是将整个命令列表放在括号中以在子 shell 中执行它:
(export SUMAN_DEBUG=foo && echo $SUMAN_DEBUG)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,持久性环境变量将在子外壳中设置,当子外壳完成其工作时,该环境将消失)。
有关更多信息,请参阅Bourne-again Shell 手册、列表部分和环境部分。
在命令行中,您需要使用 或 分隔;
命令&&
。空格不是 CLI 命令的分隔符。
&&
如果第一个命令成功退出(退出代码 0),则将执行第二个命令。
无论;
第一个命令的退出状态是什么,第二个命令都会被执行。
测试:
# a1;echo hello
bash: a1: command not found
hello
# a1 && echo hello
bash: a1: command not found
Run Code Online (Sandbox Code Playgroud)
在脚本中,第一个命令和第二个命令由换行符分隔\n
,bash 也可以识别该换行符。