Я использую getopts
и case...esac
в первый раз. Я видел учебные пособия и вопросы с различными шаблонами для опции по умолчанию / catch-all: ?
, *
, \?
, [?]
. Кажется, что все они функционируют одинаково, как вы можете видеть, если вы измените их порядок в этом сценарии:
#!/bin/bash
set -e
set -u
set -o pipefail
while getopts ":d:l:h:" opt; do
case $opt in
d) echo getopts saw $opt with value $OPTARG ;;
l) echo getopts saw $opt with value $OPTARG ;;
h) echo getopts saw $opt with value $OPTARG ;;
:) echo "getopts saw $opt with value $OPTARG and went to :" ;;
*) echo "getopts saw $opt with value $OPTARG and went to *" ;;
?) echo "getopts saw $opt with value $OPTARG and went to ?" ;;
\?) echo "getopts saw $opt with value $OPTARG and went to \?" ;;
[?]) echo "getopts saw $opt with value $OPTARG and went to [?]" ;;
esac
done
echo script done
Выполнение приведенного ниже кода всегда остановится на первом соответствующем параметре в списке case
:
$ ./test.sh -c
getopts saw ? with value c and went to *
script done
Все ли они одинаковы?
В ответ на комментарий @ BenjaminW. В приведенной ниже цитате из руководства поясняется, что getopts
вернет ?
против :
в зависимости от того, установлен ли getopts
в беззвучный режим. Итак, мои модифицированные вопросы:
- Являются ли
?
, \?
и [?]
эквивалентными? - Является ли
*
ненужным?
Из руководства: Если требуемый аргумент не найден и getopts не молчит, ставится вопросительный знак ('?') в имени OPTARG не установлен, и выводится сообщение о диагностике c. Если getopts молчит, в имени ставится двоеточие (':'), а для OPTARG устанавливается найденный символ опции.