Ich habe die Funktion f
in Bash anhand des folgenden Beispiels definiert (unter "Eine Option mit einem Argument"):
f () {
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
return 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
return 1
;;
esac
done
}
Während sie ein Skript verwenden, definiere ich die Funktion direkt in der Shell.
Wenn ich Bash zum ersten Mal starte und die Funktion definiere, funktioniert alles: f -a 123
Drucken -a was triggered, Parameter: 123
. Aber wenn ich ein zweites Mal genau dieselbe Zeile laufen lasse, wird nichts gedruckt .
Was verursacht dieses Verhalten? Es passiert in Bash 3.2 und 4.3, aber es funktioniert gut in Zsh 5.1. Dies ist überraschend, da das Beispiel für Bash und nicht für Zsh sein sollte.
unset opt OPTARG OPTIND
Vor jedemwhile getopts...
Anruf hinzugefügt und funktioniert jetzt einwandfrei. Danke :)Es ist eine Gewohnheit Gottes, lokale Variablen in jeder Funktion zu deklarieren. Wenn Sie $ opt, $ OPTARG und $ OPTIND deklarieren, funktionieren getopts jedes Mal, wenn Sie die Funktion aufrufen. Lokale Variablen werden nach Beendigung der Funktion verworfen.
quelle
unset opt OPTARG OPTIND
vor diewhile getopts...
Aussage setzen, dass der Wert jeder dieser Variablen nicht gesetzt war. Wenn ich dies nicht tat und nur die Deklaration machte, da es in der gegebenen Bash-Sitzung, in der ich bereitsgetopts
einmal verwendet hatteOPTIND
, unverändert bliebSie müssen zu
OPTIND=1
Beginn der Funktion einstellenf
. Standardmäßig ist es 1, wird dann aber erhöht, wenn Ihre Argumente analysiert werden. Wenn Siegetopts
erneut anrufen, wird dort fortgesetzt, wo es aufgehört hat. Sie können dies sehen, wenn Ihr zweiter Anruf lautet:wenn der 999 gedruckt wird.
quelle
local OPTIND
innerhalb der Funktion deklariere, bevor siegetopts
aufgerufen wird?Wenn
getopt
es aufgerufen wird, verfolgt es die verarbeiteten Optionen durch die VariableOPTIND
.Versuche Folgendes:
Ausbeute:
Als solches könnten Sie etwas tun wie:
zu Beginn der Funktion. Oder die, je nach Situation und meist besser:
Wenn dies
OPTIND
nicht verwendet wird, da die Funktion implementiert ist, würde die while-Schleife für immer bestehen bleiben. Man kann es auch verwenden, um die Verarbeitung von Argumenten fortzusetzen, nach einem Fehler oder was auch immer, eine andere Funktion aufzurufen, wenn x oder y, und es wird dort fortgesetzt, wo zuvor aufgehört hat usw.quelle