shell命令中的條件測試與判斷語句
1、條件測試
在shell中,條件判斷的結果與其它語言是相反的。
其它語言中當值為0時表示判斷為假,值非0時表示判斷為真。而在shell中卻是值為0時表示判斷為真,值非0時才判斷為假。
shell中的條件測試是指使用者給定一個表示式,然後判定這個表示式的值為真或假。
其實條件測試就是條件判斷的基石,只不過shell中允許條件表示式在脫離了條件關鍵字後獨立存在,所以才單獨拿出來解釋而已。
在shell中可以通過以下兩種方式來完成條件測試:
1、test命令;
2、[ 命令;
這兩種命令是等價的,可以隨意使用。
test命令的用法如下所示:
test 表示式
[ 命令雖然在只是一個單純的“標點符號”,但它在shell中確確實實可以作為一個命令使用。不過為了結構工整,在用完 [ 時一般還會要求補上一個 ] 符號。[ 命令的用法如下:
[ 表示式 ]
需要注意的是:shell中各命令之間必須用空格符隔開,[ 也是一個命令,因此在使用 [ 命令做條件測試時一定要在起始和結束符前後各加一個空格字元。
表示式中通常包含以下三種類型:
1、字串測試;
2、整數測試;
3、檔案測試;
字串測試:
運算子 | 釋義 |
string | 判斷字串string是否有值。當string中有內容時返回值0,表示真。當string不存在時返回值非0表示假。 |
string1 = string2 | 判斷兩個字串的內容是否相同。值0表示相同,非0表示不同。 |
string1 != string2 | 判斷兩個字串的內容是否不同。 |
-n string | 判斷字串string的內容是否為非空。 |
-z string | 判斷字串string的內容是否為空。與上一條相對。 |
必須要注意的是,如果測試字串時是引用變數的,則最好用雙引號將變數包圍起來,否則可能會出現奇怪的結果。
整數測試:
運算子 | 釋義 |
number1 -eq number2 | 比較兩個整數的值是否相等。如果相等,返回值為0。其運算子含義為 equal to |
number1 -ne number2 | 比較兩個整數的值是否不等。 |
number1 -gt number2 | 比較number1是否大於number2。其運算子含義為 greater than |
number1 -lt number2 | 比較number1是否小於number2。 |
number1 -ge number2 | 比較number1是否大於或等於number2。 |
number1 -le number2 | 比較number1是否小於或等於number2。 |
必須要注意的是:在shell中對整數的比較只能使用上表中的運算子而不能像其它程式語言那樣用 = 或 !=。 = 與 != 在shell中只能用於比較字串,如果對數值比較應用了這兩個運算子,則其實是將整數當成字串來比較了。
檔案測試:
運算子 | 釋義 |
-a file | 判斷指定檔案是否存在,若檔案存在,則返回值為0。 |
-b file | 判斷檔案是否存在且為二進位制檔案。 |
-c file | 判斷檔案是否存在且為普通字元檔案。 |
-d file | 判斷檔案是否存在且為目錄。 |
-e file | 與-a file相同,判斷檔案是否存在。 |
-s file | 判斷檔案的長度是否大於0。 |
-f file | 判斷檔案是否存在且為常規檔案。 |
-w file | 判斷檔案是否存在且具有寫許可權。 |
-L file | 判斷檔案是否存在且為連結檔案。 |
-u file | 判斷檔案是否設定了suid許可權位。 |
-r file | 判斷檔案是否存在且具有讀許可權。 |
-x file | 判斷檔案是否存在且具有執行許可權。 |
以上三種類型在條件測試中均可組成一個完整的表示式。但事實上shell還允許一條測試語句中包含多個表示式的情況。多個表示式之間以 -a 或 -o 來連線。 -a表示and連線,-o表示or連線。
還可以在表示式前加 ! 符表示對此表示式的結果取反。
2、條件判斷語句
條件判斷語句則是在上一節條件測試的基礎之上根據結果來選擇接下來的執行分支的語法。
與其它語言相似,shell中的條件判斷是以關鍵字 if 來表達的。只不過shell中因為在普通語句中沒有花括號,if 表示式要以 fi 表示程式碼塊結束。同時在開始比較前和表示式之後還得加以 then 關鍵字。具體如下:
if 表示式 then 語句1 語句2 fi
一般我們習慣將 if 和 then 寫在同一行。在shell中若多條語句寫在同一行,則不同語句之間須以分號隔開,如:
if 表示式; then 語句1 語句2 fi
另外,出於方便,我們還會將表示式直接以條件測試語句替換。如:
if test -n string1; then fi if [ -f file1 ]; then fi
對於多條件分支的寫法則如下所示:
if 條件測試語句1; then elif 條件測試語句2; then else fi
3、多分支判斷語句
即其它程式語言中的 switch--case 語句。shell中的語法如下:
case 表示式 in value1) 語句1 語句2 ;; value2) 語句1 語句2 ;; *) 語句1 語句2 ;; esac
shell中沒有switch關鍵字,取而代之的是直接以case關鍵字起頭,各條件分支以 值+) 的方式表示。傳統程式語言中的break關鍵字則以 ;; 替代。傳統程式語言中的default關鍵字則以 *) 替代。
4、算術運算子
shell中的算術運算子大體上與傳統程式語言一致,如加減乘除移位等。不過在shell中求冪運算的運算子為 ** ,如:3**3 的運算結果為27。
另外,在shell中直接應用算術運算子是會被解析成普通字串字面量的。要做算術運算,可以有如下兩種方式:
1、expr 命令;
2、$(()) 語句;
3、let 命令;
expr 是一個shell命令,用於計算某個表示式的值,表語法如下:
expr 表示式 #示例 result1=`expr 3 + 8` result2=`expr 4 / 8` result3=`expr 3 ** 3`
result4=`expr \( 2 + 3 \) \* 8`
$(()) 表示式會比expr自由一些,它無需使用轉義字元。語法如下:
$((表示式)) #示例 result1=$(( 3 + 9 )) result2=$(( 6 * 22 ))
let 命令可以執行一個或多個算術表示式,且若其引用變數時無須使用 $ 符。語法如下:
n=10 let n=n+4 let n=n**2