在 Shell 脚本中,&&
和 ||
是逻辑操作符 ,用于根据前一个命令的退出状态(成功或失败)决定是否执行后续命令。这种语法称为 命令链(Command Chaining)。
语法解析
bash
[ -d student.txt ] && echo yes || echo no
-
[ -d student.txt ]
- 这是一个条件测试命令,用于检查
student.txt
是否是一个目录 (-d
参数)。 - 如果目录存在,返回退出状态
0
(成功);否则返回非0
(失败)。
- 这是一个条件测试命令,用于检查
-
&&
(逻辑与)-
仅当左侧命令成功时(退出状态为
0
),才会执行右侧的命令。 -
示例:
bash[ -d student.txt ] && echo yes
若目录存在,则执行
echo yes
;若不存在,跳过echo yes
。
-
-
||
(逻辑或)-
仅当左侧命令失败时(退出状态非
0
),才会执行右侧的命令。 -
示例:
bash[ -d student.txt ] || echo no
若目录不存在,则执行
echo no
;若存在,跳过echo no
。
-
组合效果
-
目录存在时 :
[ -d student.txt ]
成功 → 执行&&
后的echo yes
→echo yes
成功 → 跳过||
后的echo no
。输出:
yes
-
目录不存在时 :
[ -d student.txt ]
失败 → 跳过&&
后的echo yes
→ 由于左侧整体失败,执行||
后的echo no
。输出:
no
等价于 if-else 语句
上述命令链等价于以下 if-else
结构:
bash
if [ -d student.txt ]; then
echo yes
else
echo no
fi
注意事项
-
&&
和||
的优先级
&&
的优先级高于||
,因此命令按以下分组执行:
( [ -d student.txt ] && echo yes ) || echo no
-
命令退出状态是关键
- 每个命令的退出状态决定后续操作(
0
=成功,非0
=失败)。 - 例如,若
echo yes
意外失败(极罕见),也会触发|| echo no
。
- 每个命令的退出状态决定后续操作(
其他常见用法
bash
# 1. 仅当命令成功时执行操作
rm file.txt && echo "删除成功"
# 2. 仅当命令失败时执行操作
cp a.txt b.txt || echo "复制失败"
# 3. 复杂组合(注意括号分组)
make && ( echo "编译成功"; ./app ) || echo "编译失败"
通过命令链可以简洁地实现条件逻辑,但复杂的场景建议使用 if-else
增强可读性。