這里介紹參數傳遞的兩種方式。
方式一:$0,$1,$2...
采用$0,$1,$2..等方式獲取腳本命令行傳入的參數
$0:腳本名稱
$1....: 參數
例子:
#編寫一個shell
$ vim test.sh
echo "參數0參數為:"$0
echo "參數1參數為:"$1
echo "參數2參數為:"$2
#執行shell傳遞兩個參數
$ bash test.sh 我是參數1 我是參數2
參數0參數為:test.sh
參數1參數為:我是參數1
參數2參數為:我是參數2
方式二:getopts
getopts引用的三個環境變量:
OPTARG: 上一個由getopts內置命令處理的選項參數的值, option argument(存放選項參數),當選項需要選項參數時,getopts 命令就將其置於變量 OPTARG 中
OPTIND: 下一個由getopts內置命令處理的參數的序號,option index,每次調用腳本它都會被初始值為1,會逐次遞增。
OPTERR: 如果設為1,bash會顯示getopts的錯誤。設為0,不顯示getopts的錯誤。
語法格式:getopts [option[:]] [DESCPRITION] VARIABLE
option:表示為某個腳本可以使用的選項
":":如果某個選項(option)后面出現了冒號(":"),則表示這個選項后面可以接參數(即一段描述信息DESCPRITION)
VARIABLE:表示將某個選項保存在變量VARIABLE中
A、前面沒有冒號:
會按照系統的定義報錯
a. 指定了非法選項,即不存在的選項,會報錯:scriptname: illegal option — p
b. 選項需要參數但沒有指定,會報錯:scriptname: : option requires an argument –
c. 不論是指定了錯誤的選項或者指定了帶選項的參數沒有指定參數,variable都設置為”?”,對應的OPTARG為出錯的選項
B、選項前面有冒號,可以屏蔽這些錯誤信息,使用自己的反饋信息
a. 當指定的參數不存在時,variable設置為”:”,對應的$OPTARG為”對應的選項”
b. 指定的選項是帶參數的而沒有提供參數,variable設置為”?”,對應的$OPTARG為”這時候的選項”
while getopts ":a:b:c:" opt
do
case $opt in
a)
echo "參數a的值$OPTARG"
;;
b)
echo "參數b的值$OPTARG"
;;
c)
echo "參數c的值$OPTARG"
;;
?)
echo "未知參數"
exit 1;;
esac
done
用一個while循環加case分支獲取不同參數,:a:b:c相當於定義參數的變量名,有時候可能會有未知參數,所以增加一個?的分支。
在shell中執行腳本,結果如下
$ bash test.sh -a 1 -c 3 -d 4
#在shell中的輸出
參數a的值1
參數c的值3
未知參數