在Shell指令碼中執行使用if語句的好處是:可以根據特定的條件(eg:判斷備份目錄是否存在)來決定是否執行某項操作,當滿足不同的條件時執行不同的操作(eg:備份目錄不存在則建立該目錄,否則跳過操作)。該文將分別從條件測試操作,if語句結構,應用樣本這三個方面講解if語句在Shell指令碼中的應用。
1、條件測試操作:
需要在Shell指令碼中有選擇性地執行任務時,首先面臨的問題就是,如何設定命令執行的條件?
在Shell環境中,可以根據命令執行後返回狀態值來判斷該命令是否成功執行,當傳回值為0是表示成功執行,否則(非0值)表示執行失敗。用於特定條件運算式的測試時,可以使用Linux系統中提供的專用工具——test命令、
使用test測試命令時,可以有以下兩種形式。
test 條件運算式
【 條件運算式 】
這兩種方式的作用完全相同,但通常後一種形式更為常用,也更貼近編程習慣。需要注意的是,方括弧“[”或者“]”與條件運算式語句之間至少需要有一個空格進行分隔。
根據需要判斷的條件內容不同,條件操作也不同,最常用的條件主要包括檔案狀態測試,比較整數值大小,比較字串,以及同時判斷多個條件時的邏輯關係,下面將分別進行講解。以下主要採用方括弧的測試形式。
1.1、測試檔案狀態
檔案狀態測試是指根據給定的路徑名稱,判斷該名稱對應的是檔案還是目錄,或者判斷檔案是否可讀,可寫,可執行等。根據判斷的狀態不同,在條件運算式中需要使用不同的操作選項。
-d:測試是否為目錄(Directory)。
-e:測試目錄或檔案是否存在(Exist)。
-f:測試是否為檔案(File)。
-r:測試目前使用者是否有許可權讀取(Read)。
-w:測試目前使用者是否有許可權寫入(Write)。
-x:測試目前使用者是否可執行(Excute)該檔案。
-L:測試是否為符號串連(Link)檔案。
執行條件測試操作以後,通過預定義變數“$?”可以獲得測試命令的返回狀態值,從而能夠判斷該條件是否成立(返回0值表示條件成立,非0值表示條件不成立)。但通過這種方式查看測試結果會比較繁瑣。
例1:測試“/etc/hosts”是否是檔案,並通過“$?”變數查看返回狀態值,據此判斷測試結果。
[ -f /etc/hosts ]echo $?0 //傳回值為0,表示上一步測試的條件成立。
例2:測試“/media/cdrom/Server”及其父目錄是否存在,如果存在則顯示“YES”否則不輸出任何資訊。
[ -e /media/cdrom/Server ] && echo "YES" // 無輸出表示該目錄不 存在[ -e /media/cdrom ] && echo "YES"YES
1.2、整數值 比較:
整數值比較是指根據給定的兩個整數值,判斷第一個數是否大於、等於、小於。。。。。。第2個數,可以使用的操作選項如下:
-eq:第一個數等於(Equal)第二個數。-ne:第一個數不等於(Not Equal)第二個數。-gt:第一個數大於(Greater Than)第二個數。-lt:第一個數小於(Lesser Than)第二個數。-le:第一個數小於或等於(Lesser or Equal)第二個數。-ge:第一個數大於或等於(Greater or Equal)第二個數。
整數值比較的測試操作在Shell指令碼編寫中的應用較多,如:用於判斷磁碟使用率、登入使用者數量是否超標以及用於控制指令碼語句的迴圈次數等。
例1:測試當前登入到系統中的使用者數量是否小於或等於10,是則輸出”YES“。
who | wc -l5[ `who | wc -l` -le 10 ] && echo ”YES"YES
本欄目更多精彩內容:http://www.bianceng.cn/OS/Linux/