Как сделать многосимвольный параметр в UNIX с помощью getopt?

Я пытаюсь сделать команду getopt таким образом, чтобы при передаче параметра «-ab» сценарию этот сценарий рассматривал -ab как один параметр.

#!/bin/sh
args=`getopt "ab":fc:d $*`
set -- $args
for i in $args
do
case "$i" in
        -ab) shift;echo "You typed ab $1.";shift;;
        -c) shift;echo "You typed a c $1";shift;;
esac
done

Однако, похоже, это не работает. Кто-нибудь может предложить какую-либо помощь?


person Waffles    schedule 20.10.2010    source источник


Ответы (4)


getopt не поддерживает то, что вы ищете. Вы можете использовать однобуквенные (-a) или длинные варианты (--long). Что-то вроде -ab обрабатывается так же, как -a b: как опция a с аргументом b. Обратите внимание, что перед длинными параметрами ставится два дефиса.

person paprika    schedule 20.10.2010

я долго боролся с этим - потом я начал читать о getopt и getopts

опции с одним символом и длинные опции.

У меня было аналогичное требование, когда мне нужно было иметь несколько многосимвольных входных аргументов.

Итак, я придумал это - это сработало в моем случае - надеюсь, это поможет вам

function show_help {
    echo "usage:  $BASH_SOURCE --input1 <input1> --input2 <input2> --input3 <input3>"
    echo "                     --input1 - is input 1 ."
    echo "                     --input2 - is input 2 ."
    echo "                     --input3 - is input 3 ."
}

# Read command line options
ARGUMENT_LIST=(
    "input1"
    "input2"
    "input3"
)



# read arguments
opts=$(getopt \
    --longoptions "$(printf "%s:," "${ARGUMENT_LIST[@]}")" \
    --name "$(basename "$0")" \
    --options "" \
    -- "$@"
)


echo $opts

eval set --$opts

while true; do
    case "$1" in
    h)
        show_help
        exit 0
        ;;
    --input1)  
        shift
        empId=$1
        ;;
    --input2)  
        shift
        fromDate=$1
        ;;
    --input3)  
        shift
        toDate=$1
        ;;
      --)
        shift
        break
        ;;
    esac
    shift
done

Примечание. Я добавил функцию справки в соответствии с моим требованием, вы можете удалить ее, если она не нужна.

person Ashish Shetkar    schedule 02.04.2019

Это не способ unix, хотя некоторые делают это, например. java -cp classpath.

Хак: вместо -ab arg используйте -b arg и фиктивный вариант -a.

Таким образом, -ab arg делает то, что вы хотите. (-b arg тоже будет; надеюсь, это не ошибка, а сокращенная функция...).

Единственное изменение - это ваша строка:

-ab) shift;echo "You typed ab $1.";shift;;

становится

-b) shift;echo "You typed ab $1.";shift;;
person hyperpallium    schedule 05.07.2019

getopt поддерживает длинный формат. Вы можете искать SO для таких примеры. См., например, здесь

person ghostdog74    schedule 20.10.2010
comment
Не могли бы вы привести пример того, как это используется? - person Waffles; 20.10.2010