* y -* en la estructura de casos de bash

* y -* en la estructura de casos de bash
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 gy docase1 ggno obtengan nada como salida significa que -* no puede coincidir ni con gni 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 gy en docase2 ¿puede gg?-*

Respuesta1

Pero eso no es lo que se le pide que coincida. El problema no tiene nada que ver con casey todo con getopty setantes 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 setcomando 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

información relacionada