shell命令中的條件測試與判斷語句

2021-06-08

關鍵字:


 

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

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章