基本要素:正則表達式
[ ] 兩個符號左右都要有空格分隔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
[[]] 運算符只是[]運算符的擴充。 [[]] 可以支持<,>符號運算不須要轉義符,[]中必須轉義:\> \< 。
[[]]是以字符串比較大小。裏面支持邏輯運算符:&& || ,再也不使用-a -o 。
對 test 命令來講, 用 -eq 要進行數字比較,而你此時傳入字符串,就報錯了。
` expr ` 是bash中真正的條件判斷語句,其語法更符合編程習慣 (好比 &&, || 的用法),在 ` ` 中 故意傳字符串給 -eq 不會報錯,bash實現中直接把非整數的字符串直接轉換成了 0 (你能夠自行驗證,在 ` ` 中的,任何須要整數,可是提供又是其它不能轉換成整數的字符串,都變成了0)。 這應該是bash實現中的沒有對 ` ` 中 -eq 操做符兩邊的內容進行檢查致使的。 對於咱們來講,不必鑽這些東西,咱們應該保證本身代碼中的須要用到整數的時候,老是提供整數。
①[[是 bash 程序語言的關鍵字。並非一個命令,` ` 結構比[ ]結構更加通用。在[[和]]之間全部的字符都不會發生文件名擴展或者單詞分割,可是會發生參數擴展和命令替換。
②支持字符串的模式匹配,使用=~操做符時甚至支持shell的正則表達式。字符串比較時能夠把右邊的做爲一個模式,而不單單是一個字符串,好比[[ hello == hell? ]],結果爲真。` ` 中匹配字符串或通配符,不須要引號。
③使用` `.``.``.` `條件判斷結構,而不是[... ],可以防止腳本中的許多邏輯錯誤。好比,&&、||、<和> 操做符可以正常存在於` `條件判斷結構中,可是若是出如今[ ]結構中的話,會報錯。
④bash把雙中括號中的表達式看做一個單獨的元素,並返回一個退出狀態碼。
使用` `.``.``.` `條件判斷結構, 而不是[ ... ], 可以防止腳本中的許多邏輯錯誤. 好比,&&, ||, <, 和> 操做符可以正常存在於[[]]條件判斷結構中, 可是若是出如今[ ]結構中的話, 會報錯。