getopts аргумент не указан

как проверить, не был ли указан обязательный аргумент? Я обнаружил, что для этой цели должно быть достаточно опции «:» в регистре переключателей, но она никогда не входит в этот регистр (кодовый блок). Неважно, поставил ли я «двоеточие» в начале или где-то еще.

мой код:

while getopts :a:b: OPTION;
do
     case "$OPTION" in
         a)
             var1=$OPTARG
             ;;
         b)
             var2=$OPTARG
             ;;
         ?)
             exitScript "`echo "Invalid option $OPTARG"`" "5"
             ;;
         :)
             exitScript "`echo "Option -$OPTARG requires an argument."`" "5"
             ;;
         *)
             exitScript "`echo "Option $OPTARG unrecognized."`" "5"
             ;;
     esac
done

СПАСИБО заранее.


person Petr Marek    schedule 09.05.2013    source источник
comment
Прежде всего, старайтесь всегда предоставлять минимальный рабочий пример: ваш не из-за функции exitScript.   -  person Bertrand Caron    schedule 09.05.2013


Ответы (2)


Вы должны избежать ?. Следующая может (частично) работает.

err() { 1>&2 echo "$0: error $@"; return 1; }
while getopts ":a:b:" opt;
do
        case $opt in
                a) aarg="$OPTARG" ;;
                b) barg="$OPTARG" ;;
                :) err "Option -$OPTARG requires an argument." || exit 1 ;;
                \?) err "Invalid option: -$OPTARG" || exit 1 ;;
        esac
done

shift $((OPTIND-1))
echo "arg for a :$aarg:"
echo "arg for b :$barg:"
echo "unused parameters:$@:"

Частично потому, что, когда приведенный выше скрипт будет вызываться как

$ bash script -a a_arg -b b_arg extra

будет работать так, как вы ожидаете,

arg for a :a_arg:
arg for b :b_arg:
unused parameters:extra:

Но когда вы будете называть это как

bash script -a -b b_arg

будет печатать

arg for a :-b:
arg for b ::
unused parameters:b_arg:

чего нет, чего ты хочешь.

И УУОЕ. (Используется использование эха).

person jm666    schedule 09.05.2013

?) в блоке case должно быть записано как "?").

person pynexj    schedule 09.05.2013
comment
+1 Чтобы уточнить, ? без кавычек в селекторе case представляет собой шаблон глобуса, который соответствует любому одиночному символу - здесь перехватывается значение : и никогда не попадает в предназначенное для него предложение. - person michaelb958--GoFundMonica; 09.05.2013