在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