[work] shell指令碼----if比較
二元比較操作符,比較變數或者比較數字.
注意數字與字串的區別.
1.整數比較
-eq 等於,如:if [ "$a" -eq "$b" ] -ne 不等於,如:if [ "$a" -ne "$b" ] -gt 大於,如:if [ "$a" -gt "$b" ] -ge 大於等於,如:if [ "$a" -ge "$b" ] -lt 小於,如:if [ "$a" -lt "$b" ] -le 小於等於,如:if [ "$a" -le "$b" ] < 小於(需要雙括號),如:(("$a" < "$b")) <= 小於等於(需要雙括號),如:(("$a" <= "$b")) > 大於(需要雙括號),如:(("$a" > "$b")) >= 大於等於(需要雙括號),如:(("$a" >= "$b"))
小資料比較可使用AWK
2.字串比較
= 等於,如:if [ "$a" = "$b" ] == 等於,如:if [ "$a" == "$b" ],與=等價
注意:
比較兩個字串是否相等的辦法是: if [ "$test"x = "test"x ]; then 這裡的關鍵有幾點: 1 使用單個等號 2 注意到等號兩邊各有一個空格:這是unix shell的要求 3 注意到"$test"x最後的x,這是特意安排的,因為當$test為空的時候,上面的表示式就變成了x = testx,顯然是不相等的。而如果沒有這個x,表示式就會報錯:[: =: unary operator expected
注意:==的功能在[[]]和[]中的行為是不同的,如下: [[ $a == z* ]] # 如果$a以"z"開頭(模式匹配)那麼將為true [[ $a == "z*" ]] # 如果$a等於z*(字元匹配),那麼結果為true
[ $a == z* ] # File globbing 和word splitting將會發生 [ "$a" == "z*" ] # 如果$a等於z*(字元匹配),那麼結果為true
一點解釋,關於File globbing是一種關於檔案的速記法,比如"*.c"就是,再如~也是. 但是file globbing並不是嚴格的正則表示式,雖然絕大多數情況下結構比較像. != 不等於,如:if [ "$a" != "$b" ] 這個操作符將在[[]]結構中使用模式匹配. < 小於,在ASCII字母順序下.如: if [[ "$a" < "$b" ]] if [ "$a" \< "$b" ] 注意:在[]結構中"<"需要被轉義. > 大於,在ASCII字母順序下.如: if [[ "$a" > "$b" ]] if [ "$a" \> "$b" ] 注意:在[]結構中">"需要被轉義. 具體參考Example 26-11來檢視這個操作符應用的例子. -z 字串為"null".就是長度為0. -n 字串不為"null" 注意: 使用-n在[]結構中測試必須要用""把變數引起來.使用一個未被""的字串來使用! -z 或者就是未用""引用的字串本身,放到[]結構中。雖然一般情況下可 以工作,但這是不安全的.習慣於使用""來測試字串是一種好習慣.
舉例:
1.數字比較
#!/bin/bash
i=6 a=10
if [ $a -eq 10 ] then echo "a = 10" fi
if [ $a -ne $i ] then echo "a != $i" fi
if [ $a -gt $i ] then echo "a > i" fi
if [ $a -lt $i ] then echo "a < i" else echo "a > i" fi
if(("$a" > "$i")) then echo "(())a>i" fi
if(($a != $i)) then echo "(())a!=i" fi
備註:通過sh執行指令碼,[ ]運算是可以的,而(())執行出錯 chmod 777 後,直接./ 執行,都可以
2.字串比較
#!/bin/bash
a="123" b="1234" c="123"
if [ "$a"x != "$b"x ] then echo "a != b" fi
if [ "$a"x = "$c"x ] then echo "a == c" fi
判斷字串為空
if [ -z "$d" ] then echo "d is empty" fi
備註:
-e 檔案存在 -a 檔案存在(已被棄用) -f 被測檔案是一個regular檔案(正常檔案,非目錄或裝置) -s 檔案長度不為0 -d 被測物件是目錄 -b 被測物件是塊裝置 -c 被測物件是字元裝置 -p 被測物件是管道 -h 被測檔案是符號連線 -L 被測檔案是符號連線 -S(大寫) 被測檔案是一個socket -t 關聯到一個終端裝置的檔案描述符。用來檢測指令碼的stdin[-t0]或[-t1]是一個終端 -r 檔案具有讀許可權,針對執行指令碼的使用者 -w 檔案具有寫許可權,針對執行指令碼的使用者 -x 檔案具有執行許可權,針對執行指令碼的使用者 -u set-user-id(suid)標誌到檔案,即普通使用者可以使用的root許可權檔案,通過chmod +s file實現 -k 設定貼上位 -O 執行指令碼的使用者是檔案的所有者 -G 檔案的group-id和執行指令碼的使用者相同 -N 從檔案最後被閱讀到現在,是否被修改
f1 -nt f2 檔案f1是否比f2新 f1 -ot f2 檔案f1是否比f2舊 f1 -ef f2 檔案f1和f2是否硬連線到同一個檔案
二元比較操作符,比較變數或比較數字
整數比較: -eq 等於 if [ "$a" -eq "$b" ] -ne 不等於 if [ "$a" -ne "$b" ] -gt 大於 if [ "$a" -gt "$b" ] -ge 大於等於 if [ "$a" -ge "$b" ] -lt 小於 if [ "$a" -lt "$b" ] -le 小於等於 if [ "$a" -le "$b" ]
< 小於(需要雙括號) (( "$a" < "$b" )) <= 小於等於(...) (( "$a" <= "$b" )) > 大於(...) (( "$a" > "$b" )) >= 大於等於(...) (( "$a" >= "$b" ))
字串比較: = 等於 if [ "$a" = "$b" ] == 與=等價 != 不等於 if [ "$a" = "$b" ] < 小於,在ASCII字母中的順序: if [[ "$a" < "$b" ]] if [ "$a" \< "$b" ] #需要對<進行轉義 > 大於
-z 字串為null,即長度為0 -n 字串不為null,即長度不為0 --------------------- 作者:知恥而後勇的蝸牛 來源:CSDN 原文:https://blog.csdn.net/yf210yf/article/details/9207147 版權宣告:本文為博主原創文章,轉載請附上博文連結!