是否可以在一个命令中调用一个选项并多次调用它?

Is it possible to call one option and it's argument for more times in one command?

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

OPTS=$(getopt -o d:eh   -- "$@")
eval set -- "$OPTS"
while true; do
    case "" in
        -d ) 
            if [[   ==  "a"  ]];then
                echo  "i am -d's arg :a"
            elif [[   ==  "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

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

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

其他参数。

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

我想调用选项,它是一个命令中的所有参数

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

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

OPTS=$(getopt -o d:eh   -- "$@")
eval set -- "$OPTS"
while true; do
    case "" in
        -d ) 
            if [[   ==  "a"  ]];then
                echo  "i am -d's arg :a"
            elif [[   ==  "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"失败,执行*)情况,跳出处理循环