Ich habe diesen Code -
#getoptDemo.sh
usage()
{
echo "usage: <command> options:<w|l|h>"
}
while getopts wlh: option
do
case $option in
(w)
name='1';;
(l)
name='2';;
(h)
name='3';;
(*)
usage
exit;;
esac
done
print 'hi'$name
Beim Ausführen bash getoptDemos.sh
(ohne die Option) wird gedruckt, hi
anstatt die Funktion aufzurufen usage
. Es ruft die Verwendung auf, wenn andere Optionen als w, h und l angegeben werden. Dann kann es nicht funktionieren, wenn keine Optionen angegeben sind.
Ich habe versucht , mit ?
, \?
, :
anstatt *
aber ich kann nicht erreichen , was ich wollte. Ich meine alles docs
auf , getopt
sagt , es zu benutzen ?
.
Was mache ich falsch?
/bin/bash
Antworten:
Wenn Sie dieses Skript ohne Optionen ausführen, gibt getopt false zurück, sodass es überhaupt nicht in die Schleife eintritt. Es wird nur auf den Ausdruck fallen - ist das ksh / zsh?
Wenn Sie eine Option benötigen, sollten Sie $ name nach der Schleife testen.
Stellen Sie jedoch sicher, dass
$name
vor dem Aufruf leer wargetopts
(da es$name
in der Umgebung möglicherweise ein Shell-Element gab, das beim Start empfangen wurde)(vor der
getopts
Schleife)quelle
no argument
Bedingung mit Bash behandeln.getopts
hat keine solche Bestimmung. Was schlimmer als das ist, kann dich nicht unterstützen.getopts
verarbeitet die Optionen der Reihe nach. Das ist seine Aufgabe. Wenn der Benutzer keine Option übergibt,getopts
verlässt der erste Aufruf von die while-Schleife.Wenn keine der Optionen ein Argument akzeptiert, gibt der Wert von
OPTIND
an, wie viele Optionen übergeben wurden. Im AllgemeinenOPTIND
ist dies die Anzahl der Argumente, die Optionen oder Argumente für Optionen sind, im Gegensatz zu Nichtoptionsargumenten (Operanden).In jedem Fall versuchen Sie nicht festzustellen, ob es keine Optionen gab, sondern ob keine der
name
-setting-Optionen übergeben wurde. Überprüfen Siename
daher , ob die Einstellung deaktiviert ist (und achten Sie darauf, sie zuerst zu deaktivieren) .quelle
bash sample.sh -abc file.txt
gibt es -1 non-option arguments
. Wie finde ich heraus, wie viele Optionen gegeben wurden? (hier 3)Wenn Ihr Skript Optionsargumente erhalten muss, setzen Sie diesen Block an den Anfang (vor getops).
Block prüft, ob die Parameterzeichenfolge nicht mit dem
-
Symbol beginnt . Dies zeigt an, dass der erste Parameter kein Optionsargument ist.quelle
Ich würde es mit einer Variablen überprüfen. Wenn getopts die Schleife niemals ohne Argument passiert, können Sie das zum Beispiel so verwenden:
quelle
getopts
Überprüfen Sie kurz vor Ihrem Block, ob$1
(das erste Argument / die erste Option, die Sie in der Befehlszeile übergeben haben) einer leeren Zeichenfolge entspricht. Wenn dies der Fall ist, drucken Sie die Verwendungsmeldung aus und beenden Sie das Programm (oder führen Sie eine Funktion ohne Optionen aus, wenn Sie ein Anarchist sind). Anderenfalls lassen Siegetopts
die Optionen wie gewohnt analysieren.Der Grund, warum diese Funktion nicht in getopts enthalten ist, ist, dass Sie sie bereits mit einem "if-else" ausführen können. Beispiel:
Sinn ergeben?
quelle