docase1(){
case "$1" in
-a )
echo "case a" ;;
-b )
echo "case b" ;;
-* )
echo "wrong input" ;;
esac
}
Podemos chegar à conclusão que -*
pode corresponder a -+caractere(s) em vez de caractere(s).
docase1 -g
wrong input
docase1 -gg
wrong input
docase1 g
docase1 gg
O fato de os comandos não docase1 g
obterem docase1 gg
nada como saída significa que -* não pode corresponder a g
nem 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
}
Por que -*
em docase2 pode corresponder caractere(s)?
docase2 g
wrong input
docase2 gg
wrong input
Por que a mesma expressão -*
resulta em efeitos diferentes?
-*
em docase1 não pode corresponder g
e gg
, -*
em docase2 pode?
Responder1
Mas não é isso que está sendo solicitado a corresponder. O problema não tem nada a ver case
e tudo com getopt
e set
antes dele.
Mesmo que seucasoblock ainda verifica o mesmo $1
, ele não está mais obtendo apenas o parâmetro da linha de comando a partir daí. O set
comando anteriorsubstituídoos parâmetros originais com a saída doobteroptprograma, que geralmente se parece com -- "g"
.
Esse --
parâmetro extra é inserido porobteroptpara indicar que as opções param neste ponto e os argumentos sem opção começam. Esse é todo o propósito deobteroptde qualquer maneira – para classificar e separar os diferentes tipos de argumentos de linha de comando.
Se você adicionar esta linha, ficará óbvio:
while true; do
+ echo "arg 1 is '$1'"
case "$1" in