【问题标题】:Why my bash function can't parse optional argument?为什么我的 bash 函数无法解析可选参数?
【发布时间】:2020-02-10 12:04:32
【问题描述】:

longopts 中的每个长选项名称后面可以跟一个冒号表示它有一个必需的参数,后面跟两个冒号表示它有一个可选的参数。

man bash.

我写了一个bash函数optionarg

optionarg (){
    opts=$(getopt -o , --long name:,pass:: -- "$@")
    eval set -- "$opts"
    while true; do
        case "$1" in
            --name)
                name=$2
                echo  "name is " $name
                shift 2;;
            --pass)
                case "$2" in 
                    '')
                        echo "no pass argument"
                        shift 2;; 
                    *)
                        pass=$2
                        echo  "pass" $pass
                        shift 2;;
                esac;;               
            --)
                shift 1;;
            *)  break;;
        esac
    done }

让我们在这里测试我的 optionarg。
1.pass不指定参数。

optionarg --name tom --pass
name is  tom
no pass argument

2. 用pass 分配参数xxxx

optionarg --name tom --pass xxxx
name is  tom
no pass argument

如何修复我的optionarg 函数以获得这样的输出?

optionarg --name tom --pass xxxx
name is  tom
pass xxxx

【问题讨论】:

标签: bash getopt


【解决方案1】:

长选项使用= 分配一个可选值:

$ optionarg --name tom --pass=xxxx
name is  tom
pass xxxx

这记录在man getopt:

如果选项有可选参数,则必须写成 直接在长选项名称之后,以= 分隔,如果存在(如果添加 = 但后面什么都没有,它被解释为好像没有参数存在;这 是一个小错误,请参阅 BUGS)。

【讨论】:

    【解决方案2】:

    我个人只会使用case

    optionarg () {
        while [[ $@ ]]; do
            case "$1" in
                --name|-n) name=$2;;
                --pass|-p) pass=$2;;
            esac               
            shift
        done
        echo "name=$name"
        echo "pass=$pass"
    }
    

    用法

    $ optionarg --name user --pass dfgd
    name=user
    pass=dfgd
    
    $ optionarg -n user -p dfgd
    name=user
    pass=dfgd
    

    【讨论】:

      猜你喜欢
      • 2013-05-11
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2019-09-17
      • 2015-11-08
      • 1970-01-01
      • 2018-11-27
      • 2016-07-27
      相关资源
      最近更新 更多