Classic Shell Scripting 讀書筆記 (三)
test 命令
- POSIX 將 test 的參數描述為「表達式」:
- 一元(unary)表達式:由看似一個選項(如-d)與相對應的運算數組成(基本上是一個文件名)
- 二元(binary)表達式:兩個運算數與一個內嵌的運算元組成,做某種比較操作
- test 命令有另一種形式
[ expression ]
,方括號與表達式一定要以空白隔開 -
表達式可以前置
!
表示否定
在 XSI 兼容的系統裡,-a
意義等同於 &&
; 為了可移植性,建議使用多重條件而非 -a
, -o
1 2 3 4 |
if [ -n "$str" -a -f "$file" ] # 兩種條件都會計算 if [ -n "$str" ] && [ -f "$file" ] # 以快捷方式計算 if [ -n "$str" && -f "file" ] # 錯誤的語法 |
使用 test 的訣竅
- 須有參數(避免 null),因此變量展開都要以引號括起來
- 為了可移植最大化,可以替比較字符串加上前綴 X,例如
if [ "X$answer" = "Xyes" ]
,可以避免字符串為空或開頭帶減號而混淆 test 命令 - test 是可以被愚弄的,例如
test -r a_file && cat_file
,a_file 可能會在執行 test 與執行 cat 之間改變 - 只能做整數測試
範例:檢查輸入參數
1 2 3 4 5 6 7 8 9 10 |
#! /bin/sh if [ $# -ne 1 ] then echo Usage: finduser username >&2 exit 1 fi who | grep $1 |