* и - * в структуре корпуса bash

290
scrapy
docase1(){  case "$1" in  -a )  echo "case a" ;;  -b )  echo "case b" ;;  -* )  echo "wrong input" ;;  esac }  

Мы можем получить заключение, что -*может соответствовать - + символ (ы) вместо символа (ов).

docase1 -g wrong input docase1 -gg wrong input docase1 g docase1 gg 

Тот факт, что команды docase1 gи docase1 ggничего не получают в качестве вывода означает, что - * не может совпадать ни с, gни с gg.

docase2(){  OPTS=$(getopt -o ab -- "$@"); if [ $? != 0 ] ; then  echo "wrong" ;  fi;  eval set -- "$OPTS";  while true; do  case "$1" in  -a )  echo "case a" ;  shift ;;  -b )  echo "case b";  shift ;;  -* )  echo "wrong input";  break;;  esac  done }  

Почему -*в docase2 могут совпадать символы?

docase2 g wrong input docase2 gg wrong input 

Почему одно и то же выражение -*приводит к различным эффектам?
-*в docase1 может не совпадать gи gg, -*в docase2 может?

0

1 ответ на вопрос

2
grawity

Но это не то, что он просит, чтобы соответствовать. Проблема не имеет ничего общего caseи все до getoptи setдо нее.

Даже если ваш блок case все еще проверяет то же самое $1, он больше не получает от вас только параметр командной строки. Предыдущая setкоманда заменила исходные параметры выводом из программы getopt, которая обычно выглядит так -- "g".

Этот дополнительный --параметр вставляется getopt, чтобы указать, что опции останавливаются в этой точке, и начинаются неопционные аргументы. В этом и заключается вся цель getopt - сортировать и разделять различные типы аргументов командной строки.

Если вы добавите эту строку, это должно стать очевидным:

 while true; do + echo "arg 1 is '$1'" case "$1" in 

Похожие вопросы