shell中getopt/getopts的使用

隐身守侯 提交于 2019-12-05 12:37:41
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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!