echo "Hello " ; echo "world"
有什么区别



echo "Hello " && echo "world"


两者似乎都可以运行命令彼此相继。

评论

在第二种情况下(&&),仅当且仅当echo“ Hello”返回退出状态为零时,才执行echo“ world”。

为了说明差异,请尝试测试-f / etc / passwdx && echo hello与test -f / etc / passwdx;回声你好(您可以替换所需的任何文件,现有或不存在)。

尽管我同意所引用的另一个问题在技术上可能是该问题的重复,但我认为该问题的措词对Linux的新用户有用得多,他们没有经验或知识来搜索“控制”和重定向运算符”。

gnu.org/software/bash/manual/html_node/Lists.html

#1 楼

echo "Hello " ; echo "world"意味着无论前面的命令echo "world"的退出状态如何,即echo "Hello"都将运行echo "world",无论命令echo "Hello"的成功与否,都将运行echo "Hello " && echo "world"。而对于echo "world",仅当echo "Hello"第一个命令(q4312079q)成功(即退出状态0)。

以下命令给出了Shell如何使用不同的运算符处理命令链接的示例:

$ false ; echo "OK"
OK
$ true ; echo "OK"
OK
$ false && echo "OK"
$ true && echo "OK"
OK
$ false || echo "OK"
OK
$ true || echo "OK"
$


评论


似乎没有人提到像大多数编程语言一样,“ &&”表示逻辑“ and”和“ ||”是逻辑“或”。不必评估第二个就知道“ false and what = false”,因此就不对其进行评估。这是几乎所有语言中逻辑运算符的标准行为-仅当第二个操作数的true / false值有所不同时才进行评估。副作用是,您可以编写诸如test && echo success ||之类的东西。回声失败。

–猎户座
15年2月28日在14:20



如果结果已经确定,则停止逻辑运算符评估的常见编程语言行为称为“短路”评估。

–将
16年2月10日在18:30

在按位的真实级别上-&&是乘法和||是加法运算,有助于保持操作优先级。例如true && false || true是1 * 0 +1,任何正数的结果都是真实的; 0为假

–肺炎
20-10-19在23:56



#2 楼

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

$ echo "Hello"
Hello
$ echo $?
0

$ rm nonexistent-file
rm: cannot remove ‘nonexistent-file’: No such file or directory
$ echo $?
1


现在,这使我们想到了您的问题。 &&是一个特殊的运算符,它表示``仅在上一个命令成功执行后才执行下一个命令,即以退出代码为零返回''。还有一个反向运算符||,它仅在前一个命令失败(即以非零退出)时才执行以下命令。请参见下面的示例:

$ echo "Hello" && echo "Previous command was successful"
Hello
Previous command was successful

$ rm nonexistent-file && echo "This will not be printed"
rm: cannot remove ‘nonexistent-file’: No such file or directory

$ rm nonexistent-file || echo "But this will be shown"
rm: cannot remove ‘nonexistent-file’: No such file or directory
But this will be shown


编辑:该问题是关于&&;之间的区别,因此要得到完整答案,我需要添加一个分号一个命令从另一个。不会检查退出代码,因此如果您有多个用分号分隔的命令,它们将简单地顺序执行,即一个接一个地执行,彼此完全独立。

评论


对于分号,返回状态是最后执行的命令的退出状态:gnu.org/software/bash/manual/html_node/Lists.html

–罗兰
20-4-9下午14:37

#3 楼

除了@heemayl的答案外,&&(以及||)将导致外壳程序仅处理所有链接命令的单个退出代码。因此,如果您有trap [...] ERRset -o errexit行,它将在执行退出代码处理之前处理所有命令。