Как лучше всего проверить статус getopts в bash? - PullRequest
1 голос
/ 26 ноября 2010

Я использую следующий скрипт:

#!/bin/bash
#script to print quality of man
#unnikrishnan 24/Nov/2010
shopt -s -o nounset
declare -rx SCRIPT=${0##*/}
declare -r OPTSTRING="hm:q:"
declare SWITCH
declare MAN
declare QUALITY
if [ $# -eq 0 ];then
printf "%s -h for more information\n" "$SCRIPT"
exit 192
fi
while getopts "$OPTSTRING" SWITCH;do
case "$SWITCH" in
h) printf "%s\n" "Usage $SCRIPT -h -m MAN-NAME -q MAN-QUALITY"
   exit 0
   ;;
m) MAN="$OPTARG"
   ;;
q) QUALITY="$OPTARG"
   ;;
\?) printf "%s\n" "Invalid option"
    printf "%s\n" "$SWITCH"
    exit 192
    ;;
*) printf "%s\n" "Invalid argument"
   exit 192
    ;;
esac
done
printf "%s is a %s boy\n" "$MAN" "$QUALITY"
exit 0

В этом случае, если я даю опцию мусора:

./getopts.sh adsas
./getopts.sh: line 32: MAN: unbound variable

Вы видите, что это не удается. кажется пока не работает. Каков наилучший способ решить это.

Ответы [ 3 ]

2 голосов
/ 26 ноября 2010

Встроенная функция getopts возвращает 1 («ложь»), когда нет аргументов опции.

Итак, ваш while никогда не будет выполнен, если у вас нет аргументов опции, начинающихся с -.

Обратите внимание на последний параграф в разделе getopts в bash (1):

          getopts  returns true if an option, specified or unspecified, is
          found.  It returns false if the end of options is encountered or
          an error occurs.
1 голос
/ 26 ноября 2010

Если вам абсолютно необходим MAN, тогда я предлагаю вам сделать его не параметром, а параметром позиционирования.Опции должны быть необязательными.

Однако, если вы хотите сделать это как вариант, сделайте:

# initialise MAN to the empty string
MAN=
# loop as rewritten by DigitalRoss
while getopts "$OPTSTRING" SWITCH "$@"; do
  case "$SWITCH" in
    m) MAN="$OPTARG" ;;
  esac
done
# check that you have a value for MAN
[[ -n "$MAN" ]] || { echo "You must supply a MAN's name with -m"; exit 1; }

Еще лучше распечатать сообщение об использовании перед выходом - вытащите егов функцию, чтобы вы могли поделиться ею с регистром опции -h.

0 голосов
/ 26 ноября 2010

«Лучшее» решение субъективно. Одним из решений будет дать значения по умолчанию для этих переменных, которые могут быть установлены с помощью параметров.

...