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
а в docase2 может?gg
-*
решение1
Но это не то, что его просят соответствовать. Проблема не имеет ничего общего с case
и со всем, что с ней getopt
и set
до нее.
Даже если вашслучайblock все еще проверяет то же самое $1
, он больше не получает только ваш параметр командной строки оттуда. Более ранняя set
командазамененыисходные параметры с выходными данными изgetoptпрограмма, которая в целом выглядит как -- "g"
.
Этот дополнительный --
параметр вставляетсяgetoptчтобы указать, что опции заканчиваются в этой точке, и начинаются неопциональные аргументы. Это и есть цельgetoptв любом случае – для сортировки и разделения различных видов аргументов командной строки.
Если добавить эту строку, то это станет очевидным:
while true; do
+ echo "arg 1 is '$1'"
case "$1" in