是否可以在一个命令中多次调用一个选项及其参数?

时间:2018-07-01 02:07:47

标签: bash getopt

这是我的bash案例test-getopt.sh,用于了解bash中的getopt。

OPTS=$(getopt -o d:eh   -- "$@")
eval set -- "$OPTS"
while true; do
    case "$1" in
        -d ) 
            if [[ $2  ==  "a"  ]];then
                echo  "i am -d's arg :a"
            elif [[ $2  ==  "b"  ]];then
                echo  "i am -d's arg :b"
            fi
            shift;;
        -e )   
            echo "i  am e"
            shift;;
        -h)
            echo "help you"
            shift;;
        -- ) 
            shift;; 
        *)
            break;;
    esac
done

要调用option及其参数,一次调用一个option及其参数。

bash test-get.sh  -d  a
i am -d's arg :a

其他论点。

bash test-get.sh  -d  b
i am -d's arg :b

我想调用option,并且所有参数都在一个命令中

bash test-get.sh  -d  a -d b
i am -d's arg :a

有没有办法获得以下预期输出?

bash test-get.sh  -d  a -d b
i am -d's arg :a
i am -d's arg :b

1 个答案:

答案 0 :(得分:1)

基本问题是,当处理带有参数的选项时,您需要两次shift才能从arg列表中同时删除选项及其参数。像这样:

OPTS=$(getopt -o d:eh   -- "$@")
eval set -- "$OPTS"
while true; do
    case "$1" in
        -d ) 
            if [[ $2  ==  "a"  ]];then
                echo  "i am -d's arg :a"
            elif [[ $2  ==  "b"  ]];then
                echo  "i am -d's arg :b"
            fi
            shift 2;;   # <-- The "2" here is the only change
        -e )   
            echo "i  am e"
            shift;;
        -h)
            echo "help you"
            shift;;
        -- ) 
            shift;; 
        *)
            break;;
    esac
done

在没有两次移位的情况下,发生的情况是,在循环中的第一次arg列表是“ -d”“ a”“-d”“ b”“-”。您检测到“ -d”和“ a”,正确打印,然后移动,这使arg列表保留为“ a”,“-d”,“ b”,“-”。在循环的第二次,它无法匹配“ a”作为选项,执行*)情况,并退出处理循环。