天天看點

bash 括号(小括号,雙小括号,中括号,雙中括号,大括号)

小括号()和大括号{}

主要包括一下幾種

${var} 

$(cmd) 

()和{} 

$((exp)) 

${var:-string},${var:+string},${var:=string},${var:?string} 

$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)

注意:$(cmd)隻輸出标準輸入,如果指令執行錯誤,則無輸出

    二者都用于執行一串指令,指令之間用;分開,注意:括号内的資料重導向隻影響括号内部的指令輸入輸出,不影響括号外部的指令

    不同之處如下:

    運作方式:

1)()重新開啟一個shell運作指令,{}在目前shell運作

    文法:

1)()最後一條指令不需要; , {}最後一條指令需要;

 2)  {}第一個指令和左括号需要有空格,()不需要

下面是一個簡單的例子  

[java] view plaincopy

<span style="font-size:10px;">$ var=test   

$ (var=notest; echo $var) ###變量var值為notest,此是在子shell中有效   

notest   

$ echo $var ###父shell中值仍為test   

test   

$ { var=notest; echo $var;} ###注意左括号和var之間要有一個空格   

$ echo $var ###父shell中的var變量的值變為了notest   

$ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###輸出test1被重定向到檔案a中,   

test2 ###而test2輸出則仍輸出到标準輸出中。   

$ cat a   

test1   

$ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括号内指令的标準輸出全部被重定向到檔案a中   

test2</span>  

   例子如下

<span style="font-size:10px;">$ echo $((3+2))   

5   

$ echo $((3>2))   

1   

$ echo $((25<3 ? 2:3))   

3   

$ echo $var  

$ echo $((var=2+3))   

$ echo $var   

$ echo $((var++))   

6   

$</span>  

替換:

${var:-string} 若var為空,${var:-string}值為string  

${var:=string}

與${var:-string}功能類型,不過${var:=string}

将string值賦給var變量

判斷某個變量是否指派,沒有的話則給它賦上一個預設值  

${var:+string}的替換規則和${var:=string}相反,即隻有當var不是空的時候才替換成string,若var為空時則不替換或者說是替換成變量

var的值,即空值

比對:

${var%pattern}和${var%%pattern}表示從最右邊(即結尾)比對的

${var#pattern}

和${var##pattern}從最左邊(即開頭)比對的

中括号[]

[[]]

基本要素:

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

  内部操作符與操作變量之間要有空格:如  [  “a”  =  “b”  ]

  字元串比較中,> < 需要寫成\> \< 進行轉義

  [ ] 中字元串或者${}變量盡量使用"" 雙引号擴住,避免值未定義引用而出錯的好辦法

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

  [ ] 是bash 内置指令:[ is a shell builtin

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

  内部操作符與操作變量之間要有空格:如  [[  “a” =  “b”  ]]

  字元串比較中,可以直接使用 > < 無需轉義

  ` ` 中字元串或者${}變量盡量如未使用"" 雙引号擴住的話,會進行模式和元字元比對

[root@localhostkuohao]# [[ "ab"=a* ]] && echo "ok"

  ok

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

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

` ` 其他用法都和[ ] 一樣

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

優先級 !  >  && > || 

邏輯運算符  < 關系運算符

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

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

-----------------------------------------------------------------------------

    ①[[是 bash 程式語言的關鍵字。并不是一個指令,` ` 結構比[ ]結構更加通用。在[[和]]之間所有的字元都不會發生檔案名擴充或者單詞分割,但是會發生參數擴充和指令替換。

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

    ③使用` `.``.``.` `條件判斷結構,而不是[... ],能夠防止腳本中的許多邏輯錯誤。比如,&&、||、<和> 操作符能夠正常存在于` `條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯。

    ④bash把雙中括号中的表達式看作一個單獨的元素,并傳回一個退出狀态碼。

使用` `.``.``.` `條件判斷結構, 而不是[ ... ], 能夠防止腳本中的許多邏輯錯誤. 比如,&&, ||, <, 和> 操作符能夠正常存在于[[]]條件判斷結構中, 但是如果出現在[ ]結構中的話, 會報錯。

參考内容

小括号部分轉自:http://my.oschina.net/xiangxw/blog/11407

中括号部分轉自:http://blog.csdn.net/hittata/article/details/8049665