分号和双&&&有什么区别

lin*_*dhe 200 shell

之间有什么区别

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)

  • 似乎没有人提到大多数编程语言中的“&&”表示逻辑“与”和“||” 是逻辑“或”。第二个不需要被评估来知道“false *and*whatever = false”,所以它只是不被评估。这是几乎所有语言中逻辑运算符的标准化行为 - 只有在其真/假值有所不同时才评估第二个操作数。副作用是,您可以编写诸如`test && echo success || 之类的东西 回声失败`。 (49认同)
  • 如果结果已经确定,则停止对逻辑运算符求值的常见编程语言行为称为 [“短路”求值](https://en.wikipedia.org/wiki/Short-circuit_evaluation)。 (12认同)

Era*_*iel 18

Linux 中的每个命令在完成运行时都会返回一个退出代码。退出代码分配给一个特殊变量?,因此您可以轻松检查上一个命令的状态,例如通过echo $?。这通常用于脚本中。如果命令成功完成,则返回退出代码 0,而如果在执行过程中出现任何错误,则退出状态为非零。请参阅下面的示例:

$ echo "你好"
你好
$回声 $?
0

$ rm 不存在的文件
rm:无法删除“不存在的文件”:没有这样的文件或目录
$回声 $?
1

现在,这将我们引向您的问题。这&&是一个特殊的运算符,表示“仅当上一个命令成功时才执行下一个命令,即返回的退出代码为零”。还有一个反向操作符||,它仅在前一个命令失败时才执行以下命令,即以非零值退出。请参阅下面的示例:

$ echo "Hello" && echo "上一个命令成功"
你好
上一条命令成功

$ rm nonexistent-file && echo "这不会被打印"
rm:无法删除“不存在的文件”:没有这样的文件或目录

$ rm 不存在的文件 || echo "但是这会显示"
rm:无法删除“不存在的文件”:没有这样的文件或目录
但这将显示

编辑:问题是关于两者之间的差异&&;所以为了这是一个完整的答案,我需要补充一点,分号只是将一个命令与另一个命令分开。不检查退出代码,所以如果你有几个用分号分隔的命令,它们只是按顺序执行,即一个接一个,彼此完全独立。

  • 使用分号返回状态是执行的最后一个命令的退出状态:https://www.gnu.org/software/bash/manual/html_node/Lists.html (2认同)

l0b*_*0b0 8

除了@heemayl 的回答之外&&(还有||)将导致 shell 只处理所有链接命令的单个退出代码。因此,如果您有一个trap [...] ERRorset -o errexit行,它将在执行退出代码处理之前处理所有命令。