* und - * in der bash-Fallstruktur

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

Wir können die Schlussfolgerung ziehen, dass -*- + Zeichen anstelle von Zeichen übereinstimmen können.

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

Die Tatsache, dass Befehle docase1 gund docase1 ggnichts als Ausgabe erhalten, bedeutet, dass - * weder passen gnoch passen kann 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 kann -*in docase2 ein Zeichen übereinstimmen?

docase2 g wrong input docase2 gg wrong input 

Warum führt der gleiche Ausdruck -*zu unterschiedlichen Effekten?
-*in docase1 nicht mithalten können gund gg, -*in docase2 kann?

0

1 Antwort auf die Frage

2
grawity

Aber darum geht es nicht. Das Problem hat nichts mit caseund alles mit getoptund setdavor zu tun .

Auch wenn Ihr Fall noch Block das gleiche prüft $1, es ist nicht mehr von dort nur Ihre Befehlszeilenparameter zu bekommen. Der vorherige setBefehl hat die ursprünglichen Parameter durch die Ausgabe des getopt- Programms ersetzt, was im Allgemeinen wie folgt aussieht -- "g".

Dieser zusätzliche --Parameter wird von getopt eingefügt, um anzuzeigen, dass Optionen an diesem Punkt angehalten werden und Argumente ohne Option beginnen. Das ist der Zweck von getopt, die verschiedenen Arten von Befehlszeilenargumenten zu sortieren und zu trennen.

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

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