一、邏輯運算子分類
1. 檔案與目錄偵測
| 運算子 | 用途 |
| -f | 偵測檔案存在 |
| -d | 偵測目錄存在 |
| -b | 區塊裝置 |
| -c | 字元裝置 |
| -S | Socket |
| -L | 符號連結 |
| -e | 檔案/目錄/裝置存在 |
2. 程式屬性偵測
| 運算子 | 用途 |
| -G | 有效 GID 擁有 |
| -O | 有效 UID 擁有 |
| -p | 命名管道/FIFO |
3. 檔案權限屬性
| 運算子 | 用途 |
| -r/-w/-x | 可讀/可寫/可執行 |
| -s | 非空檔案 |
| -u/-g/-k | SUID/SGID/sticky bit |
4. 兩檔案比較
| 運算子 | 含義 |
| file1 -nt file2 | file1 較新 |
| file1 -ot file2 | file1 較舊 |
| file1 -ef file2 | 同一檔案(hard link) |
5. 邏輯與比較運算子
| 運算子 | 含義 | 適用場景 |
| = / != | 等於/不等於 | 整數或字串;在 [] 中僅字串 |
| < / > | 小於/大於 | 整數比較;在 [] 中不可用(視為字串) |
| -eq/-ne/-lt/-gt/-le/-ge | 整數比較 | 整數專用 |
| -a / -o | AND / OR | 邏輯表示式內部 |
| && / || | AND / OR | 命令列或 [[]] 內部 |
| -z / -n | 空/非空字串 | 字串檢查 |
二、條件判斷式三種形式
1. test 指令
test EXPRESSION
test 1 = 1 && echo 'ok'
test -d /etc && echo 'ok'
if test 1 = 1; then echo 'ok'; fi
注意:所有運算元與運算子必須以空白分隔。
2. [] 單中括號(POSIX 標準)
[ 1 -eq 1 ] && echo 'ok'
[ 2 -gt 1 -a 3 -lt 4 ] && echo 'ok' # 使用 -a -o
[ 2 -gt 1 && 3 -lt 4 ] && echo 'ok' # 錯誤![] 不支援 && ||
在 [] 中 < > 需轉義 \< \>,且為字串比較(ASCII 碼)。
3. [[]] 雙中括號(Bash 擴充,推薦)
[[ 2 < 3 ]] && echo 'ok' # 直接支援 < >,字串比較
[[ 2 < 3 && 4 > 5 ]] && echo 'ok' # 支援 && ||
[[]] 為 [] 擴充,相容 < > 等運算子,無需轉義,仍為字串比較。
三、效能比較
$ time (for m in {1..100000}; do test -d .; done)
real 0m0.658s
$ time (for m in {1..100000}; do [ -d . ]; done)
real 0m0.609s
$ time (for m in {1..100000}; do [[ -d . ]]; done)
real 0m0.311s
結論:[[]] 最快(約為 [] 的 2 倍),功能最完整。不考慮舊版 Bash/Sh 相容性時,條件判斷首選 [[]]。