在運行bash命令的時候,無論成功還是失敗都會返回爲用戶返回一個執行的結果,通常把他叫做退出狀態碼,每當我們運行命令的時候,退出狀態碼都會被記錄在$?變量中,在命令行echo $?可以查看命令的執行結果,成功的值爲0,失敗的值爲1-255之間的某個值。
注:在shell腳本中,退出狀態碼記錄的是腳本最後一條命令,爲方便檢查腳本錯誤,可以使用exit #自定義退出狀態碼。
shell結構化命令中,如if...then語句、while...do...done語句等的CONDITION條件都是以命令的退出狀態碼,作爲下一條命令是否執行的依據。它們無法測試跟命令的退出狀態碼無關的條件,例如我們要判斷3是否大於5,是沒法直接用3>5作爲測試條件輸出正確結果的,因此我們就需要藉助於其它條件測試工具。
bash/shell提供了幾個好用的條件測試工具,可用於測試跟命令的退出狀態碼無關的條件,真爲0,假爲非0值。(注:與C語言中的條件真假不同,切記!)
條件測試工具有:test EXPRESSION 、[ EXPRESSION ]或` EXPRESSION `(注:EXPRESSION兩邊都要有空格,否則shell視爲語法錯誤)、命令COMMAND(COMMAND不能放在[]中,在[]內的命令要使用``引用)。
test、[]、[[]]可以用於比較(測試)三類條件:整數比較、字符串比較、文件比較。不同的測試條件,運算符盡不不相同
整數比較運算符:
字符串比較運算符:
文件測試運算符:
邏輯操作運算符:
在shell的結構化命令中,如果CONDITION條件是命令時,要先理清是要用命令的運行結果作爲測試條件還是命令的退出狀態碼作爲測試條件。若使用命令運行的結果作爲測試條件(實際上,這種情況經常被使用),那麼應要使用命令引用,然後在用比較操作符。
#!/bin/bash # 傳遞一個參數給腳本,此參數爲用戶名; # 如果用戶存在,則執行如下任務 # 如果用戶的id號小於500,顯示其爲管理員或系統用戶; # 否則,顯示其爲普通用戶; if id $1 &> /dev/null; then #要使用id -u的運行結果跟500做比較,因此先命令引用再比較操作符 if [ "`id -u $1`" -lt 500 ]; then echo "$1爲管理員或系統用戶" else echo "$1爲普通用戶" fi
如果要使用命令的退出狀態碼作爲測試條件,則要先運行命令再使用命令狀態碼,有兩種表現形式:一種是
if CMD; then ... fi
另一種是
CMD if [ $? -eq 0 ]; then ... fi
shell中允許用戶使用&&、||、!組合測試條件,進行條件測試。這三個操作符既可以用於連接[]與[],也可以用於連接命令,相當於結構化命令的使用
#!/bin/bash #用ping命令測試172.16.100.X內的所有主機 #將在線的主機輸出出來 for i in {1..255} do ping -c1 -w1 172.16.100.$i &> /dev/null [[ $? -eq 0 ]] && echo "172.16.100.$i 在線" done