Обработка неиспользуемого аргумента getopts - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть скрипт, который начинается с getopts и выглядит следующим образом:

USAGE() { echo -e "Usage: bash $0 [-w <in-dir>] [-o <out-dir>] [-c <template1>] [-t <template2>] \n" 1>&2; exit 1; }

if (($# == 0))
then
    USAGE
fi

while getopts ":w:o:c:t:h" opt
do
    case $opt in
        w ) BIGWIGS=$OPTARG
        ;;
        o ) OUTDIR=$OPTARG
        ;;
        c ) CONTAINER=$OPTARG
        ;;
        t ) TRACK=$OPTARG
        ;;
        h ) USAGE
        ;;
        \? ) echo "Invalid option: -$OPTARG exiting" >&2
        exit
        ;;
        : ) echo "Option -$OPTARG requires an argument" >&2
        exit
        ;;
    esac
done

more commands etc

echo $OUTDIR
echo $CONTAINER

Я довольно новичок в getopts.Я проводил тестирование этого сценария, и на каком-то этапе мне не нужно было / не нужно использовать аргумент -c [-c].Другими словами, я пытался протестировать другую конкретную часть скрипта, вообще не задействовав переменную $ CONTAINER.Поэтому я просто добавил # перед всеми командами с помощью $ CONTAINER и провел некоторое тестирование, которое было хорошо.

При тестировании сценария без использования $ CONTAINER я набрал:

bash script.bash -w mydir -o myoutdir -t mywantedtemplate

Тем не менее, мне было интересно, учитывая мою команду getopts, я не получил предупреждение.Другими словами, почему я не получил предупреждение с аргументом -c.Это возможно?Предупреждение появляется только в том случае, если я ввожу:

bash script.bash -w mydir -o myoutdir -t mywantedtemplate -c

ОБНОВЛЕНИЕ

После некоторого тестирования я думаю, что это так:

  • Если вы не напишите явно «-c», getopts не «попросит» вас об этом и не выдаст ошибку (если ваш скрипт не делает с этим что-то - т.е. если вы не поставили # перед каждымкоманда, использующая этот аргумент)
  • Ошибка появляется только в том случае, если вы поставили «-c»

Это правильно?

1 Ответ

0 голосов
/ 14 сентября 2018

getopts не предупреждает, когда некоторые опции не используются (т. Е. Они необязательны ). Обычно это хорошо, потому что некоторые параметры (например, -h) не используются с другими параметрами. Невозможно указать обязательные параметры напрямую с помощью встроенной функции Bash getopts. Если вам нужны обязательные опции, вам нужно будет написать код, чтобы убедиться, что они были использованы. См. bash getopts с несколькими обязательными опциями . Также (как вы обнаружили) вы не получите сообщение об ошибке, если вам не удастся написать код для обработки параметров, указанных в optstring (first) аргументе getopts.

Вы можете получить своего рода автоматическое предупреждение для обязательных аргументов, используя параметр nounset в своем коде Bash (с set -o nounset или set -u). Это приведет к выдаче предупреждений для кода, подобного echo $CONTAINER, если опция -c не указана, поэтому $CONTAINER не установлена. Однако использование опции nounset означает, что весь вашего кода должен быть написан более тщательно. См. Как я могу заставить bash рассматривать неопределенные переменные как ошибки? , включая комментарии и "связанные" ответы, для получения дополнительной информации.

...