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 g
und nichts als Ausgabe erhalten, bedeutet, dass -* weder noch docase1 gg
übereinstimmen kann .g
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
}
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 g
jedoch schon?gg
-*
Antwort1
Aber das ist nicht das, was verlangt wird. Das Problem hat nichts damit zu tun case
, sondern alles damit getopt
und set
davor.
Auch wenn IhrFallBlock prüft immer noch dasselbe $1
, es werden nicht mehr nur Ihre Befehlszeilenparameter von dort abgerufen. Der frühere set
Befehlersetztdie 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