小括号()和大括号{}
主要包括一下幾種
${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