在 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 增强可读性。