2013-05-09 4 views
2

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

THX заранее.

+1

Прежде всего, старайтесь всегда предоставлять минимальный рабочий пример: ваш не связан с функцией 'exitScript'. –

ответ

4

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

err() { 1>&2 echo "$0: error [email protected]"; 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:[email protected]:" 

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

$ 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: 

Что нет, чего вы хотите.

И UUOE. (Употребляет эхо).

2

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

+1

+1 Чтобы уточнить, неупомянутый '?' В селекторе 'case' является шаблоном glob, который соответствует любому одиночному символу - здесь перехватывается значение': 'и никогда не попадает в предложение, предназначенное для него. – michaelb958

Смежные вопросы