Можно ли вызвать одну опцию и ее аргумент несколько раз в одной команде? - PullRequest
0 голосов
/ 01 июля 2018

Это мой случай bash test-getopt.sh, чтобы понять getopt в bash.

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

Чтобы вызвать параметр и его аргумент, один параметр и его аргумент на один раз.

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 голосов
/ 01 июля 2018

Основная проблема заключается в том, что когда вы обрабатываете опцию, которая принимает аргумент, вам нужно shift дважды, чтобы удалить опцию и ее аргумент из списка аргументов. Как это:

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», печатаете соответственно, а затем смещаетесь, что оставляет список аргументов как «a», «-d», «b», «-». Во второй раз в цикле он не может найти «a» в качестве опции, выполняет регистр *) и выходит из цикла обработки.

...