Как сделать многосимвольный параметр в UNIX с помощью getopt? - PullRequest
17 голосов
/ 20 октября 2010

Я пытаюсь сделать команду 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

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

Ответы [ 4 ]

12 голосов
/ 20 октября 2010

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

0 голосов
/ 05 июля 2019

Это не 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;;
0 голосов
/ 02 апреля 2019

я долго боролся с этим - потом я начал читать о 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

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

0 голосов
/ 20 октября 2010

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

...