Обработка неиспользуемого аргумента getopts

У меня есть сценарий, который начинается с 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
709
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Другие вопросы по теме