* e -* na estrutura de caso do bash

* e -* na estrutura de caso do bash
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 gobterem docase1 ggnada como saída significa que -* não pode corresponder a gnem 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 ge gg, -*em docase2 pode?

Responder1

Mas não é isso que está sendo solicitado a corresponder. O problema não tem nada a ver casee tudo com getopte setantes 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 setcomando 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

informação relacionada