我們在
Shell腳本中,最常用的流程控制就是if比較語句了,當然你也許覺得它太小兒科,但你真的了解透徹了嗎?
最近在編寫一些測試程序的時候,對if的使用較為片面,很多小的功能都需要去各個地方百度查詢,極為不便,因此也想著空閑時候,對if進行詳細總結,一來加深印象,二來是為了打造一個if語句的最詳細的使用指南。

if?condition;
then
?commands;
fi
if?condition;
then
?commands;
else?if?condition;
then?
?commands;
else?
?commands;
fi
if語法部分不用多少,主要在于用法多樣!
算數比較包括大于、小于、等于、不等于、大于等于、小于等于
| 運算符 | 說明 | 舉例 |
|---|---|---|
| -eq | equal,檢測兩個數是否相等,相等返回 true。 | [ b ] 返回 false。 |
| -ne | not equal,檢測兩個數是否不相等,不相等返回 true。 | [ b ] 返回 true。 |
| -gt | greater than,檢測左邊的數是否大于右邊的,如果是,則返回 true。 | [ b ] 返回 false。 |
| -lt | less than,檢測左邊的數是否小于右邊的,如果是,則返回 true。 | [ b ] 返回 true。 |
| -ge | greater equal,檢測左邊的數是否大于等于右邊的,如果是,則返回 true。 | [ b ] 返回 false。 |
| -le | less ?equal,檢測左邊的數是否小于等于右邊的,如果是,則返回 true。 | [ b ] 返回 true。 |
比較條件通常被放置在封閉的中括號內。一定要注意在[或]與操作數之間有一個空格。如果忘記了這個空格,腳本就會報錯。
在算數比較運算中,少不了邏輯與、邏輯或、邏輯非運算。
| 運算符 | 說明 | 舉例 |
|---|---|---|
| ! | 非運算,表達式為 true 則返回 false,否則返回 true。 | [ ! false ] 返回 true。 |
| -o | 或運算,有一個表達式為 true 則返回 true。 | [ b -gt 100 ] 返回 true。 |
| -a | 與運算,兩個表達式都為 true 才返回 true。 | [ b -gt 100 ] 返回 false。 |
該部分主要包括:文件判斷、目錄判斷、權限判斷、是否存在判斷等
| 操作符 | 說明 | 舉例 |
|---|---|---|
| -b file | 檢測文件是否是塊設備文件,如果是,則返回 true。 | [ -b $file ] 返回 false。 |
| -c file | 檢測文件是否是字符設備文件,如果是,則返回 true。 | [ -c $file ] 返回 false。 |
| -d file | 檢測文件是否是目錄,如果是,則返回 true。 | [ -d $file ] 返回 false。 |
| -f file | 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 | [ -f $file ] 返回 true。 |
| -g file | 檢測文件是否設置了 SGID 位,如果是,則返回 true。 | [ -g $file ] 返回 false。 |
| -k file | 檢測文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。 | [ -k $file ] 返回 false。 |
| -p file | 檢測文件是否是有名管道,如果是,則返回 true。 | [ -p $file ] 返回 false。 |
| -u file | 檢測文件是否設置了 SUID 位,如果是,則返回 true。 | [ -u $file ] 返回 false。 |
| -r file | 檢測文件是否可讀,如果是,則返回 true。 | [ -r $file ] 返回 true。 |
| -w file | 檢測文件是否可寫,如果是,則返回 true。 | [ -w $file ] 返回 true。 |
| -x file | 檢測文件是否可執行,如果是,則返回 true。 | [ -x $file ] 返回 true。 |
| -s file | 檢測文件是否為空(文件大小是否大于0),不為空返回 true。 | [ -s $file ] 返回 true。 |
| -e file | 檢測文件(包括目錄)是否存在,如果是,則返回 true。 | [ -e $file ] 返回 true。 |
| -L file | 檢測文件是否是符號鏈接,如果是,則返回為true。 | [ -L $file ] 返回 true。 |
字符串操作判斷包括:是否為空、兩個字符串比較、字符串存在等
進行字符串比較時,最好用雙中括號,因為有時候采用單個中括號會產生錯誤。
| 運算符 | 說明 | 舉例 |
|---|---|---|
| = | 檢測兩個字符串是否相等,相等返回 true。 | [[ b ]] 或者 [[ b]] 返回 false。 |
| != | 檢測兩個字符串是否不相等,不相等返回 true。 | [[ b ]] 返回 true。 |
| -z | 檢測字符串長度是否為0,為0返回 true。 | [[ -z $a ]] 返回 false。 |
| -n | 檢測字符串長度是否不為 0,不為 0 返回 true。 | [[ -n "$a" ]] 返回 true。 |
| $ | 檢測字符串是否不為空,不為空返回 true。 | [[ $a ]] 返回 true。 |
| > | 按照ASCII比較兩個字符串字典排序,如果大于則為true | [[ str2 ]] |
| < | 按照ASCII比較兩個字符串字典排序,如果小于則為true | [[ str2 ]] |
test命令可以用來測試條件。用test可以避免使用過多的括號,增強代碼的可讀性。
if?[?$var?-eq?0?];?then?
?echo?"True";?
fi
if?test?$var?-eq?0?;?then?
?echo?"True";?
fi
注意,
test是一個外部程序,需要衍生出對應的進程,而[是Bash的一個內部函數,因此后者的執行效率更高。
test兼容于Bourne shell、ash、dash等

END
來源:嵌入式藝術
版權歸原作者所有,如有侵權,請聯系刪除。
▍推薦閱讀
華為C/C++編碼規范流出
分享一個開源串口神器,太強了!
短短三個月,稚暉君創業項目已獲三輪融資