推薦學習IBM developerWorks的這篇文章 http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html
現做如下總結:
(1). 傳遞參數
$0,$1,$2.......$N :都是位置參數,其中$0可以表示為腳本名稱(若在函數中調用則表示函數名稱)。
$* 和 $@ : 都表示除$0外的所有參數,兩者在不用雙引号包含時是1、一樣的,也就是$*和$@是等價的,使用在雙引号中擴充則不同,$*表示所有參數都作為1個單詞,且受IFS特殊變量的影響(即所有參數由IFS進行分割連接配接),而$@把
每個參數都擴充為1個單詞即"$@"等價于"$1" "$2" ..."$N".
$# :表示參數數量(不含$0)
注:Shell 腳本處理參數的方式與函數處理參數的方式相同。
(2).擷取參數的子集(子字元串)
一般形式: ${參數名稱:開始位置:長度}
注:開始位置和長度為整數,且從0開始
執行個體: x="hello world";
echo ${x:6:5} #輸出world
(3).擷取變量值的長度
一般形式:${#變量名稱}
echo ${#x} #輸出11
(4).模式比對(可以使用通配符)
[1].從左開始删除:
${變量名#要删除的字} #表示從左邊開始删除最短的比對要删除的字
${變量名##要删除的字} #表示從左邊開始删除最長的比對要删除的字
執行個體: x="a1e b1e c2 d3 e4"
echo ${x#*1} #則将a1删除,輸出為 e b1e c2 d3 e4
echo ${x##*1} #則删除a1e b1,輸出為e c2 d3 e4
[2].從右開始删除
${變量名%要删除的字} #表示從右邊開始删除最短的比對要删除的字
${變量名%%要删除的字} #表示從右邊開始删除最長的比對要删除的字
執行個體: x="a1e b1e c2 d3 e4"
echo ${x%1*} #則删除1e c2 d3 e4,輸出為a1e b
echo ${x%%1*}#則删除1e b1e c2 d3 e4,輸出為a
[3].替換字元
${變量名/要替換的字/新字} #将變量值中指定的字替換為新字,隻做1次替換
${變量名//要替換的字/新字} #将變量值中指定的字替換為新字,做所有替換
echo ${x/1/one} #輸出aonee b1e c2 d3 e4
echo ${x//1/one}#輸出為aonee bonee c2 d3 e4
(5).設定預設值
${變量名:-預設值} 若指定的變量為空或者沒有設定,則shell擴充預設值并替換結果,但是指定變量名的值沒有更改。
例如: a=${b:-Val1} #則變量$a的值為Val1而變量b還是沒有設定
${變量名:+預設值} 若指定的變量值設定且不為空則shell擴充預設值并替換結果,但是指定的變量值沒有改變。
例如: b='val1'; a=${b:+val2} #則$a值為val2而$b值為val1
${變量名:=預設值} 若指定的變量為空或者沒有設定,則shell擴充預設值并替換結果,且指定變量名的值也更改為預設值。
執行個體: a=${b:=val1} #則$a為val1且$b為val1
${變量名:?預設值} 若指定的變量為空或者沒有設定,則shell擴充預設值并将結果寫入标準錯誤中。可用于判斷變量b是否為空,若為空則錯誤輸出指定的資訊。