原文地址:http://www.examw.com/linux/all/114976/index.html
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 指令碼的能力時常被低估,但實際上其能力的發揮受制於指令碼撰寫者的能力。您瞭解得越多,您就越能像變戲法似地撰寫一個檔案來使任務自動化和簡化您的管理工作。
在 shell 指令碼中進行的每一種操作(除最簡單的命令編組之外)都需要檢查條件。所有的 shell 指令碼“邏輯” — 廣義意義下的“邏輯” — 通常都可以分為以下三大類:
if {condition exists} then ...
while {condition exists} do ...
until {condition exists} do ...
無論隨後的操作是什麼,這些基於邏輯的命令都依靠判斷一種條件是否真實存在來決定後續的操作。test 命令是使得在每一種情況下都能夠確定要判斷的條件是否存在的工具 + 生產力。因此,徹底瞭解這個命令對於撰寫成功的 shell 指令碼至關重要。
工作原理
test 命令最短的定義可能是評估一個運算式;如果條件為真,則返回一個 0 值。如果運算式不為真,則返回一個大於 0 的值 — 也可以將其稱為假值。檢查最後所執行命令的狀態的最簡便方法是使用 $? 值。出於示範的目的,本文中的例子全部使用了這個參數。
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 檔案運算子
利用這些運算子,您可以在程式中根據對檔案類型的評估結果執行不同的操作:
-b file 如果檔案為一個塊特殊檔案,則為真
-c file 如果檔案為一個字元特殊檔案,則為真
-d file 如果檔案為一個目錄,則為真
-e file 如果檔案存在,則為真
-f file 如果檔案為一個普通檔案,則為真
-g file 如果設定了檔案的 SGID 位,則為真
-G file 如果檔案存在且歸該組所有,則為真
-k file 如果設定了檔案的粘著位,則為真
-O file 如果檔案存在並且歸該使用者所有,則為真
-p file 如果檔案為一個具名管道,則為真
-r file 如果檔案可讀,則為真
-s file 如果檔案的長度不為零,則為真
-S file 如果檔案為一個通訊端特殊檔案,則為真
-t fd 如果 fd 是一個與終端相連的開啟的檔案描述符(fd 預設為 1),則為真
-u file 如果設定了檔案的 SUID 位,則為真
-w file 如果檔案可寫,則為真
-x file 如果檔案可執行,則為真
SHELL test [命令用法(二)
2011-10-24 20:23:52| 分類:速記| 標籤:|字型大小大中小 訂閱
原文地址:http://www.examw.com/linux/all/114977/index.html
以下樣本顯示了此簡單操作的運行情況:
$ ls -l
total 33
drwxr-xr-w 2 root root 1024 Dec 5 05:05 LST
-rw-rw-rw- 1 emmett users 27360 Feb 6 07:30 evan
-rwsrwsrwx 1 root root 152 Feb 6 07:32 hannah
drwxr-xr-x 2 emmett users 1024 Feb 6 07:31 karen
-rw------- 1 emmett users 152 Feb 6 07:29 kristin
-rw-r--r-- 1 emmett users 152 Feb 6 07:29 spencer
$
$ test -r evan
$ echo $?
0
$ test -r walter
$ echo $?
1
$
由於第一次評估為真 — 檔案存在且可讀 — 傳回值為真,或 0。由於第二次評估的檔案不存在,該值為假,傳回值不為零。將值指定為零或非零很重要,因為在失敗時不會始終返回 1(雖然這是通常返回的值),可能返回一個非零值。
正如開頭所提到的,除了使用 test 外,您還可以用方括弧 [ ] 將命令括住來向 shell 發出同樣的命令 — 如下所示:
$ [ -w evan ]
$ echo $?
0
$ [ -x evan ]
$ echo $?
1
$
同樣,第一個運算式為真,第二個運算式為假 — 正如傳回值所指示的那樣。您還可以使用以下命令將兩個檔案彼此進行比較:
file1 -ef file2 測試以判斷兩個檔案是否與同一個裝置相連,是否擁有相同的 inode 編號
file1 -nt file2 測試以判斷第一個檔案是否比第二個檔案更新(由修改日期決定)
file1 -ot file2 測試以判斷第一個檔案是否比第二個檔案更舊
以下樣本顯示了使用這些運算子比較檔案的結果:
$ [ evan -nt spencer ]
$ echo $?
0
$ [ karen -ot spencer ]
$ echo $?
1
$
名為 evan 的檔案比名為 spencer 的檔案更新,因而評估為真。類似地,名為 karen 的檔案比名為 spencer 的檔案更新,因此該評估為假。
字串比較運算子
如標題所示,這組函數比較字串的值。您可以檢查它們是否存在、是否相同或者是否不同。
String 測試以判斷字串是否不為空白
-n string 測試以判斷字串是否不為空白;字串必須為 test 所識別
-z string 測試以判斷字串是否為空白;字串必須為 test 所識別
string1 = string2 測試以判斷 string1 是否與 string2 相同
string1 != string2 測試以判斷 string1 是否與 string2 不同
對任何變數進行的最有用的測試之一是判斷它的值是否不為空白,可以簡單地將其放在 test 命令列中執行這種測試,如下例所示:
$ test "$variable"
強烈建議進行此種測試時用雙引號將變數括住,以讓 shell 識別變數(即使變數為空白)。預設情況下執行的基底字元串評估和 -n 測試從功能上講是相同的,如以下樣本所示:
#example1
if test -n "$1"
then
echo "$1"
fi
執行以上例子中的代碼將根據 $1 是否存在給出以下結果:
$ example1 friday
friday
$
$ example1
$
如果將代碼更改為以下形式,則結果將相同:
#example2
if test "$1"
then
echo "$1"
fi
如下所示:
$ example2 friday
friday
$
$ example2
$
所有這些表明,通常不需要 -n,它代表預設操作。
要從一個不同的角度來查看各種可能性,您可以用另一個選項來替換 -n,並檢查該值是否為空白(相對於非空)。這可以用 -z 選項來實現,代碼為:
#example3
if test -z "$1"
then
echo "no values were specified"
fi
運行如下:
$ example3
no values were specified
$ example3 friday
$
如果在沒有命令列參數的情況下運行該程式,而運算式評估為真,那麼將執行程式塊中的文本。如果在命令列中有值,則指令碼退出,不執行任何操作。將評估操作放在指令碼的開頭非常有用,這可以在可能產生錯誤的進一步處理之前預先檢查變數值