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
回复 can i buy cheap cytotec no prescription 取消回复