歡迎您光臨本站 註冊首頁

詳解shell腳本[] [[]] -n -z 的含義解析

←手機掃碼閱讀     月球人 @ 2020-05-11 , reply:0

在寫腳本的時候,總是搞不懂[] [[]]的區別,這次寫一個總結,把它掌握牢固
[]和test
兩者是一樣的,在命令行裡test expr和[ expr ]的效果相同。
test的三個基本作用是判斷文件、判斷字符串、判斷整數。支持使用 ”與或非“ 將表達式連接起來。
test中可用的比較運算符只有==和!=,兩者都是用於字符串比較的,不可用於整數比較,整數比較只能使用-eq, -gt這種形式。
無論是字符串比較還是整數比較都千萬不要使用大於號小於號。當然,如果你實在想用也是可以的,對於字符串比較可以使用尖括號的轉義形式, 如果比較"ab"和"bc":[ ab < bc ],結果為真,也就是返回狀態為0.
[[ ]]
這是內置在shell中的一個命令,它就比剛才說的test強大的多了。支持字符串的模式匹配(使用=~操作符時甚至支持shell的正則表達 式)。邏輯組合可以不使用test的-a,-o而使用&& ||。
字符串比較時可以把右邊的作為一個模式(這是右邊的字符串不加雙引號的情況下。如果右邊的字符串加了雙引號,則認為是一個文本字符串。),而不僅僅是一個字符串,比如[[ hello == hell? ]],結果為真。
注意:使用[]和[[]]的時候不要吝嗇空格,每一項兩邊都要有空格,[[ 1 == 2 ]]的結果為“假”,但[[ 1==2 ]]的結果為“真”!
1. 首先,儘管很相似,但是從概念上講,二者是不同層次的東西。
"[[",是關鍵字,許多shell(如ash bsh)並不支持這種方式。ksh, bash(據說從2.02起引入對[[的支持)等支持。
"["是一條命令, 與test等價,大多數shell都支持。在現代的大多數sh實現中,"["與"test"是內部(builtin)命令,換句話說執行"test"/"["時不會調用/some/path/to/test這樣的外部命令(如果有這樣的命令的話)。
2.[[]]結構比Bash版本的[]更通用。在[[和]]之間的所有的字符都不會被文件擴展或是標記分割,但是會有參數引用和命令替換。
用[[ ... ]]測試結構比用[ ... ]更能防止腳本里的許多邏輯錯誤。比如說,&&,||,<和>操作符能在一個[[]]測試裡通過,但在[]結構會發生錯誤。
3.(( ))結構擴展並計算一個算術表達式的值。如果表達式值為0,會返回1或假作為退出狀態碼。一個非零值的表達式返回一個0或真作為退出狀態碼。這個結構和先前test命令及[]結構的討論剛好相反。
4.[ ... ]為shell命令,所以在其中的表達式應是它的命令行參數,所以串比較操作符">" 與"<"必須轉義,否則就變成IO改向操作符了(請參看上面2中的例子)。在[[中"<"與">"不需轉義;
由於"[["是關鍵字,不會做命令行擴展,因而相對的語法就稍嚴格些。例如
在[ ... ]中可以用引號括起操作符,因為在做命令行擴展時會去掉這些引號,而在[[ ... ]]則不允許這樣做。
5.[[ ... ]]進行算術擴展,而[ ... ]不做
6.[[ ... && ... && ... ]] 和 [ ... -a ... -a ...] 不一樣,[[ ]] 是邏輯短路操作,而 [ ] 不會進行邏輯短路
應用場景分析:
1、在中括號中,判斷變量的值, 加不加雙引號的問題?
-z 判斷 變量的值,是否為空; zero = 0
- 變量的值,為空,返回0,為true
- 變量的值,非空,返回1,為false
-n 判斷變量的值,是否為空 name = 名字
- 變量的值,為空,返回1,為false
- 變量的值,非空,返回0,為true
pid="123"
[ -z "$pid" ] 單對中括號變量必須要加雙引號
[[ -z $pid ]] 雙對括號,變量不用加雙引號
[ -n "$pid" ] 單對中括號,變量必須要加雙引號
[[ -z $pid ]] 雙對中括號,變量不用加雙引號
2、多個條件判斷,[] 和 [[]] 的區別?
2.1:[[ ]] 雙對中括號,是不能使用 -a 或者 -o的參數進行比較的;
&& 並且 || 或 -a 並且 -o 或者
[[ ]] 條件判斷 && 並且 || 或
[[ 5 -lt 3 || 3 -gt 6 ]] 一個條件,滿足,就成立 或者的關係
[[ 5 -lt 3 || 3 -gt 6 ]] 一個條件滿足,就成立 或者的關係
[[ 5 -lt 3 ]] || [[3 -gt 6 ]]
[[ 5 -lt 3 ]] || [[3 -gt 6 ]] 寫在外面也可以
&& 必須兩個條件同時滿足,和上述一樣,這裡想說明的問題的是:
[[ 5 -lt 3]] -o [[ 3 -gt 6 ]] [[ 5 -lt 3 -o 3 -gt 6 ]]
[[ 5 -lt 3 -a 3 -gt 6 ]] [[ 5 -lt 3 -a 3 -gt 6 ]]
-a 和 -o就不成立了,是因為,[[]] 雙對中括號,不能使用 -o和 -a的參數
直接報錯:
2.2 [ ] 可以使用 -a -o的參數,但是必須在 [ ] 中括號內,判斷條件,例如:
[ 5 -lt 3 -o 3 -gt 2 ] 或者條件成立
[5 -lt 3 ] -o [ 3 -gt 2] 或者條件, 這個不成立,因為必須在中括號內判斷
如果想在中括號外判斷兩個條件,必須用&& 和 || 比較
[5 -lt 3 ] || [ 3 -gt 2]
[5 -gt 3 ] && [ 3 -gt 2] 成立
相對的,|| 和 && 不能在中括號內使用,只能在中括號外使用
3、當判斷某個變量的值是否滿足正則表達式的時候,必須使用[[ ]] 雙對中括號
單對中括號,直接報錯。


[月球人 ] 詳解shell腳本[] [[]] -n -z 的含義解析已經有113次圍觀

http://coctec.com/docs/linux/show-post-233775.html