docase1(){
case "$1" in
-a )
echo "case a" ;;
-b )
echo "case b" ;;
-* )
echo "wrong input" ;;
esac
}
Podemos llegar a la conclusión de que -*
puede coincidir con -+caracteres en lugar de caracteres.
docase1 -g
wrong input
docase1 -gg
wrong input
docase1 g
docase1 gg
El hecho de que los comandos docase1 g
y docase1 gg
no obtengan nada como salida significa que -* no puede coincidir ni con g
ni 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 qué -*
en docase2 puede coincidir con los caracteres?
docase2 g
wrong input
docase2 gg
wrong input
¿Por qué la misma expresión -*
produce efectos diferentes?
-*
en docase1 no puede coincidir g
y en docase2 ¿puede gg
?-*
Respuesta1
Pero eso no es lo que se le pide que coincida. El problema no tiene nada que ver con case
y todo con getopt
y set
antes de él.
Aunque tucasoEl bloque todavía verifica lo mismo $1
, ya no obtiene solo el parámetro de línea de comando desde allí. El set
comando anteriorreemplazadolos parámetros originales con la salida deloptarprograma, que generalmente se parece a -- "g"
.
Ese --
parámetro extra es insertado poroptarpara indicar que las opciones terminan en este punto y comienzan los argumentos que no son opciones. Ese es todo el propósito deoptarde todos modos, para ordenar y separar los diferentes tipos de argumentos de la línea de comando.
Si agrega esta línea, debería resultar obvio:
while true; do
+ echo "arg 1 is '$1'"
case "$1" in