getopts配合case來進行操做時有兩個隱含變量:一個是OPTARG,用來取當前選項的值,另一個是OPTIND,表明當前選項在參數列表中的位移。OPTIND是一個特殊的變量,它的初始值是1,每次getopts處理完一個命令參數後就遞增它,獲得getopts要處理的下一個參數。 下面的例子可參考: >cattest4 #!/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不能直接處理長的選項(如:--prefix=/home等) 關於getopts的使用方法,能夠man bash 搜索getopts getopts 有兩個參數,第一個參數是一個字符串,包括字符和「:」,每個字符都是一個有效的選項,若是字符後面帶有「:」,表示這個字符有本身的參數。getopts從命令中獲取這些參數,而且刪去了「-」,並將其賦值在第二個參數中,若是帶有本身參數,這個參數賦值在「OPTARG」中。提供getopts的shell內置了OPTARG這個變變,getopts修改了這個變量。 這裏變量$OPTARG存儲相應選項的參數,而$OPTIND老是存儲原始$*中下一個要處理的元素位置。 whilegetopts ":a:bc" opt #第一個冒號表示忽略錯誤;字符後面的冒號表示該選項必須有本身的參數 代碼實例(getopts.sh): echo $* whilegetopts ":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 $* 執行命令:./getopts.sh -a 11 -b -c -a 11 -b-c 11 3 b 4 c 5 5 ./getopts.sh 下面是getopt處理長短參數選項的一個實例。 aflag=no bflag=no cargument=none #options may be followed by one colon to indicate they have a required argument if!options=$(getopt-o abc:-l along,blong,clong:--"$@") then # something went wrong, getopt will put outan error message for us exit 1 fi set--$options while[$#-gt 0 ] do case$1 in -a|--along)aflag="yes";; -b|--blong)bflag="yes";; # foroptions with required arguments, an additional shift is required -c|--clong)cargument="$2";shift;; (--)shift;break;; (-*)echo "$0: error - unrecognizedoption $1"1>&2;exit 1;; (*)break;; esac shift done 說明: -o後面是短選項列表,abc:說明a, b都是不帶參數的,而c必須帶一個參數,好比-a -c copt -l後面是長選項列表,aaa:,bb,cc:表示aaa和cc必須帶參數,而bb不帶參數,好比--aaa=aaaopt --bb