多數情況下[]和[[]]是可以通用的,兩者的主要差異是:test或[]是符合POSIX標準的測試語句,相容性更強,幾乎可以運行在所有Shell解釋器中,相比較而言[[]]僅可運行在特定的幾個Shell解釋器中(如Bash、Zsh等)。然而,目前支持使用[[]]進行條件測試的解釋器已經足夠多了。使用[ ...
多數情況下[]
和[[]]
是可以通用的,兩者的主要差異是:test
或[]
是符合POSIX標準的測試語句,相容性更強,幾乎可以運行在所有Shell解釋器中,相比較而言[[]]
僅可運行在特定的幾個Shell解釋器中(如Bash、Zsh等)。然而,目前支持使用[[]]
進行條件測試的解釋器已經足夠多了。使用[[]]
進行測試判斷時甚至可以使用正則表達式。
主要差別:
1. 雖然[]
也支持同時進行多個條件的邏輯測試,但是在[]
中需要使用-a和-o進行邏輯與和邏輯或的比較操作,而[[]]
中可以直接使用&&和||進行邏輯比較操作,更直觀,可讀性更好。
比如:
[[ A && B ]]
或者[ A -a B ]
,意思是僅當A和B兩個條件測試都成功時,整體測試結果才為真。
[[ A || B ]]
或者[ A -o B ]
,意思是只要A或B中的任意一個條件測試成功,則整體測試結果為真。
下麵我們做幾個案例進行測試:
[root@centos7~]# [ yes == yes -a no == no ] && echo Y || echo N
Y
[root@centos7~]# [ yes == y -a no == no ] && echo Y || echo N
N
[root@centos7~]# [ yes == y -o no == no ] && echo Y || echo N
Y
[root@centos7~]# [ yes == yes -o no == no ] && echo Y || echo N
Y
[root@centos7~]# [[ yes == yes && no == no ]] && echo Y || echo N
Y
[root@centos7~]# [[ yes == y && no == no ]] && echo Y || echo N
N
[root@centos7~]# [[ yes == yes || no == no ]] && echo Y || echo N
Y
[root@centos7~]# [[ yes == y || no == no ]] && echo Y || echo N
Y
[root@centos7~]# [[ A == A && 6 -eq 6 && C == C ]]
[root@centos7~]# echo $? #返回0表示正確0
[root@centos7~]# [[ A == A && 6 -eq 3 && C == C ]]
[root@centos7~]# echo $? #返回非0表示錯誤1
2. 需要註意的還有==比較符,在[[]]
中==是模式匹配,模式匹配允許使用通配符。例如,Bash常用的通配符有*、? 、[…]等。而==在test語句中僅代表字元串的精確比較,判斷字元串是否一模一樣
[root@centos7~]# name=Xiao
[root@centos7~]# [[ $name == X* ]] && echo Y || echo N
Y
[root@centos7~]# [[ a == [a-z] ]] && echo Y || echo N
Y
[root@centos7~]# [ $name == X? ] && echo Y || echo N
N
[root@centos7~]# [ $name == X* ] && echo Y || echo N
N
[root@centos7~]# name='X*'
[root@centos7~]# [ $name == 'X*' ] && echo Y || echo N
Y
[root@centos7~]# [[ a == a ]] && echo Y || echo N
Y
[root@centos7~]# [ a == b ] && echo Y || echo N
N
3.在[[]]
中還支持使用=~進行正則匹配,而在[]
中則完全不支持正則匹配
[root@centos7~]# name="welcome to beijing"
[root@centos7~]# [[ $name =~ w ]] && echo Y || echo N
Y
[root@centos7~]# [[ $name =~ [a-z] ]] && echo Y || echo N
Y
總結:
下表列出了[[]]和[]的差異彙總信息,相同點就不再贅述了