生活随笔
收集整理的這篇文章主要介紹了
shell脚本中的几个括号总结(小括号/大括号/花括号)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【轉載】shell腳本中的幾個括號總結(小括號/大括號/花括號)
?
(2011-10-08 21:23:34) 轉載
▼
shell腳本中的幾個括號總結(小括號/大括號/花括號) ?????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命令。如下:
view sourceprint?
?????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@root shell]# var=testcase |
| 02 | [root@root shell]# echo $var |
| 04 | [root@root shell]# echo ${var%s*e} 從最右邊刪除最短匹配 |
| 06 | [root@root shell]# echo $var |
| 08 | [root@root shell]# echo ${var%%s*e} 從最右邊刪除最長匹配 |
| 10 | [root@root shell]# echo $var??變量沒有改變 |
| 12 | [root@root shell]# echo ${var#?e} 從最左邊刪除最短匹配 |
| 14 | [root@root shell]# echo $var |
| 16 | [root@root shell]# echo ${var#*e}??從最左邊刪除最短匹配 |
| 18 | [root@root shell]# echo $var |
| 20 | [root@root shell]# echo ${var##*e} 從最左邊刪除最長匹配,即刪除所有? |
| 21 | [root@root shell]# echo $var |
| 23 | [root@root shell]# echo ${var##*s} 從最左邊刪除最長匹配 |
| 25 | [root@root shell]# echo $var |
| 27 | [root@root shell]# echo ${var#test} 刪除test |
| 29 | [root@root shell]# echo $var |
| 31 | [root@root shell]# echo ${var#tests} 沒有匹配 |
最后的總結是:shell命令確實很強大的,但對我們的細心要求也是很高很高嘀,雙刃劍..
http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html
總結
以上是生活随笔為你收集整理的shell脚本中的几个括号总结(小括号/大括号/花括号)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。