標籤:getopts shell指令碼參數處理 shell
intruduction
shell 指令碼有二種方法定位指令碼參數,一種是使用位置變數,二是使用getopts。使用位置參數有兩個限制,他需要編程者自己測試錯誤並建立相應的訊息。若使用shift處理參數,shift命令會刪除掉所有的參數,如果你想在以後再次訪問他們,將是不可能的。
getopts是built-in 命令,它可以方便地將命令列位置參數解析為選項並驗證選項是否有效。
getopts optstring name [args]
getopts引用的三個環境變數
OPTARG: 上一個由getopts內建命令處理的選項參數的值, option argument(存放選項參數),當選項需要選項參數時,getopts 命令就將其置於變數 OPTARG 中
OPTIND: 下一個由getopts內建命令處理的參數的序號,option index,每次呼叫指令碼它都會被初始值為1,會逐次遞增。
OPTERR: 如果設為1,bash會顯示getopts的錯誤。設為0,不顯示getopts的錯誤。
getopts 的處理過程
呼叫指令碼時,OPTIND為初始化為1。每調用一次getopts,就將下一個選項值賦給name , 選項索引值OPTIND也會指向下一個要處理選項的位置,選項參數則會賦給OPTARG
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:"
|
missoption argument
|
:
|
b
|
./getopts.sh-w
|
":ab:c:"
|
illegal options
|
?
|
w
|
./getopts.sh-a -b
|
"ab:c:"
|
missoption argument
|
?
|
unsetOPTARG
|
./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 (), [email protected]
# 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
本文出自 “Adelphos” 部落格,請務必保留此出處http://adelphos.blog.51cto.com/2363901/1573965
getopts 處理shell指令碼參數