shell getopts
???下面的例子可參考:
>cat test4
#!/bin/bash
while getopts "ab:cd:" Option
# b and d take arguments
#
do
case $Option in
a) echo -e "a = $OPTIND";;
b) echo -e "b = $OPTIND $OPTARG";;
c) echo -e "c = $OPTIND";;
d) echo -e "d = $OPTIND $OPTARG";;
esac
done
shift $(($OPTIND - 1))
>sh test4 -a -b foo -cd bar
a = 2
b = 4 foo
c = 4
d = 6 bar
>sh test4 -ab foo
a = 1
b = 3 foo
>sh test4 -a -c
a = 2
c = 3
?
getopts (Shell內(nèi)置命令)
處理命令行參數(shù)是一個(gè)相似而又復(fù)雜的事情,為此,C提供了getopt/getopt_long等函數(shù),C++的boost提供了Options庫(kù),在shell中,處理此事的是getopts和getopt.
先說(shuō)一下getopts/getopt的區(qū)別吧,getopt是個(gè)外部binary文件,而getopts是shell builtin。
| [admin@intlqa142055x ~]$ type getopt getopt is /usr/bin/getopt [admin@intlqa142055x ~]$ type getopts getopts is a shell builtin |
關(guān)于getopts的使用方法,可以man bash??搜索getopts
getopts 有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)字符串,包括字符和“:”,每一個(gè)字符都是一個(gè)有效的選項(xiàng),如果字符后面帶有“:”,表示這個(gè)字符有自己的參數(shù)。 getopts從命令中獲取這些參數(shù),并且刪去了“-”,并將其賦值在第二個(gè)參數(shù)中,如果帶有自己參數(shù),這個(gè)參數(shù)賦值在“OPTARG”中。提供getopts的shell內(nèi)置了OPTARG這個(gè)變變,getopts修改了這個(gè)變量。
這里變量$OPTARG存儲(chǔ)相應(yīng)選項(xiàng)的參數(shù),而$OPTIND總是存儲(chǔ)原始$*中下一個(gè)要處理的元素位置。
while getopts ":a:bc" opt??#第一個(gè)冒號(hào)表示忽略錯(cuò)誤;字符后面的冒號(hào)表示該選項(xiàng)必須有自己的參數(shù)
代碼實(shí)例(getopts.sh):
| echo $* while getopts ":a:bc" opt do ????????case $opt in ????????????????a ) echo $OPTARG ????????????????????echo $OPTIND;; ????????????????b ) echo "b $OPTIND";; ????????????????c ) echo "c $OPTIND";; ????????????????? ) echo "error" ????????????????????exit 1;; ????????esac done echo $OPTIND shift $(($OPTIND - 1)) #通過(guò)shift $(($OPTIND - 1))的處理,$*中就只保留了除去選項(xiàng)內(nèi)容的參數(shù),可以在其后進(jìn)行正常的shell編程處理了。 echo $0 echo $* |
-a 11 -b -c
11
3
b 4
c 5
5
./getopts.sh
?
獲取UNIX類(lèi)型的選項(xiàng): unix有一個(gè)優(yōu)點(diǎn)就是標(biāo)準(zhǔn)UNIX命令在執(zhí)行時(shí)都具有相同的命令行格式: command -options parameters 如果在執(zhí)行Shell程序也采用上述格式,Bourne Shell中提供了一條獲取和處理命令行選項(xiàng)的語(yǔ)句,即getopts語(yǔ)句。該語(yǔ)句的格式為: getopts option_string variable 其中option_string中包含一個(gè)有效的單字符選項(xiàng)。若getopts命令在命令行中發(fā)現(xiàn)了連字符,那么它將用連字符后面的字符同option_string相比較。若有匹配,則把變量variable的值設(shè)為該選項(xiàng)。若無(wú)匹配,則variable設(shè)為?。當(dāng)getopts發(fā)現(xiàn)連字符后面沒(méi)有字符,會(huì)返回一個(gè)非零的狀態(tài)值。Shell程序中可以利用getopts的返回值建立一個(gè)循環(huán)。 下面代碼說(shuō)明了date命令中怎么使用getopts命令處理各種選項(xiàng),該程序除了完成unix的標(biāo)準(zhǔn)命令date的功能外,還增加了許多新的選項(xiàng)。?
#新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 "無(wú)效的選項(xiàng)!$OPTION";;?
esac?
done?
fi 有時(shí)侯選項(xiàng)中還帶一個(gè)值,getopts命令同樣也支持這一功能。這時(shí)需要在option_string中選項(xiàng)字母后加一個(gè)冒號(hào)。當(dāng)getopts命令發(fā)現(xiàn)冒號(hào)后,會(huì)從命令行該選項(xiàng)后讀取該值。若該值存在,那么將被存在一個(gè)特殊的變量OPTARG中。如果該值不存在,getopts命令將在OPTARG中存放一個(gè)問(wèn)號(hào),并且在標(biāo)準(zhǔn)錯(cuò)誤輸出上顯示一條消息。 下面的例子,實(shí)現(xiàn)拷貝一個(gè)文件,并給文件賦一個(gè)新的名字。-c選項(xiàng)指定程序拷貝的次數(shù),-v選項(xiàng)要求顯示新創(chuàng)建文件的文件名。 #--拷貝程序 COPIES=1?
VERBOSE=N?
while getopts vc:OPTION?
do?
case $OPTION?
in?
c)COPIES=$OPTARG;;?
v)VERBOSE=Y;;?
/?)echo "無(wú)效參數(shù)!"?
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 另外一個(gè)例子: #!/bin/bash
while getopts "ab:cd:" Option
# b and d take arguments
#
do
case $Option in
a) echo -e "a = $OPTIND";;
b) echo -e "b = $OPTIND $OPTARG";;
c) echo -e "c = $OPTIND";;
d) echo -e "d = $OPTIND $OPTARG";;
esac
done
shift $(($OPTIND - 1))
總結(jié)
以上是生活随笔為你收集整理的shell getopts的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。