比較字串:[ "string1" = "string2" ] 等價於 [ "string1" == "string2" ]
比較整數:[ "num1" -eq "num2" ] 等價於 (( "num1" == "num2" ))
變數值不為空,且變數值中不包含空格的情況下,變數可不加雙引號,當然加了雙引號也可以
變數值為空或變數值中包含空格的情況下,變數一定要加雙引號
或變數沒有申明,比如unset var,引用$var,就一定要加雙引號
所以把變數統一加上雙引號是個明智的選擇
[ <...> -a <...> ] 等價於 [ <...> ] && [ <...> ] 等價於 [[ <...> && <...> ]]
[ <...> -o <...> ] 等價於 [ <...> ] || [ <...> ] 等價於 [[ <...> || <...> ]]
linux shell 裡面比較字元寫法:
-eq
等於-ne
不等於-gt
大於-lt
小於-le
小於等於
-ge
大於等於
-z
空串
= 兩個字元相等
!= 兩個字元不等
-n
非空串
通過 < 或 > 測試第乙個字串是否排在第二個字串的前邊或後邊,通過一元操作符 - z測試字串是否為空,而一元操作符 -n 或不加操作符則當字串為非空時返回真值。
注意:< 和 > 這兩個符號同時也是用來做shell重定向,所以你必須通過 \< 和 \> 來反轉它的意思。如下列表給出了更多的字元測試的例子。檢驗一下是不是你所期望樣子。
[ian@pinguino ~]$ test"abc" = "def" ;echo $?
1[ian@pinguino ~]$ [ "abc" != "def" ];echo $?
0[ian@pinguino ~]$ [ "abc" \< "def" ];echo $?
0[ian@pinguino ~]$ [ "abc" \> "def" ];echo $?
1[ian@pinguino ~]$ [ "abc" \<"abc" ];echo $?
1[ian@pinguino ~]$ [ "abc" \> "abc" ];echo $?
1
關於中的= == 號兩邊一定要留空格的原因,用下例來說明:
#[ a=b ] && echo ok
ok咦,為什麼會列印出ok?bash會把a=b理解賦值操作,賦值操作永遠為真
#[ a==b ] && ok
ok同理a==b可以理解為a="=b"賦值操作
[root@liyao ~]# a=3
[root@liyao ~]# [ "$a" -eq 3 ] echo 1 || echo 0
-bash: [: missing `]' # 這裡為什麼錯了呢?那是因為判斷完成之後是要輸出結果才能去執行下面的命令的0
[root@liyao ~]# [ "$a" -eq 3 ] && echo 1 || echo 0
1[root@liyao ~]# (("$a" == 3)) && echo 1 || echo 0
1[root@liyao ~]# [ "$a" -eq "3" ] && echo 1 || echo 0
1設定變數為空值
a. var=』』
[root@liyao ~]# var=''
[root@liyao ~]# echo $var
b. abc=""
[root@liyao ~]# abc=""
[root@liyao ~]# echo $abc
c. bao=
[root@liyao ~]# echo $bao
[root@liyao ~]# var=
[root@liyao ~]# [ -n $var ] && echo ok
ok#這個結果錯得很明顯,為什麼呢?[ -n $var ]是先進行了$var變數替換後再進行test測試,變數替換後也就變成了[ -n ],這是個空判斷,為真
[root@liyao ~]# [ -n "$var" ] && echo ok
# 這樣才是正確的結果呀!
注意[ -n "" ]與[ -n " " ]是不一樣的,[ -n " " ]為真," "是乙個空格,它與空值不一樣
let 命令也可以執行乙個或多個算術表示式。它常常用來給算術變數
賦值。像 (( )) 一樣復合命令 [[ ]] 允許你使用更自然的語法對檔案或字串進行測試。你也可以通過括號和邏輯操作符連線多個測試。
當使用 = 或 != 時 [[ 復合命令也可以針對字串執行模式匹配操作,針對萬用字元的匹配如列表7所示。
列表7. 通過 [[ 做匹配test
s
[ian@pinguino ~]$ [[ "abc def .d,x--" == a[abc]*\ ?d* ]]; echo $?0[ian@pinguino ~]$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?
1[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?
1
你甚至也可以通過 [[ 執行算術操作,但是請謹慎,只有是在 (( 復合命令中,< 和 > 操作符會把字串作為操作物件測試其對應的次序前後。
Bash 測試和比較函式
您是否為 bash shell 中大量的測試和比較選項而困惑呢?這個技巧可以幫助您解密不同型別的檔案 算術和字串測試,這樣您就能夠知道什麼時候使用test 或if then else了。bash shell 在當今的許多 linux 和 unix 系統上都可使用,是 linux 上常見的預設 she...
比較bash和perl的比較運算子(糾結)
bash 整數比較 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 小於等於 需要雙括號 如...
比較bash和perl的比較運算子(糾結)
bash 整數比較 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 小於等於 需要雙括號 如...