shell中getopt/getopts的使用

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
相關文章
相關標籤/搜索