test 命令期望在命令列中找到一個參數,當 shell 沒有為變數賦值時,則將該變數視為空白。這意味著在處理指令碼時,一旦指令碼尋找的參數不存在,則 test 將報告該錯誤。
當試圖保護指令碼時,您可以通過將所有參數包含在雙引號中來解決這個問題。然後 shell 將變數展開,如果變數沒有值,那麼將傳遞一個空值給 test。另一種方法是在指令碼內增加一個額外檢查過程來判斷是否設定了命令列參數。如果沒有設定命令列參數,那麼指令碼會告訴使用者缺少參數,然後退出。我們會通過一些例子來更具體地說明所有這些內容。
test 和 [ 命令
雖然 Linux 和 UNIX 的每個版本中都包含 test 命令,但該命令有一個更常用的別名 — 左方括弧:[。test 及其別名通常都可以在 /usr/bin 或 /bin (取決於作業系統版本和供應商)中找到。
當您使用左方括弧而非 test 時,其後必須始終跟著一個空格、要評估的條件、一個空格和右方括弧。右方括弧不是任何東西的別名,而是表示所需評估參數的結束。條件兩邊的空格是必需的,這表示要調用 test,以區別於同樣經常使用方括弧的字元/模式比對操作。
test 和 [ 的文法如下:
test expression
[ expression ]
在這兩種情況下,test 都評估一個運算式,然後返回真或假。如果它和 if、while 或 until 命令結合使用,則您可以對程式流進行廣泛的控制。不過,您無需將 test 命令與任何其它結構一起使用;您可以從命令列直接運行它來檢查幾乎任何東西的狀態。
因為它們彼此互為別名,所以使用 test 或 [ 均需要一個運算式。運算式一般是文本、數字或檔案和目錄屬性的比較,並且可以包含變數、常量和運算子。運算子可以是字串運算子、整數運算子、檔案運算子或布林運算子 — 我們將在以下各部分依次介紹每一種運算子。
test命令用法。功能:檢查檔案和比較值
1)判斷運算式
if test (運算式為真)
if test !運算式為假
test 運算式1 –a 運算式2 兩個運算式都為真
test 運算式1 –o 運算式2 兩個運算式有一個為真
2)判斷字串
test –n 字串 字串的長度非零
test –z 字串 字串的長度為零
test 字串1=字串2 字串相等
test 字串1!=字串2 字串不等
3)判斷整數
test 整數1 –eq 整數2 整數相等
test 整數1 –ge 整數2 整數1大於等於整數2
test 整數1 –gt 整數2 整數1大於整數2
test 整數1 –le 整數2 整數1小於等於整數2
test 整數1 –lt 整數2 整數1小於整數2
test 整數1 –ne 整數2 整數1不等於整數2
4)判斷檔案
test File1 –ef File2 兩個檔案具有同樣的裝置號和i結點號
test File1 –nt File2 檔案1比檔案2 新
test File1 –ot File2 檔案1比檔案2 舊
test –b File 檔案存在並且是塊裝置檔案
test –c File 檔案存在並且是字元裝置檔案
test –d File 檔案存在並且是目錄
test –e File 檔案存在
test –f File 檔案存在並且是正規檔案
test –g File 檔案存在並且是設定了組ID
test –G File 檔案存在並且屬於有效組ID
test –h File 檔案存在並且是一個符號連結(同-L)
test –k File 檔案存在並且設定了sticky位
test –b File 檔案存在並且是塊裝置檔案
test –L File 檔案存在並且是一個符號連結(同-h)
test –o File 檔案存在並且屬於有效使用者ID
test –p File 檔案存在並且是一個具名管道
test –r File 檔案存在並且可讀
test –s File 檔案存在並且是一個通訊端
test –t FD 檔案描述符是在一個終端開啟的
test –u File 檔案存在並且設定了它的set-user-id位
test –w File 檔案存在並且可寫
test –x File 檔案存在並且可執行
每一種條件陳述式的基礎都是判斷什麼是真什麼是假。是否瞭解其工作原理將決定您編寫的是品質一般的指令碼還是您將引以為榮的指令碼。
Shell 指令碼的能力時常被低估,但實際上其能力的發揮受制於指令碼撰寫者的能力。您瞭解得越多,您就越能像變戲法似地撰寫一個檔案來使任務自動化和簡化您的管理工作。
例1.比較兩個數大小
代碼如下 |
複製代碼 |
#/bin/bash echo “please enter two number” read a read b if test $a -eq $b then echo “NO.1 = NO.2″ elif test $a -gt $b then echo “NO.1 > NO.2″ else echo “NO.1 < NO.2″ fi 例2.尋找/root/目錄下是否存在該檔案 #/bin/bash echo “enter a file name:” read a if test -e /root/$a then echo “the file is exist!” else echo “the file is not exist!” fi
|