shell腳本----[]與` `的區別與聯繫

 [  ] 單雙括號

基本要素:正則表達式

  [ ] 兩個符號左右都要有空格分隔shell

  內部操做符與操做變量之間要有空格:如  [  「a」  =  「b」  ]編程

  字符串比較中,> < 須要寫成\> \< 進行轉義bash

   [ ] 中字符串或者${}變量儘可能使用"" 雙引號擴住,避免值未定義引用而出錯的好辦法ide

  [ ] 中可使用 –a –o 進行邏輯運算ui

  [ ] 是bash 內置命令:[ is a shell builtinspa

[ ] 其實是bash 中 test 命令的簡寫。即全部的 [ expr ] 等於 test expr。字符串

 

 [[  ]] 雙方括號

 

基本要素:it

  ` ` 兩個符號左右都要有空格分隔class

  內部操做符與操做變量之間要有空格:如  [[  「a」 =  「b」  ]]

   字符串比較中,能夠直接使用 > < ,無需轉義

  ` ` 中字符串或者${}變量儘可能如未使用"" 雙引號擴住的話,會進行模式和元字符匹配,例如:若是*沒有被雙引號擴住,能夠匹配全部字符

例如:

[lxj@localhost lxjwork]$ [[ "ab"=a* ]] && echo "ok"

ok

 

  [[ ]] 內部可使用 &&  || 進行邏輯運算

  ` ` 是bash  keyword:[[ is a shell keyword

 

 

` ` 其餘用法都和[ ] 同樣

  ` ` 和 [ ] 均可以和 ! 配合使用

優先級 

 !  >  && > || 

邏輯運算符  < 關係運算符

邏輯運算符  : !  &&  || -a  -o

關係運算符  : <  >  \> \<  ==  = !=  – eq –ne  -gt -ge  –lt  -le

 

3、 比較

[[]] 運算符只是[]運算符的擴充。 [[]] 可以支持<,>符號運算不須要轉義符,[]中必須轉義:\> \< 。

 

[[]]是以字符串比較大小。裏面支持邏輯運算符:&& ||  ,再也不使用-a -o  。

 

對 test 命令來講, 用 -eq 要進行數字比較,而你此時傳入字符串,就報錯了。

 

` expr ` 是bash中真正的條件判斷語句,其語法更符合編程習慣 (好比 &&, || 的用法),在 ` ` 中 故意傳字符串給 -eq 不會報錯,bash實現中直接把非整數的字符串直接轉換成了 0 (你能夠自行驗證,在 ` ` 中的,任何須要整數,可是提供又是其它不能轉換成整數的字符串,都變成了0)。 這應該是bash實現中的沒有對 ` ` 中 -eq 操做符兩邊的內容進行檢查致使的。 對於咱們來講,不必鑽這些東西,咱們應該保證本身代碼中的須要用到整數的時候,老是提供整數。

4、 [[  ]] 比[ ] 具有的優點

①[[是 bash 程序語言的關鍵字。並非一個命令,` ` 結構比[ ]結構更加通用。在[[和]]之間全部的字符都不會發生文件名擴展或者單詞分割,可是會發生參數擴展和命令替換。

   

②支持字符串的模式匹配,使用=~操做符時甚至支持shell的正則表達式。字符串比較時能夠把右邊的做爲一個模式,而不單單是一個字符串,好比[[ hello == hell? ]],結果爲真。` ` 中匹配字符串或通配符,不須要引號。

   

③使用` `.``.``.` `條件判斷結構,而不是[... ],可以防止腳本中的許多邏輯錯誤。好比,&&、||、<和> 操做符可以正常存在於` `條件判斷結構中,可是若是出如今[ ]結構中的話,會報錯。

   

④bash把雙中括號中的表達式看做一個單獨的元素,並返回一個退出狀態碼。

       

使用` `.``.``.` `條件判斷結構, 而不是[ ... ], 可以防止腳本中的許多邏輯錯誤. 好比,&&, ||, <, 和> 操做符可以正常存在於[[]]條件判斷結構中, 可是若是出如今[ ]結構中的話, 會報錯。

相關文章
相關標籤/搜索