詳解shell腳本括號區別--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]

2019-07-31     波波說運維

概述

很多時候我們在寫shell腳本的時候總會碰到不同的括號,那麼這些不同的括號有什麼區別呢?


$()

用於命令交換

說明:平時腳本用的``符號也是用於命令交換的哦,和$() 的操作是一樣的


${ }

用於變量替換,這裡每次調用環境的時候是需要帶一個${ } 但是不帶也不會影響

這個定義了變量的範圍,比較不容易出錯


$[ ] --條件判斷用的比較多

用於算術計算,注意裡面出現的只有數字

如果在裡面輸出其他非數字的就報錯:


$(())

這個效果和$[ ] 差不多,兩個都是計算的


[ ]

條件表達式

這是test命令的另一種形式,但要注意:

  • 1.必須在左括號的右側和右括號的左側各加一個空格,否則會報錯。
  • 2.test命令使用標準的數學比較符號來表示字符串的比較,而用文本符號來表示數值的比較。
  • 3.大於符號或小於符號必須要轉義,否則會被理解成重定向。


[[ ]]

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

而且支持字符串的模式匹配,使用=~操作符時甚至支持shell的正則表達式。字符串比較時可以把右邊的作為一個模式,而不僅僅是一個字符串,比如[[ hello == hell? ]],結果為真。[[ ]] 中匹配字符串或通配符,不需要引號。

如果你使用[[ ... ]]條件判斷結構,而不是[ ... ],能夠防止腳本中的許多邏輯錯誤。比如,&&、||、<和> 操作符能夠正常存在於[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不適用雙括號, 則為if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

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


(())

1、整數擴展。這種擴展計算是整數型的計算,不支持浮點型。((exp))結構擴展並計算一個算術表達式的值,如果表達式的結果為0,那麼返回的退出狀態碼為1,或者 是"假",而一個非零值的表達式所返回的退出狀態碼將為0,或者是"true"。若是邏輯判斷,表達式exp為真則為1,假則為0。

2、只要括號中的運算符、表達式符合C語言運算規則,都可用在$((exp))中,甚至是三目運算符。作不同進位(如二進位、八進位、十六進位)運算時,輸出結果全都自動轉化成了十進位。如:echo $((16#5f)) 結果為95 (16進位轉十進位)

3、單純用 (( )) 也可重定義變量值,比如 a=5; ((a++)) 可將 $a 重定義為6

4、常用於算術運算比較,雙括號中的變量可以不使用$符號前綴。括號內支持多個表達式用逗號分開。 只要括號中的表達式符合C語言運算規則,比如可以直接使用for((i=0;i<5;i++)), 如果不使用雙括號, 則為for i in `seq 0 4`或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用雙括號, 則為if [ $i -lt 5 ]。


後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~


文章來源: https://twgreatdaily.com/zh-tw/Lbs_Pm0BJleJMoPMtOXQ.html