在 Bash 中,||
和 &&
是两种常用的逻辑操作符,用于控制命令的执行流程。它们的核心区别如下:
1. ||
(逻辑 OR)
- 作用:如果前一个命令失败(返回非零退出码),则执行后一个命令。
- 记忆口诀:
||
像"否则"(前面的失败了,就执行后面的)。 - 示例:
[ -d "/backup" ] || mkdir -p "/backup"
- 如果
/backup
不存在([ -d ]
返回非零),则执行mkdir -p
。 - 如果
/backup
已存在([ -d ]
返回零),跳过mkdir
。
- 如果
2. &&
(逻辑 AND)
- 作用:如果前一个命令成功(返回零退出码),则执行后一个命令。
- 记忆口诀:
&&
像"而且"(前面的成功了,才执行后面的)。 - 示例:
[ -f "/data/file.txt" ] && rm "/data/file.txt"
- 如果
/data/file.txt
存在([ -f ]
返回零),则删除它。 - 如果文件不存在(
[ -f ]
返回非零),跳过rm
。
- 如果
对比表格
操作符 | 名称 | 执行条件 | 典型用途 | 类比编程语言 |
---|---|---|---|---|
` | ` | 逻辑 OR | 前一个命令失败时执行 | |
&& | 逻辑 AND | 前一个命令成功时执行 | 条件执行、链式操作 | if (cmd) |
实际应用场景
场景 1:依赖前序命令成功
# 只有 cd 成功时,才执行后续操作
cd "/project" && ./build.sh
场景 2:错误恢复
# 如果 ping 失败,尝试 curl 检测网络
ping -c1 google.com || curl -s ifconfig.me
场景 3:组合使用
# 如果目录不存在则创建,且只有创建成功时才写入文件
[ -d "/log" ] || mkdir "/log" && echo "Log started" >> "/log/app.log"
注意事项
-
退出码决定流程:
- 命令的退出码
0
表示成功,非0
表示失败。 - 可通过
$?
查看上一个命令的退出码:ls /nonexistent echo $? # 输出 2(表示失败)
- 命令的退出码
-
与
;
的区别:cmd1 ; cmd2
:无论cmd1
是否成功,都会执行cmd2
。cmd1 && cmd2
:只有cmd1
成功时才执行cmd2
。
-
避免过度嵌套:
# 难以阅读的写法 [ -f file ] && grep "pattern" file || echo "Not found"# 更清晰的写法 if [ -f file ]; thengrep "pattern" file elseecho "Not found" fi
经典用例
1. 快速条件判断
# 只有是 root 用户时才执行操作
[ "$(id -u)" -eq 0 ] && echo "Running as root" || echo "Need root"
2. 链式检查
# 检查依赖命令是否存在
command -v git &>/dev/null && \command -v docker &>/dev/null && \echo "All dependencies installed" || \echo "Missing dependencies"
3. 错误处理
# 如果备份失败,记录日志并退出
tar -czf backup.tar.gz /data || {echo "[ERROR] Backup failed" >> /var/log/backup.logexit 1
}
掌握 ||
和 &&
的区别后,可以显著提升脚本的简洁性和健壮性。