Shell 腳本的能力時(shí)常被低估,但實(shí)際上其能力的發(fā)揮受制于腳本撰寫(xiě)者的能力。您了解得越多,您就越能像變戲法似地撰寫(xiě)一個(gè)文件來(lái)使任務(wù)自動(dòng)化和簡(jiǎn)化您的管理工作。
在 shell 腳本中進(jìn)行的每一種操作(除最簡(jiǎn)單的命令編組之外)都需要檢查條件。所有的 shell 腳本“邏輯” — 廣義意義下的“邏輯” — 通常都可以分為以下三大類(lèi):
if {condition exists} then ...while {condition exists} do ...until {condition exists} do ...
無(wú)論隨后的操作是什么,這些基于邏輯的命令都依靠判斷一種條件是否真實(shí)存在來(lái)決定后續的操作。test命令是使得在每一種情況下都能夠確定要判斷的條件是否存在的實(shí)用工具。因此,徹底了解這個(gè)命令對于撰寫(xiě)成功的 shell 腳本至關(guān)重要。
工作原理
test 命令最短的定義可能是評估一個(gè)表達式;如果條件為真,則返回一個(gè) 0 值。如果表達式不為真,則返回一個(gè)大于 0 的值 — 也可以將其稱(chēng)為假值。檢查最后所執行命令的狀態(tài)的最簡(jiǎn)便方法是使用 $? 值。出于演示的目的,本文中的例子全部使用了這個(gè)參數。
test命令期望在命令行中找到一個(gè)參數,當 shell 沒(méi)有為變量賦值時(shí),則將該變量視為空。這意味著(zhù)在處理腳本時(shí),一旦腳本尋找的參數不存在,則test將報告該錯誤。
當試圖保護腳本時(shí),您可以通過(guò)將所有參數包含在雙引號中來(lái)解決這個(gè)問(wèn)題。然后 shell 將變量展開(kāi),如果變量沒(méi)有值,那么將傳遞一個(gè)空值給test。另一種方法是在腳本內增加一個(gè)額外檢查過(guò)程來(lái)判斷是否設置了命令行參數。如果沒(méi)有設置命令行參數,那么腳本會(huì )告訴用戶(hù)缺少參數,然后退出。我們會(huì )通過(guò)一些例子來(lái)更具體地說(shuō)明所有這些內容。
test和[命令
雖然 Linux 和 UNIX 的每個(gè)版本中都包含test命令,但該命令有一個(gè)更常用的別名 — 左方括號:[。test及其別名通常都可以在 /usr/bin 或 /bin (取決于操作系統版本和供應商)中找到。
當您使用左方括號而非test時(shí),其后必須始終跟著(zhù)一個(gè)空格、要評估的條件、一個(gè)空格和右方括號。右方括號不是任何東西的別名,而是表示所需評估參數的結束。條件兩邊的空格是必需的,這表示要調用test,以區別于同樣經(jīng)常使用方括號的字符/模式匹配操作。
test和[的語(yǔ)法如下:
test expression[ expression ]
在這兩種情況下,test都評估一個(gè)表達式,然后返回真或假。如果它和if、while或until命令結合使用,則您可以對程序流進(jìn)行廣泛的控制。不過(guò),您無(wú)需將test命令與任何其它結構一起使用;您可以從命令行直接運行它來(lái)檢查幾乎任何東西的狀態(tài)。
因為它們彼此互為別名,所以使用test或[均需要一個(gè)表達式。表達式一般是文本、數字或文件和目錄屬性的比較,并且可以包含變量、常量和運算符。運算符可以是字符串運算符、整數運算符、文件運算符或布爾運算符 — 我們將在以下各部分依次介紹每一種運算符。
test文件運算符
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/