getopt处理参数

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

Ref



《 “getopt处理参数” 》 有 3 条评论

  1. Trastuzumab can cause toxicity to the lungs, including swelling, fluid and or scarring within the lungs buying cytotec online

  2. Whether metastasis happens depends on several factors, including priligy review Consult your doctor for pediatric doses

  3. Vero E6 shows the toxicity of toremifene on uninfected cells pastillas priligy en mexico

回复 agodelo 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About Me

一位程序员,会弹吉他,喜欢读诗。
有一颗感恩的心,一位美丽的妻子,两个可爱的女儿
mail: geraldlee0825@gmail.com
github: https://github.com/lisuxiaoqi
medium: https://medium.com/@geraldlee0825