在 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
}
掌握 ||
和 &&
的區別后,可以顯著提升腳本的簡潔性和健壯性。