shell腳本中的幾個括號總結(小括號/大括號/花括號)


from:http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html
是毋庸置疑的,方便了我們也迷惑了我們,比如這些雜七雜八的括號,一向自認聰明的我也傻傻分不清了,今天好哈的整理一下。

在Shell中的小括號,大括號結構和有括號的變量,命令的用法如下:

1.${var}
2.$(cmd)
3.()和{}
4.${var:-string},${var:+string},${var:=string},${var:?string}
5.$((exp))
6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)

現在來一一詳細介紹:
1)Shell中變量的原形
這個最常見的變量形式就是$var,打印var用命令
echo $var
可是這里有個問題:當你要顯示變量值加隨意的字符(如$varAA)時,就會出錯。系統會認為整個varAA是一個變量,這時就可以用一個大括號來限定變量名稱的范圍,如${var}AA,這樣就好了。

2)命令替換$(cmd)
命令替換$(cmd)和符號`cmd`(注意這不是單引號,在美式鍵盤上,`是ESC下面的那個鍵)有相同之處.以echo$(ls)來說明整個替換過程:shell掃描一遍命令行,發現了$(cmd)結構,便將$(cmd)中的cmd執行一次,得到其標准輸出,再將此輸出放到原來命令echo $(ls)中的$(ls)位置,即替換了$(ls),再執行echo命令。如下:

1
$ ls

2
a b c

3
$ echo $(ls)

4
a b c

5
$ echo `ls`

6
a b c

3)一串的命令執行()和{}
()和{}都是對一串的命令進行執行,但有所區別:

A,()只是對一串命令重新開一個子shell進行執行
B,{}對一串命令在當前shell執行
C,()和{}都是把一串的命令放在括號里面,並且命令之間用;號隔開
D,()最后一個命令可以不用分號
E,{}最后一個命令要用分號
F,{}的第一個命令和左括號之間必須要有一個空格
G,()里的各命令不必和括號有空格
H,()和{}中括號里面的某個命令的重定向只影響該命令,但括號外的重定向則影響到括號里的所有命令

4)幾種特殊的替換結構:${var:-string},${var:+string},${var:=string},${var:?string}

A,${var:-string}和${var:=string}:若變量var為空,則用在命令行中用string來替換${var:-string},否則變量var不為空時,則用變量var的值來替換${var:-string};對於${var:=string}的替換規則和${var:-string}是一樣的,所不同之處是${var:=string}若var為空時,用string替換${var:=string}的同時,把string賦給變量var:${var:=string}很常用的一種用法是,判斷某個變量是否賦值,沒有的話則給它賦上一個默認值。
B.${var:+string}的替換規則和上面的相反,即只有當var不是空的時候才替換成string,若var為空時則不替換或者說是替換成變量var的值,即空值。(因為變量var此時為空,所以這兩種說法是等價的)
C,${var:?string}替換規則為:若變量var不為空,則用變量var的值來替換${var:?string};若變量var為空,則把string輸出到標准錯誤中,並從腳本中退出。我們可利用此特性來檢查是否設置了變量的值。
補充擴展:在上面這五種替換結構中string不一定是常值的,可用另外一個變量的值或是一種命令的輸出。

5)POSIX標准的擴展計算:$((exp))
這種計算是符合C語言的運算符,也就是說只要符合C的運算符都可用在$((exp)),甚至是三目運算符。注意:這種擴展計算是整數型的計算,不支持浮點型.若是邏輯判斷,表達式exp為真則為1,假則為0。

6)四種模式匹配替換結構:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
第一種模式:${variable%pattern},這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最短的匹配模式
第二種模式:${variable%%pattern},這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最長的匹配模式
第三種模式:${variable#pattern}這種模式時,shell在variable中查找,看它是否一給的模式pattern開始,如果是,就從命令行把variable中的內容去掉左邊最短的匹配模式
第四種模式: ${variable##pattern}這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最長的匹配模式
這四種模式中都不會改變variable的值,其中,只有在pattern中使用了*匹配符號時,%和%%,#和##才有區別。結構中的pattern支持通配符,*表示零個或多個任意字符,?表示零個或一個任意字符,[...]表示匹配中括號里面的字符,[!...]表示不匹配中括號里面的字符

view sourceprint?

01
[root@rootshell]# var=testcase

02
[root@rootshell]# echo $var

03
testcase

04
[root@rootshell]# echo ${var%s*e}從最右邊刪除最短匹配

05
testca

06
[root@rootshell]# echo $var

07
testcase

08
[root@rootshell]# echo ${var%%s*e}從最右邊刪除最長匹配

09
te

10
[root@rootshell]# echo $var 變量沒有改變

11
testcase

12
[root@rootshell]# echo ${var#?e}從最左邊刪除最短匹配

13
stcase

14
[root@rootshell]# echo $var

15
testcase

16
[root@rootshell]# echo${var#*e}  從最左邊刪除最短匹配

17
stcase

18
[root@rootshell]# echo $var

19
testcase

20
[root@rootshell]# echo ${var##*e}從最左邊刪除最長匹配,即刪除所有

21
[root@rootshell]# echo $var

22
testcase

23
[root@rootshell]# echo ${var##*s}從最左邊刪除最長匹配

24
e

25
[root@rootshell]# echo $var

26
testcase

27
[root@rootshell]# echo ${var#test}刪除test

28
case

29
[root@rootshell]# echo $var

30
testcase

31
[root@rootshell]# echo ${var#tests}沒有匹配

32
testcase


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM