天天看點

Shell IF條件判斷

1、基本文法:
if [ command ]; then
符合該條件執行的語句
fi
2、擴充文法:
if [ command ];then
符合該條件執行的語句
elif [ command ];then
符合該條件執行的語句
else
符合該條件執行的語句
fi

3、文法說明:
bash shell會按順序執行if語句,如果command執行後且它的傳回狀态是0,則會執行符合該條件執行的語句,否則後面的指令不執行,跳到下一條指令。
當有多個嵌套時,隻有第一個傳回0退出狀态的指令會導緻符合該條件執行的語句部分被執行,如果所有的語句的執行狀态都不為0,則執行else中語句。
傳回狀态:最後一個指令的退出狀态,或者當沒有條件是真的話為0。


注意:
1、[ ]表示條件測試。注意這裡的空格很重要。要注意在'['後面和']'前面都必須要有空格
2、在shell中,then和fi是分開的語句。如果要在同一行裡面輸入,則需要用分号将他們隔開。
3、注意if判斷中對于變量的處理,需要加引号,以免一些不必要的錯誤。沒有加雙引号會在一些含空格等的字元串變量判斷的時候産生錯誤。比如[ -n "$var" ]如果var為空會出錯
4、判斷是不支援浮點值的
5、如果隻單獨使用>或者<号,系統會認為是輸出或者輸入重定向,雖然結果顯示正确,但是其實是錯誤的,是以要對這些符号進行轉意
6、在預設中,運作if語句中的指令所産生的錯誤資訊仍然出現在腳本的輸出結果中
7、使用-z或者-n來檢查長度的時候,沒有定義的變量也為0
8、空變量和沒有初始化的變量可能會對shell腳本測試産生災難性的影響,是以在不确定變量的内容的時候,在測試号前使用-n或者-z測試一下
9、? 變量包含了之前執行指令的退出狀态(最近完成的前台程序)(可以用于檢測退出狀态)


常用參數:
檔案/目錄判斷:
[ -a FILE ] 如果 FILE 存在則為真。
[ -b FILE ] 如果 FILE 存在且是一個塊檔案則傳回為真。
[ -c FILE ] 如果 FILE 存在且是一個字元檔案則傳回為真。
[ -d FILE ] 如果 FILE 存在且是一個目錄則傳回為真。
[ -e FILE ] 如果 指定的檔案或目錄存在時傳回為真。
[ -f FILE ] 如果 FILE 存在且是一個普通檔案則傳回為真。
[ -g FILE ] 如果 FILE 存在且設定了SGID則傳回為真。
[ -h FILE ] 如果 FILE 存在且是一個符号符号連結檔案則傳回為真。(該選項在一些老系統上無效)
[ -k FILE ] 如果 FILE 存在且已經設定了冒險位則傳回為真。
[ -p FILE ] 如果 FILE 存并且是指令管道時傳回為真。
[ -r FILE ] 如果 FILE 存在且是可讀的則傳回為真。
[ -s FILE ] 如果 FILE 存在且大小非0時為真則傳回為真。
[ -u FILE ] 如果 FILE 存在且設定了SUID位時傳回為真。
[ -w FILE ] 如果 FILE 存在且是可寫的則傳回為真。(一個目錄為了它的内容被通路必然是可執行的)
[ -x FILE ] 如果 FILE 存在且是可執行的則傳回為真。
[ -O FILE ] 如果 FILE 存在且屬有效使用者ID則傳回為真。
[ -G FILE ] 如果 FILE 存在且預設組為目前組則傳回為真。(隻檢查系統預設組)
[ -L FILE ] 如果 FILE 存在且是一個符号連接配接則傳回為真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則傳回為真。
[ -S FILE ] 如果 FILE 存在且是一個套接字則傳回為真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在則傳回為真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在則傳回為真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的裝置和節點号則傳回為真。


字元串判斷
[ -z STRING ] 如果STRING的長度為零則傳回為真,即空是真
[ -n STRING ] 如果STRING的長度非零則傳回為真,即非空是真
[ STRING1 ]  如果字元串不為空則傳回為真,與-n類似
[ STRING1 == STRING2 ] 如果兩個字元串相同則傳回為真
[ STRING1 != STRING2 ] 如果字元串不相同則傳回為真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面則傳回為真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”後面則傳回為真。


數值判斷
[ INT1 -eq INT2 ] INT1和INT2兩數相等傳回為真 ,=
[ INT1 -ne INT2 ] INT1和INT2兩數不等傳回為真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2傳回為真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2傳回為真,>=
[ INT1 -lt INT2 ] INT1小于INT2傳回為真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2傳回為真,<=


邏輯判斷
[ ! EXPR ] 邏輯非,如果 EXPR 是false則傳回為真。
[ EXPR1 -a EXPR2 ] 邏輯與,如果 EXPR1 and EXPR2 全真則傳回為真。
[ EXPR1 -o EXPR2 ] 邏輯或,如果 EXPR1 或者 EXPR2 為真則傳回為真。
[ ] || [ ] 用OR來合并兩個條件
[ ] && [ ] 用AND來合并兩個條件


其他判斷
[ -t FD ] 如果檔案描述符 FD (預設值為1)打開且指向一個終端則傳回為真
[ -o optionname ] 如果shell選項optionname開啟則傳回為真


IF進階特性:
雙圓括号(( )):表示數學表達式
在判斷指令中隻允許在比較中進行簡單的算術操作,而雙圓括号提供更多的數學符号,而且在雙圓括号裡面的'>','<'号不需要轉意。

雙方括号[[ ]]:表示進階字元串處理函數
雙方括号中判斷指令使用标準的字元串比較,還可以使用比對模式,進而定義與字元串相比對的正規表達式。

雙括号的作用:
在shell中,[ $a != 1 || $b = 2 ]是不允許出,要用[ $a != 1 ] || [ $b = 2 ],而雙括号就可以解決這個問題的,[[ $a != 1 || $b = 2 ]]。又比如這個[ "$a" -lt "$b" ],也可以改成雙括号的形式(("$a" < "$b"))