shell getopts
生活随笔
收集整理的這篇文章主要介紹了
shell getopts
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
getopts配合case來進行操作時有兩個隱含變量:一個是OPTARG,用來取當前選項的值,另外一個是OPTIND,代表當前選項在參數列表中的位移。OPTIND是一個特殊的變量,它的初始值是1,每次getopts處理完一個命令參數后就遞增它,得到getopts要處理的下一個參數。
getopts不能直接處理長的選項(如:--prefix=/home等)
關于getopts的使用方法,可以man bash??搜索getopts
getopts 有兩個參數,第一個參數是一個字符串,包括字符和“:”,每一個字符都是一個有效的選項,如果字符后面帶有“:”,表示這個字符有自己的參數。 getopts從命令中獲取這些參數,并且刪去了“-”,并將其賦值在第二個參數中,如果帶有自己參數,這個參數賦值在“OPTARG”中。提供getopts的shell內置了OPTARG這個變變,getopts修改了這個變量。
這里變量$OPTARG存儲相應選項的參數,而$OPTIND總是存儲原始$*中下一個要處理的元素位置。
while getopts ":a:bc" opt??#第一個冒號表示忽略錯誤;字符后面的冒號表示該選項必須有自己的參數
代碼實例(getopts.sh):
執行命令:./getopts.sh -a 11 -b -c
-a 11 -b -c
11
3
b 4
c 5
5
./getopts.sh
獲取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 另外一個例子: #!/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))
???下面的例子可參考:
>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內置命令)
處理命令行參數是一個相似而又復雜的事情,為此,C提供了getopt/getopt_long等函數,C++的boost提供了Options庫,在shell中,處理此事的是getopts和getopt.
先說一下getopts/getopt的區別吧,getopt是個外部binary文件,而getopts是shell builtin。
| [admin@intlqa142055x ~]$ type getopt getopt is /usr/bin/getopt [admin@intlqa142055x ~]$ type getopts getopts is a shell builtin |
關于getopts的使用方法,可以man bash??搜索getopts
getopts 有兩個參數,第一個參數是一個字符串,包括字符和“:”,每一個字符都是一個有效的選項,如果字符后面帶有“:”,表示這個字符有自己的參數。 getopts從命令中獲取這些參數,并且刪去了“-”,并將其賦值在第二個參數中,如果帶有自己參數,這個參數賦值在“OPTARG”中。提供getopts的shell內置了OPTARG這個變變,getopts修改了這個變量。
這里變量$OPTARG存儲相應選項的參數,而$OPTIND總是存儲原始$*中下一個要處理的元素位置。
while getopts ":a:bc" opt??#第一個冒號表示忽略錯誤;字符后面的冒號表示該選項必須有自己的參數
代碼實例(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)) #通過shift $(($OPTIND - 1))的處理,$*中就只保留了除去選項內容的參數,可以在其后進行正常的shell編程處理了。 echo $0 echo $* |
-a 11 -b -c
11
3
b 4
c 5
5
./getopts.sh
?
獲取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 另外一個例子: #!/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))
總結
以上是生活随笔為你收集整理的shell getopts的全部內容,希望文章能夠幫你解決所遇到的問題。