bash的測試和比較

2021-08-01 19:23:27 字數 2840 閱讀 9663

比較字串:[ "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 小於等於 需要雙括號 如...