intruductionshell
shell 腳本有二種方法定位腳本參數,一種是使用位置變量,二是使用getopts。使用位置參數有兩個限制,他須要編程者本身測試錯誤並創建相應的消息。若使用shift處理參數,shift命令會刪除掉全部的參數,若是你想在之後再次訪問他們,將是不可能的。編程
getopts是built-in 命令,它能夠方便地將命令行位置參數解析爲選項並驗證選項是否有效。bash
getopts optstring name [args]ide
getopts引用的三個環境變量測試
OPTARG: 上一個由getopts內置命令處理的選項參數的值, option argument(存放選項參數),當選項須要選項參數時,getopts 命令就將其置於變量 OPTARG 中ui
OPTIND: 下一個由getopts內置命令處理的參數的序號,option index,每次調用腳本它都會被初始值爲1,會逐次遞增。spa
OPTERR: 若是設爲1,bash會顯示getopts的錯誤。設爲0,不顯示getopts的錯誤。命令行
getopts 的處理過程設計
調用腳本時,OPTIND爲初始化爲1。每調用一次getopts,就將下一個選項值賦給name , 選項索引值OPTIND也會指向下一個要處理選項的位置,選項參數則會賦給OPTARGxml
getopts 的設計目標是在循環中運行,每執行一次,getopts就檢查下一個命令行參數,並判斷它是否有效。(即檢查參數是否以-開頭,後面跟一個包含在opstring中的字母)。
有效,則把匹配的選項字母存在指定的變量variable中,並返回退出狀態0(ture);
無效(若是-後面的字母沒有包含在options),就在 variable 中存入一個?,並返回退出狀態0;若是命令行中已經沒有參數,或者下一個參數不以-開頭,就返回不爲0的退出狀態(false, 可用於結束while 循環)。
getopts處理完全部參數後,會返回一個非0值(false,退出循環),此時OPTIND索引值指向第一個非選項的參數[args],name置爲?
getopts 錯誤處理
正確使用命令時,name用來存儲option, $OPTARG用來存放option的參數。若命令輸入有誤(選項無效,缺乏參數),getopts會處理illegal option錯誤和miss option argument錯誤。處理結果與opstring是否以:開頭而不一樣。opstring 開頭的:用於屏蔽getopts處理時的錯誤消息(腳本中將OPTERR置於0也能夠達到一樣的效果)。
使用下面的測試用例getopts.sh能夠快速驗證getopts如何處理錯誤
opstring 分別取值":ab:c:"和"ab:c:"
./getopts.sh -a -b ok -c no
./getopts.sh -a -b
./getopts.sh -w
腳本中一般使用? 捕獲錯誤,name,OPTARG對待錯誤的取值能夠用於自行定義錯誤消息的輸出。
示例 |
opstring |
錯誤類型 |
name |
OPTARG |
./getopts.sh -a -b |
":ab:c:" |
miss option argument |
: |
b |
./getopts.sh -w |
":ab:c:" |
illegal options |
? |
w |
./getopts.sh -a -b |
"ab:c:" |
miss option argument |
? |
unset OPTARG |
./getopts.sh -w |
"ab:c:" |
illegal options |
? |
unset OPTARG(取消變量) |
特殊說明
: ? 的特殊用途,故不做爲選項字符來使用
getopts 容許把選項堆疊在一塊兒(如 -ms)
opstring 包含一個能夠放在一塊兒選項字符串,若選項後帶:,表明該選項調用裏須要參數,調用這樣的選項是不能與其它選項堆疊。
同一shell 環境屢次執行getopts ,OPTIND不會被重置,從新調用參數時,必要時需手動重置OPTIND。
getopts 找到定義或未定義的選項時,都會返回0(true); 若是處理完參數,或者遇到錯誤,則返回非0值(false)
eg
cat getopts.sh
#!/bin/bash
#===============================================================================
#
# FILE: getopts.sh
#
# USAGE: ./getops.sh
#
# DESCRIPTION_:
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: Adelphos (), adelphos@msn.cn
# COMPANY:
# VERSION: 1.0
# CREATED: 11/06/2014 04:15:10 AM EST
# REVISION: ---
#===============================================================================
while getopts "ab:c:" opt
do
case ${opt} in
a) echo -e " \r
opt:\t $opt
OPTIND: \t $OPTIND \r
OPTARG: \t$OPTARG \r
OPTERR: \t $OPTERR" ;;
b) echo -e " \r
opt:\t $opt
OPTIND: \t $OPTIND \r
OPTARG: \t$OPTARG \r
OPTERR: \t $OPTERR" ;;
c) echo -e " \r
opt:\t $opt
OPTIND: \t $OPTIND \r
OPTARG: \t$OPTARG \r
OPTERR: \t $OPTERR" ;;
?) echo "usage:"
echo -e"\t -a specify the installation path"
echo -e"\t -b specify the product type which you want to install, possible choiceis ESE,CONSV,CLENT"
echo -e "\t -c specify the installpackage"
echo-e " \r
opt:\t $opt
OPTIND: \t $OPTIND \r
OPTARG: \t$OPTARG \r
OPTERR: \t $OPTERR" ;;
esac
done