Open Source Project Share的專欄
阿新 • • 發佈:2019-02-16
Bash shell 內建命令getopts類似於C標準庫
getopts有兩個引數,一個由字母和冒號組成的字串以及一個變數名。第一個引數是合法選項的列表;如果選項需要一個引數,那麼引數後面必須跟一個冒號。
getopts分解第一個引數,將選項提取出來,然後依次將每個選項(沒有選項前的下劃線“_”)賦值給第二個引數,第二個引數的變數名由使用者賦予。只要選項仍然在處理
getopts很返回0。但是當它處理完所有選項和引數後他返回1,這使得getopts很適合配合while迴圈來處理命令列引數
獲取UNIX型別的選項: unix有一個優點就是標準UNIX命令在執行時都具有相同的命令列格式: command -options parameters 如果在執行Shell程式也採用上述格式,Bourne Shell中提供了一條獲取和處理命令列選項的語句,即getopts語句。該語句的格式為: getopts option_string variable 其中option_string中包含一個有效的單字元選項。若getopts命令在命令列中發現了連字元,那麼它將用連字元後面的字元同option_string相比較。若有匹配,則把變數variable的值設為該選項。若無匹配,則variable設為?。當getopts發現連字元後面沒有字元,會返回一個非零的狀態值。Shell程式中可以利用getopts的返回值建立一個迴圈。 下面程式碼說明了date命令中怎麼使用getopts命令處理各種選項,該程式除了完成unix的標準命令date的功能外,還增加了許多新的選項。#新date程式
if [ $# -lt 1 ]
then
date
else
while getopts mdyDHMSTJjwahr OPTION
do
case $OPTION
in
m)date '+%m';;
d)date '+%d';;
y)date '+%y';;
D)date '+%D';;
H0date '+%H';;
M)date '+%M';;
S)date '+%S';;
T)date '+%T';;
j)date '+%j';;
J)date '+%y%j';;
w)date '+%w';;
a)date '+%a';;
h)date '+%h';;
r)date '+%r';;
\?)echo "無效的選項!$OPTION";;
esac
done
fi 有時侯選項中還帶一個值,getopts命令同樣也支援這一功能。這時需要在option_string中選項字母后加一個冒號。當getopts命令發現冒號後,會從命令列該選項後讀取該值。若該值存在,那麼將被存在一個特殊的變數OPTARG中。如果該值不存在,getopts命令將在OPTARG中存放一個問號,並且在標準錯誤輸出上顯示一條訊息。 下面的例子,實現拷貝一個檔案,並給檔案賦一個新的名字。-c選項指定程式拷貝的次數,-v選項要求顯示新建立檔案的檔名。 #--拷貝程式 COPIES=1
VERBOSE=N
while getopts vc:OPTION
do
case $OPTION
in
c)COPIES=$OPTARG;;
v)VERBOSE=Y;;
\?)echo "無效引數!"
exit 1;;
esac
done
if [ $OPTIND -gt $# ]
then
echo "No file name specified"
exit 2
fi
shift 'expr $OPTIND - 1'
FILE=$1
COPY=0
while [ $COPIES -gt $COPY ]
do
COPY='expr $COPY + 1'
cp $FILE $ {FILE} $ {COPY}
if [ VERBOSE = Y }
then
echo ${FILE} $ {COPY}
fi
done