概述
很多時候我們在寫shell腳本的時候總會碰到不同的括號,那么這些不同的括號有什么區別呢?
$()
用於命令交換
![詳解shell腳本括號區別--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]](/image/aHR0cDovL3AxLnBzdGF0cC5jb20vbGFyZ2UvcGdjLWltYWdlLzQ4NGU3Y2VlYTI5NTRhODRhNmUxM2ZiYmI4MmVmYTVk.png)
說明:平時腳本用的``符號也是用於命令交換的哦,和$() 的操作是一樣的
![詳解shell腳本括號區別--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]](/image/aHR0cDovL3AzLnBzdGF0cC5jb20vbGFyZ2UvcGdjLWltYWdlL2FhMDg0NTIyYjBmOTQ4ZWE4OGJkM2ZiMThkYWJlMTQz.png)
${ }
用於變量替換,這里每次調用環境的時候是需要帶一個${ } 但是不帶也不會影響
![詳解shell腳本括號區別--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]](/image/aHR0cDovL3AzLnBzdGF0cC5jb20vbGFyZ2UvcGdjLWltYWdlLzM3ZmUyNDBhNmQyNzQ0MTdiMmM5MDBiZDZhZDA3NTZl.png)
這個定義了變量的范圍,比較不容易出錯
$[ ] --條件判斷用的比較多
用於算術計算,注意里面出現的只有數字
![詳解shell腳本括號區別--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]](/image/aHR0cDovL3A5LnBzdGF0cC5jb20vbGFyZ2UvcGdjLWltYWdlL2ZmYWNiMjEwYmQ4NTQxMTE5Y2E0ZDQxYWVjZTQzOWQ3.png)
如果在里面輸出其他非數字的就報錯:
![詳解shell腳本括號區別--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]](/image/aHR0cDovL3AxLnBzdGF0cC5jb20vbGFyZ2UvcGdjLWltYWdlLzc4OWNjMDZhNDI2ODQyOTk4YjM0Y2QxNjRjY2IyMjQ2.png)
$(())
這個效果和$[ ] 差不多,兩個都是計算的
![詳解shell腳本括號區別--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]](/image/aHR0cDovL3AxLnBzdGF0cC5jb20vbGFyZ2UvcGdjLWltYWdlLzYyOWI1ZGJhMmVhMjQzZDI4NTk4YmFmODIwMzY5YjU2.png)
[ ]
條件表達式
這是test命令的另一種形式,但要注意:
- 1.必須在左括號的右側和右括號的左側各加一個空格,否則會報錯。
- 2.test命令使用標准的數學比較符號來表示字符串的比較,而用文本符號來表示數值的比較。
- 3.大於符號或小於符號必須要轉義,否則會被理解成重定向。
![詳解shell腳本括號區別--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]](/image/aHR0cDovL3AxLnBzdGF0cC5jb20vbGFyZ2UvcGdjLWltYWdlL2E0OGM4YTM0MjI4NzQ4MDViOTdjNmUzMjNmYzdhNTlm.png)
[[ ]]
這個[[ ]]是 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
![詳解shell腳本括號區別--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]](/image/aHR0cDovL3AxLnBzdGF0cC5jb20vbGFyZ2UvcGdjLWltYWdlLzRhZTY3ZGQwNjM1NTQ4MzI5ZmMwODRjMWJlMzE0OTFh.png)
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 ]。