* und -* in der Case-Struktur von Bash

* und -* in der Case-Struktur von Bash
docase1(){         
    case "$1" in             
        -a )                  
            echo "case a" ;;                
        -b )                    
            echo "case b" ;;                 
        -* )                 
            echo "wrong input" ;;                 
    esac
} 

Wir können zu dem Schluss kommen, dass -*-+Zeichen anstelle von Zeichen übereinstimmen können.

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

Die Tatsache, dass die Befehle docase1 gund nichts als Ausgabe erhalten, bedeutet, dass -* weder noch docase1 ggübereinstimmen kann .ggg

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
} 

Warum -*können in docase2 Zeichen übereinstimmen?

docase2  g
wrong input
docase2  gg
wrong input

Warum führt derselbe Ausdruck -*zu unterschiedlichen Effekten?
-*In docase1 ist keine Übereinstimmung möglich , in docase2 gjedoch schon?gg-*

Antwort1

Aber das ist nicht das, was verlangt wird. Das Problem hat nichts damit zu tun case, sondern alles damit getoptund setdavor.

Auch wenn IhrFallBlock prüft immer noch dasselbe $1, es werden nicht mehr nur Ihre Befehlszeilenparameter von dort abgerufen. Der frühere setBefehlersetztdie ursprünglichen Parameter mit der Ausgabe aus demgetoptProgramm, das im Allgemeinen so aussieht -- "g".

Dieser zusätzliche --Parameter wird eingefügt durchgetoptum anzuzeigen, dass die Optionen an dieser Stelle aufhören und die Argumente ohne Optionen beginnen. Das ist der ganze Zweck vongetoptjedenfalls – um die verschiedenen Arten von Befehlszeilenargumenten zu sortieren und zu trennen.

Wenn Sie diese Zeile hinzufügen, sollte es offensichtlich werden:

 while true; do
+    echo "arg 1 is '$1'"
     case "$1" in

verwandte Informationen