逻辑与运算符(&&):
只有当第一个命令成功执行时才会执行第二个命令,即它的退出状态为零。此运算符可用于检查第一个命令是否已成功执行。这是命令行中最常用的命令之一。
句法:
command1 && command2
如果 command1 已成功执行,则 command2 将执行。这个运算符允许我们检查 command1 的退出状态。
分号运算符(;):
它用于一次性执行多个命令。可以使用此运算符将多个命令链接在一起。执行此运算符之后的命令将始终在其前面的命令执行后执行,而不管前面命令的退出状态如何。命令总是按顺序执行。由分号运算符分隔的命令按顺序执行,shell 依次等待每个命令终止。返回状态是最后执行的命令的退出状态。
句法:
command1 ; command2
第二个命令的执行与第一个命令的退出状态无关。如果第一个命令没有成功执行,那么第二个命令也会被执行。
AND(&&) 和 SEMI-COLON(;)运算符的区别:
&& (logical AND) operator |
; (Semi-colon) operator |
---|---|
The execution of the second command depends on the execution of the first command | The execution of the second command is independent of the execution status of the first command. |
If the exit status of the preceding command is non-zero, the succeeding command will not be executed. | Even If the exit status of the first command is non-zero, the second command will be executed. |
Allows conditional execution | Does not allow conditional execution. |
Bash has short-circuited evaluation of logical AND. | No short circuit evaluation is needed. |
Logical AND has higher precedence. | It has lesser precedence than logical AND. |
示例 1:
[ -z $b ] && b = 10
[ -z $b ] && b = 15
第一个命令检查变量 b 是否存在,如果存在,则将其初始化为 10。考虑到 b 不存在,因此第一个命令的退出状态为 0,因此执行第二个命令并使用 10 初始化 b。现在,如果我们再次尝试使用相同的命令初始化它,那么它将不会被执行,因为第一个命令的退出状态为 1,因为 b 已经存在。如果我们再次使用 echo 显示 b ,我们将获得先前初始化的值。
[ -z $b ] ; b = 10
[ -z $b ] ; b = 15
即使第一个命令的退出状态是 1,即 b 已经存在,第二个命令也将被执行并且 b 将再次用新值初始化。
示例 2:
[ -f a.txt ] && echo "file exists"
只有当前目录中存在文件时才会显示“文件存在”。当第一个命令返回 0 时,即文件存在,那么只会执行下一个命令,否则不会显示任何内容。
[ -f a.txt ] ; echo "file exists"
“文件存在”将始终显示。它与第一个命令的退出状态无关。