linux 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,()裏的各命令沒必要和括號有空格
html

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
03 testcase
04 [root@root shell]# echo ${var%s*e} 從最右邊刪除最短匹配
05 testca
06 [root@root shell]# echo $var
07 testcase
08 [root@root shell]# echo ${var%%s*e} 從最右邊刪除最長匹配
09 te
10 [root@root shell]# echo $var  變量沒有改變
11 testcase
12 [root@root shell]# echo ${var#?e} 從最左邊刪除最短匹配
13 stcase
14 [root@root shell]# echo $var
15 testcase
16 [root@root shell]# echo ${var#*e}  從最左邊刪除最短匹配
17 stcase
18 [root@root shell]# echo $var
19 testcase
20 [root@root shell]# echo ${var##*e} 從最左邊刪除最長匹配,即刪除全部
21 [root@root shell]# echo $var
22 testcase
23 [root@root shell]# echo ${var##*s} 從最左邊刪除最長匹配
24 e
25 [root@root shell]# echo $var
26 testcase
27 [root@root shell]# echo ${var#test} 刪除test
28 case
29 [root@root shell]# echo $var
30 testcase
31 [root@root shell]# echo ${var#tests} 沒有匹配
32 testcase
shell

//---------------------分割線,下文爲筆記內容-------------------------ide

變量相關的命令spa

export, readonly命令行

export:用於修改或打印變量htm

readonly:設置變量爲只讀blog

 

替換運算符進程

${var:-word}     若是var存在且非null,返回它的值;不然返回wordcmd

${var:=word}   若是var存在且非null,返回它的值;不然將word賦值給var,並返回var的值 

${var:?word}    若是var存在且非null,返回它的值;不然顯示var:word

${var:+word}     若是var存在且非null,返回word;不然返回null

 

注:冒號(:)可省略

 

模式匹配運算符

${var#pattern}    匹配前綴(最小匹配),並返回餘下內容

${var##pattern}    匹配前綴(最大匹配),並返回餘下內容

${var%pattern}    匹配結尾(最小匹配),並返回餘下內容

${var%%pattern}    匹配結尾(最大匹配),並返回餘下內容

 

注:pattern爲正則表達式匹配

 

算術運算符

Shell的算術運算符基本上與C一致,就很少說了。

算術運算符能夠放置在$((...))裏面,也就是內嵌算術,也稱爲算術展開。譬如 echo $((2>1)) 打印結果爲1。(1表示真,0表示假)

 

特殊變量

$#    表示變量的個數,經常使用於循環

$@    當前命令行全部參數。置於雙引號中,表示個別參數

$*    當前命令行全部參數。置於雙引號中,表示將命令行全部參數當初一個單獨參數

$-(連字號)    在引用數給予Shell的選項

$?    表示上一個命令退出的狀態

$$    表示當前進程編號

$0    表示當前程序名稱

$!    表示最近一個後臺命令的進程編號

$HOME    表示當前用戶根目錄

$IFS    表示內部的字段分隔符

$LANG    當前locale默認名稱

$PATH    環境變量

$PPID    父進程編號

$PWD    當前工做目錄

 

$?的參考值

0    成功退出

>0    退出失敗

1-125    命令退出失敗,失敗返回的相關值由程序定義(譬如,程序內退出只執行 exit 2,則返回爲2)

126    命令找到了,但沒法執行

127    命令找不到

>128    命令因受到信號而死亡

相關文章
相關標籤/搜索