getopt用于处理简单的参数又快又方便,不但简单,还功能强大。示例如下:
usage()
{
echo "Usage: $0 -k key -v value -h"
exit 2
}
no_args="true"
while getopts ":k:v:h" optname
do
case "$optname" in
"k")
echo "get option -k, value is $OPTARG"
;;
"v")
echo "get option -v, value is $OPTARG"
;;
"h")
echo "get option -h"
usage
;;
# 参数没有值
":")
echo "No argument value for option $OPTARG"
;;
# 无法识别的参数
"?")
echo "unknown option"
usage
;;
# 所有未知错误
*)
echo "Unknown error while processing options"
;;
esac
#echo "option index is $OPTIND"
no_args="false"
done
# 处理未传递参数的情况, 此时getopts代码不进入do/done内部
if [[ ${no_args} == "true" ]]; then
echo "No args detected"
usage
fi
这里面有几个注意的点:
1. getopt有两个默认参数,OPTARG表示选项值,OPTIND表示参数索引位置
2. getopt后面紧接着的”:k:v:h”,描述了参数。有冒号的意味着要传值,没有冒号的不需要值,比如
# k后面有冒号,参数需要传值 ./script -k key # h后面没有冒号,参数不需要传值 ./script -h
3. “:k:v:h”里面的第一个冒号,表示开启getopt的silent模式,意思就是出错了getopt不处理,需要用户自己处理。用户自己怎么处理呢?就是这一段代码了:
# 参数没有值
":")
echo "No argument value for option $OPTARG"
;;
# 无法识别的参数
"?")
echo "unknown option"
usage
;;
# 所有未知错误
*)
echo "Unknown error while processing options"
;;
一般都会开启silent模式,否则getopt就会自己处理错误,非常简单的把错误打印完事
4. 没有传递任何参数的情况。当没有传递任何参数的时候,getopt就不会进入do/done的逻辑里面,无法检测。因此需要额外加一段代码,也就是例子中的no_args和if处理逻辑:
no_args="true"
while getopts ":k:v:h" optname
do
。。。
no_args="false"
done
# 处理未传递参数的情况, 此时getopts代码不进入do/done内部
if [[ ${no_args} == "true" ]]; then
echo "No args detected"
usage
fi
最终运行效果:
$ ./t.sh -v value -k key get option -v, value is value get option -k, value is key
回复 agodelo 取消回复