完全總結bash中的條件判斷test [ [[ 使用


 

在bash腳本編程中,我們經常做一些條件判斷, 我們主要用到了三種,test,單中括號,雙中括號

經常有看到不同的寫法,如:

[ $? –eq 0 ]

[[ $myvar == “mysql” ]]

test 1 -eq 0

並且還有看到一些並且和或的寫法,如-a,-o,&&,||。

那這些都是怎么結合,有那么多的比較符號,我怎么記住,有什么注意事項。

 

 

1.test命令

       test是bash的一個內建命令,用來測試后面給的條件是否為真,如

[root@localhost ~]# test 1 -ne 0

[root@localhost ~]# echo $?

0

[root@localhost ~]# test "hello" == "Hello"

[root@localhost ~]# echo $?

1

 

    經常有可能我們有很多判斷需求,如判斷是否是一個文件,字符串是否為空,數值A是否大於B等,有時會記不住,怎么辦呢,方法是man test,可以看到它列出了所有的判斷符號和說明:

 

 

 

2.單個中括號[ ]判斷

    事實上事實上[ 這個是個內建命令,可以執行which [查看

    [root@localhost test]# which [

    /usr/bin/[

    即然是命令,那么命令與后面的參數就得用空格隔開,這也就是為什么在使用[時后面需要有一個空格的原因。所以[1=2]這樣的寫法將會報錯。

    單中括號與test命令是等價的。

 

3.雙個中括號[[ ]]判斷

    雙括號是不是也是個命令呢,我們也用which看下:

    [root@localhost ~]# which [[

    /usr/bin/which: no [[ in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)

    我們再用type命令看下

    [root@localhost ~]# type [[

    [[ is a shell keyword

    可以看到雙中括號是shell中的關鍵字,在這我們也用type看看test與單中括號:

[root@localhost ~]# type test [

test is a shell builtin [ is a shell builtin

 

    兩個中括號也是用來做判斷的,與單個中括號相比,從某方面來講它更安全一些,如:

    [root@localhost ~]# unset myvar

    [root@localhost ~]# if [ $myvar -eq 0 ];then echo 1;fi

    -bash: [: -eq: unary operator expected

    [root@localhost ~]# if [[ $myvar -eq 0 ]];then echo 1;fi

    1

 

    [[使用==或!=時支持字符串的模式匹配,比如[[ hello == hell? ]],結果為真。

    使用=~操作符時支持正則表達式匹配,如(注意右邊的匹配串不要加引號):

    [root@localhost ~]# [[ “234” =~ [1-9]{3} ]]

    [root@localhost ~]# echo $?

    0

    [root@localhost ~]# [[ "234" =~ "[1-9]{3}" ]]

    [root@localhost ~]# echo $?

    1

 

 

4.如何結合-o -a && || :

    因為-a與-o是test與單中括號命令的參數,而&&與||是shell中的關鍵字,所以-a與-o只能在test與單中括號使用,不能在雙中括號使用,而&&和||可以在任何情況使用,如

[root@localhost ~]# test 1 -eq 1 -a 2 -eq 2

[root@localhost ~]# echo $?

0

[root@localhost ~]# [ 1 -eq 1 ] || [ 2 -eq 3 ]

[root@localhost ~]# echo $?

0

 

 

注意雙號號下這兩種寫法都可以:

[root@localhost ~]# [[ 1 -eq 1 ]] && [[ 2 -eq 3 ]]

[root@localhost ~]# echo $?

1

[root@localhost ~]# [[ 1 -eq 1 || 2 -eq 3 ]]

[root@localhost ~]# echo $?

0

 

另外,在一些需要使用()分組的情況下,因為test與[是命令,它不解析小括號分組,所以不能在這兩個命令中使用小括號來分組

[root@localhost ~]# test ( 1 -eq 2 -o 3 -eq 3 )

-bash: syntax error near unexpected token `1'

 

 

 

5.實踐中使用建議:

A.盡量使用雙中括號來進行判斷

B.在test及單中括號使用中,如果有變量,盡量用雙引號括起來

C.與或盡量使用&&與||,而不要使用-a -o

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM