標籤:style blog io color ar 使用 sp 檔案 div
一、簡介
[ 與 test 等價,是 bash 的內部命令,GNU/linux 系統的 coreutils 軟體包通常帶 /usr/bin/test 和 /usr/bin/[ 命令。如果我們不用絕對路徑指 明,通常我們用的都是bash 內建的命令。
[[ 是 bash 關鍵字(據說從2.02起引入對[[的支援)
二、異同分析相同點
- 都支援算術比較 ("gt"、"ge"、"eq"、"ne"、"lt"、"le")
[email protected]:~$ [ 2 -lt 10 ]&&echo true||echo falsetrue
[email protected]:~$ [ 2 -gt 10 ]&&echo true||echo falsefalse
[email protected]:~$ [[ 2 -lt 10 ]]&&echo true||echo falsetrue
[email protected]:~$ [[ 2 -gt 10 ]]&&echo true||echo falsefalse
- 都支援字串比較("<"、">" 但具體使用有些不同)
關於字串比較。[...]、[[...]]中都可以對字串進行比較,比較的順序是"字典順序"。對ascii字元來講,碼錶中排列在前的較小,如A<B,A<a, 1<2。再強調一次,這裡只要用了"<"、">",就表示是字串比較,那麼9 > 100為真,因為這實際上等價於‘9’ > ‘100’,9在碼錶中排在1後面,所以字串"9"大於字串"100"。
[email protected]:~$ [ 2 \< 10 ]&&echo true||echo falsefalse
[email protected]:~$ [ 2 \> 10 ]&&echo true||echo falsetrue
注意逸出字元\的使用,否則bash會認為是標準輸出重新導向。
[email protected]:~$ [[ 2 < 10 ]]&&echo true||echo falsetrue
[email protected]:~$ [[ 2 > 10 ]]&&echo true||echo falsefalse
- 都支援簡單模式的匹配
[email protected]:~$ [ test = test ]&&echo true||echo falsetrue
[email protected]:~$ [ test = t*t ]&&echo true||echo falsetrue
[email protected]:~$ [ test = t..t ]&&echo true||echo falsefalse
[email protected]:~$ [ test = t??t ]&&echo true||echo falsetrue
[email protected]:~$ [[ test = test ]]&&echo true||echo falsetrue
[email protected]:~$ [[ test = t*t ]]&&echo true||echo falsetrue
[email protected]:~$ [[ test = t..t ]]&&echo true||echo falsefalse
[email protected]:~$ [[ test = t??t ]]&&echo true||echo falsetrue
模式比對類似檔案名稱的統配符的擴充規則。還要注意等號右端的模式不能用引號括起,使用引用關閉了某些元字元的特殊功能。
不同點
- 邏輯與和邏輯或
- [ 邏輯與:-a;邏輯或:-a]
[ 1 -lt 2 ]:true; [ b > a ]:true
[email protected]:~$ [ 1 -lt 2 -a b > a ]&&echo true||echo falsetrue
[email protected]:~$ [ 1 -gt 2 -a b > a ]&&echo true||echo falsefalse
[email protected]:~$ [ 1 -gt 2 -o b > a ]&&echo true||echo falsetrue
- [[ 邏輯與:&&;邏輯或:|| ]]
[ 1 -lt 2 ]:true; [ b > a ]:true
[email protected]:~$ [[ 1 -lt 2 && b > a ]]&&echo true||echo falsetrue
[email protected]:~$ [[ 1 -gt 2 && b > a ]]&&echo true||echo falsefalse
[email protected]:~$ [[ 1 -gt 2 || b > a ]]&&echo true||echo falsetrue
- 命令列參數
"[["是關鍵字,不會做命令列擴充,所以在[[中"<"與">"不需轉義,但是相對的文法就稍嚴格些。例如在[ ... ]中可以用引號括起操作符,因為在做命令列擴充時會去掉這些引號,而在[[ ... ]]則不允許這樣做
[email protected]:~$ [ "-z" "" ]&&echo true||echo falsetrue
[email protected]:~$ [[ "-z" "" ]]&&echo true||echo false-bash: conditional binary operator expected-bash: syntax error near `""‘
- 算術擴充
[[ ... ]]進行算術擴充,而[ ... ]不行,[ ... ]需要使用$(())
[email protected]:~$ [ 99+1 -eq 100 ]&&echo true||echo false-bash: [: 99+1: integer expression expectedfalse
[email protected]:~$ [ $((99+1)) -eq 100 ]&&echo true||echo falsetrue
[email protected]:~$ [[ 99+1 -eq 100 ]]&&echo true||echo falsetrue
Shell 編程基礎之 [ 與 [[ 的異同