標籤:style http color 使用 os io strong for
Shell 擷取參數的方式
寫shell指令碼的時候,往往需要從外部擷取參數,例如:
$ sh demo.sh a
那麼如何將上面的參數a傳到shell程式裡面呢。
最常用的是,$0 $1... $10,這些位置變數 其中$0是shell程式的名字,$1,$2...分別為第一個參數,第二個參數... 我們demo.sh 如下所示:
$ cat demo.sh#! /bin/bashcat << EOF Usage: sh $0 $1EOF$ sh demo.sh a Usage: sh demo.sh a
$開頭的參數有:
$0: 程式的名字
$#: 變數的個數
[email protected]:所有的變數,即:$1...$最後,不包括程式的名字
這有一個問題,當參數很多的時候,別人用你的程式時,互動性不是很好,別人還得記住指令碼每一個參數的位置和作用,會很麻煩。這時可以加提示符:例如
$ sh demo.sh -a A -b B -c C
那這個怎麼實現呢? 實現的方式有兩種 利用shift
和getopts
$ cat demo.sh #! /bin/bashwhile [ $# -gt 0 ];do case $1 in -a) echo "-a----$2" shift ;; -b) echo "-b----$2" shift ;; -c) echo "-c----$2" shift ;; esac shiftdone$ sh demo.sh -a A -b B -c C-a----A-b----B-c----C
getopts
函數則簡化上面的選項處理過程。我們下面來看看它的使用方法。
函數的第一個參數:合法選項字母的一個字串, 如果字母后面後·:
則表示必須要提供參數,這時getopts
函數會將參數放到OPTARG
中,另外一個變數是OPTIND
代表下一個待處理參數的索引值。
函數的第二個參數:變數名稱,每次getopts
被調用的時候,都會被更新,這個變數名字是沒有限制的。getopts
在找不到合法的選項的時候會將這個變數設定為一個問號。具體的實現如下所示:
#! /bin/bashwhile getopts a:b:c: opt;docase $opt ina) echo "-a ---- $OPTARG" ;;b) echo "-b ---- $OPTARG" ;;c) echo "-c ---- $OPTARG" ;;?) echo "$opt is an invalid option" ;;esacdone$ sh demo.sh -a A -b B -c C -d-a ---- A-b ---- B-c ---- Cdemo.sh: illegal option -- d --getopts輸出的錯誤資訊? is an invalid option --指令碼判斷輸出的錯誤資訊,這裡將-d option設定為了?
但是getopts並不能處理長選項,這時可以藉助getopt
,大家可以man
一下:
NAME
getopt - parse command options (enhanced)
從基本解釋可以看出,它是一個加強版的getopts
,雖然getopts
比它還多了一個s,但是論功力,還是遠遠不如getopt
。