Подтвердить что ты не робот

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

Я пытаюсь сделать команду getopt таким образом, что когда я передаю параметр "-ab" на script, что script будет обрабатывать -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

Однако это не работает. Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

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

Ответ 2

я долго боролся с этим - потом я начал читать о 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 "" \
    -- "[email protected]"
)


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

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

Ответ 3

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

Hack: вместо -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;;

Ответ 4

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