Shell 判斷本質是檢查命令退出狀態碼:0 = 真 (成功),非 0 = 偽 (失敗)。if 可直接跟任意命令:
if grep -q "root" /etc/passwd; then echo "root exists"; fi | 構造 | 類型 | 特性 | 適用場景 |
|---|---|---|---|
test expr / [ expr ] | 命令/內建 | POSIX 標準,參數分詞、文件名擴展生效,需轉義 < > (重定向) | 最大兼容性,腳本移植 |
[[ expr ]] | 關鍵字 (Bash 2.02+) | 無詞分裂/路徑擴展,支持 && || < > =~ 正則,變量無需雙引號 | Bash/Zsh 專用,推薦日常使用 |
(( expr )) | 關鍵字 | 算術上下文,C 風格運算符,非零為真,支持 ++ -- ** << >> | 數值比較、計數器、位運算 |
let expr | 內建命令 | 同 (( )),但需轉義特殊字符,返回值同算術結果 | 賦值運算、簡單計算 |
# 文件測試 (test/[]) -e 存在 -f 普通文件 -d 目錄 -r/w/x 可讀/寫/執行 -s 非空 -L 符號鏈接 -nt/-ot 比較修改時間# 字符串測試 (推薦 [[) -z 空串 -n 非空 ==/!= 模式匹配 =~ 正則匹配 < / > 字典序# 數值比較 (test/[]) -eq -ne -lt -le -gt -ge# 數值比較 ((/let)) == != < <= > >= [[ ]]:安全、功能豐富、可讀性高。(( )):if (( count > 10 ))、for ((i=0;i<10;i++))。[ ]:嚴格 POSIX,避免 Bashism。[ ] 中必須雙引號:[ -n "$var" ] 防止空值語法錯誤;[[ ]] 無此要求。[[ -f $file && $size -gt 100 ]] (推薦) vs [ -f "$file" -a "$size" -gt 100 ] (舊式)。