之间有什么区别
echo "Hello " ; echo "world"
Run Code Online (Sandbox Code Playgroud)
和
echo "Hello " && echo "world"
Run Code Online (Sandbox Code Playgroud)
两者似乎都依次运行这两个命令。
hee*_*ayl 236
echo "Hello " ; echo "world"意味着echo "world"无论前一个命令的退出状态如何都运行,echo "Hello"即echo "world"无论命令成功或失败都会运行echo "Hello"。
而在 的情况下echo "Hello " && echo "world",echo "world"只有在第一个命令 ( echo "Hello") 成功(即退出状态 0)时才会运行。
以下命令给出了 shell 如何使用不同运算符处理命令链接的示例:
$ false ; echo "OK"
OK
$ true ; echo "OK"
OK
$ false && echo "OK"
$ true && echo "OK"
OK
$ false || echo "OK"
OK
$ true || echo "OK"
$
Run Code Online (Sandbox Code Playgroud)
Era*_*iel 18
Linux 中的每个命令在完成运行时都会返回一个退出代码。退出代码分配给一个特殊变量?,因此您可以轻松检查上一个命令的状态,例如通过echo $?。这通常用于脚本中。如果命令成功完成,则返回退出代码 0,而如果在执行过程中出现任何错误,则退出状态为非零。请参阅下面的示例:
$ echo "你好" 你好 $回声 $? 0 $ rm 不存在的文件 rm:无法删除“不存在的文件”:没有这样的文件或目录 $回声 $? 1
现在,这将我们引向您的问题。这&&是一个特殊的运算符,表示“仅当上一个命令成功时才执行下一个命令,即返回的退出代码为零”。还有一个反向操作符||,它仅在前一个命令失败时才执行以下命令,即以非零值退出。请参阅下面的示例:
$ echo "Hello" && echo "上一个命令成功" 你好 上一条命令成功 $ rm nonexistent-file && echo "这不会被打印" rm:无法删除“不存在的文件”:没有这样的文件或目录 $ rm 不存在的文件 || echo "但是这会显示" rm:无法删除“不存在的文件”:没有这样的文件或目录 但这将显示
编辑:问题是关于两者之间的差异&&,;所以为了这是一个完整的答案,我需要补充一点,分号只是将一个命令与另一个命令分开。不检查退出代码,所以如果你有几个用分号分隔的命令,它们只是按顺序执行,即一个接一个,彼此完全独立。
除了@heemayl 的回答之外,&&(还有||)将导致 shell 只处理所有链接命令的单个退出代码。因此,如果您有一个trap [...] ERRorset -o errexit行,它将在执行退出代码处理之前处理所有命令。