天天看點

學習Bash 參數和參數擴充

   推薦學習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是否為空,若為空則錯誤輸出指定的資訊。