* e - * na estrutura do caso do bash

0
docase1(){         
    case "$1" in             
        -a )                  
            echo "case a" ;;                
        -b )                    
            echo "case b" ;;                 
        -* )                 
            echo "wrong input" ;;                 
    esac
} 

Podemos chegar à conclusão de que -* pode corresponder - + caractere (s) ao invés de caractere (s).

docase1  -g
wrong input
docase1  -gg
wrong input
docase1  g
docase1  gg

O fato de os comandos docase1 g e docase1 gg não obterem nada como saída significa que - * não pode corresponder a g nor 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 -* no docase2 pode corresponder ao (s) 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 a g e gg , -* em docase2 pode?

    
por scrapy 07.08.2018 / 03:21

1 resposta

2

Mas não é isso que está sendo solicitado a combinar. O problema não tem nada a ver com case e tudo com getopt e set antes.

Embora o bloco caso ainda verifique o mesmo $1 , ele não está mais recebendo apenas o parâmetro da linha de comando. O comando anterior set substituiu os parâmetros originais pela saída do programa getopt , que geralmente se parece com -- "g" .

Esse parâmetro extra -- é inserido por getopt para indicar que as opções são interrompidas neste ponto e os argumentos não opcionais começam. Esse é todo o propósito de getopt - classificar e separar os diferentes tipos de argumentos da linha de comando.

Se você adicionar esta linha, ela deve se tornar óbvia:

 while true; do
+    echo "arg 1 is '$1'"
     case "$1" in
    
por 07.08.2018 / 04:32

Tags