2015-12-29 2 views
3

Я пытаюсь использовать getopts для скрипта bash. Этот скрипт может иметь флаги, и все эти флаги являются обязательными и должны содержать значение. Когда один из обязательных флагов, который должен содержать значение, является пустым getopts, используйте флаг next-in-line в качестве его содержимого. Как я могу это предотвратить?getopts - если флаг пуст, getopts использует следующий флаг

Это мой пример:

#!/bin/bash 

while getopts "A:B:" OPTION 
do 
     case $OPTION in 
     A) 
     GILIA="$GILIA $OPTARG" 
     echo GILIA $GILIA 
     ;; 
     B) 
     GILIB="$GILIB $OPTARG" 
     echo GILIB $GILIB 
     ;; 
     esac 
done 

При использовании обоих флагов со значением:

./test_opt2 -A aaa -B bbb 
GILIA aaa 
GILIB bbb 

При использовании "-A" флаг пустым:

./test_opt2 -A -B bbb 
GILIA -B 

Я знаю, что это это нормальное/типичное поведение getopts, и я уверен, что есть способ обойти это ...

Любые идеи?

ответ

2

Если вы хотите передать пустой аргумент -A затем:

./test_opt2 -A '' -B bbb 

Если вы хотите, чтобы скрипт принимать -A без аргумента, то измените сценарий:

while getopts "AB:" OPTION 

Сценарий будет потом ожидайте, что -А никогда не принимает аргумента.

3

Что вы можете сделать, это проверить значение $ OPTARG. Если он начинается с -, уменьшите значение индекса $ OPTIND, так что параметр - будет выбран как ВАРИАНТ в следующий раз вокруг цикла.

В вашем втором примере при обработке пустого аргумента -A $ OPTIND будет установлено значение 3. Мой код установит значение обратно на 2, чтобы затем обрабатывать -B.

case $OPTION in 
    A) 
     arg=${OPTARG#-} 
     if [ $arg == $OPTARG ] 
     then 
      GILIA="$GILIA $OPTARG" 
      echo GILIA $GILIA 
     else 
      echo "-A needs argument" 
      OPTIND=$OPTIND-1 
     fi 
     ;; 
2

Предполагая, что: (1) все параметры являются обязательными и (2) не аргумент может начинаться с '-', то я не буду использовать что-то вроде этого:

while getopts ":a:b:" opt ; do 
    [[ ${OPTARG} == -* ]] && { echo "Missing argument for -${opt}" ; exit 1 ; } 
    case ${opt} in 
     a) gilia="$gilia $OPTARG" 
      echo gilia $gilia 
      ;; 
     b) gilib="$gilib $OPTARG" 
      echo gilib $gilib 
      ;; 
     \?) echo "Invalid (-${OPTARG}) option" 
      ;; 
     :) echo "Missing argument for -${OPTARG}" 
      ;; 
    esac 
done 

Вы получите:

$ ./t.sh -a aaa -b bbb 
gilia aaa 
gilib bbb 
$ ./t.sh -a -b bbb 
Missing argument for -a 
$ ./t.sh -a aaa -b 
gilia aaa 
Missing argument for -b 
$ ./t.sh -a aaa -b bbb -c ccc 
gilia aaa 
gilib bbb 
Invalid (-c) option 
+0

Отличное и элегантное решение !!!! Я использовал этот ответ, чтобы решить мою проблему. –

+0

хороший подход, единственное, что я бы сказал, это то, что это не распространяется на опцию, когда нет опций или аргументов: «$ ./t.sh», ничего не возвращает –

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