shell指令碼中的幾個括弧總結(小括弧/大括弧/花括弧)

來源:互聯網
上載者:User

   本文來自:http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html 

     Shell的強大是毋庸置疑的,方便了我們也迷惑了我們,比如這些雜七雜八的括弧,一向自認聰明的我也傻傻分不清了,今天好哈的整理一下。
     在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命令。如下:

?
123456 $ ls a b c  $ echo
$(ls
a b c  $ echo
`ls
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支援萬用字元,*表示零個或多個任一字元,?表示零個或一個任一字元,[...]表示匹配中括弧裡面的字元,[!...]表示不匹配中括弧裡面的字元

?
1234567891011121314151617181920212223242526272829303132 [root@root shell]# var=testcase
[root@root shell]# echo $var
testcase [root@root shell]# echo ${var%s*e} 從最右邊刪除最短匹配
testca [root@root shell]# echo $var
testcase [root@root shell]# echo ${var%%s*e} 從最右邊刪除最長相符
te [root@root shell]# echo $var  變數沒有改變
testcase [root@root shell]# echo ${var#?e} 從最左邊刪除最短匹配
stcase [root@root shell]# echo $var
testcase [root@root shell]# echo ${var#*e}  從最左邊刪除最短匹配
stcase [root@root shell]# echo $var
testcase [root@root shell]# echo ${var##*e} 從最左邊刪除最長相符,即刪除所有 
[root@root shell]# echo $var
testcase [root@root shell]# echo ${var##*s} 從最左邊刪除最長相符
e [root@root shell]# echo $var
testcase [root@root shell]# echo ${var#test} 刪除test
case[root@root shell]# echo $var
testcase [root@root shell]# echo ${var#tests} 沒有匹配
testcase
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.