Überprüfen Sie die Existenz von input-argument in einer Bash-shell-Skript
Ich brauche, um zu überprüfen, die Existenz von einem input-argument. Ich habe das folgende Skript
if [ "$1" -gt "-1" ]
then echo hi
fi
Bekomme ich
[: : integer expression expected
Wie überprüfe ich die Eingabe argument1 zuerst zu sehen, ob es existiert?
InformationsquelleAutor user775187 | 2011-06-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es:
Den
$#
variable wird Ihnen sagen, die Anzahl der input-Argumente dem Skript übergeben wurde.Oder Sie können überprüfen, ob ein argument eine leere Zeichenfolge ist oder nicht, wie:
Den
-z
Schalter testen, wenn der ausbau "$1" ist eine null-Zeichenfolge oder nicht. Wenn es eine null-Zeichenfolge, dann wird der Körper ausgeführt wird.[ -z "$1" ] && echo "No argument supplied"
Ich lieber Einzeiler, da Sie leichter für mich; und es ist auch schneller zu überprüfen exit-Wert im Vergleich zuif
Sie wollen wahrscheinlich hinzufügen eine
exit 1
am Ende Ihres echos innerhalb des if-Blocks, wenn das argument ist erforderlich für die Skript-Funktion. Klar, aber erwähnenswert für die Vollständigkeit.Es ist möglich, aber selten sinnvoll, für das erste argument muss initialisiert sein, aber leer;
programname "" secondarg third
. Die$#
überprüfen Sie eindeutig überprüft die Anzahl von Argumenten.Für einen noob, vor allem jemand, der kommt von einer non-scripting-hintergrund, es ist auch wichtig zu erwähnen, einige Besonderheiten über diese Dinge. Da hätten Sie auch erwähnt, dass wir müssen ein Leerzeichen nach der öffnenden und der schließenden Klammer. Ansonsten Dinge, die nicht funktionieren. Ich selbst bin ein scripting noob (ich komme aus der C-hintergrund) und fand die harte Art und Weise. Es war nur, als ich beschloss, kopieren Sie die ganze Sache "wie Sie ist", die Dinge, die für mich gearbeitet. Es war dann erkannte ich, ich musste lassen Sie ein Leerzeichen nach der öffnenden Klammer und vor der schließenden.
und für optionale Argumente
if [ ! -z "$1" ]; then ...
InformationsquelleAutor phoxis
Ist es besser, zu demonstrieren, auf diese Weise
Müssen in der Regel zu beenden, wenn Sie haben zu wenige Argumente.
Nein, es ist nicht: dies hat
exit 1
die Sie wollen in der Regel, und verwendet die[[ ]]
- test, die (iirc) ist in der Regel sinnvoller. Also für Leute blind zu kopieren-einfügen von code, das ist die bessere Antwort.Mehr wissen über den Unterschied zwischen [ ] und [[ ]] siehe stackoverflow.com/questions/3427872/...
Ich denke, dass der Zeiger auf [[ ]] und der Ausfahrt 1 sind hilfreich.
InformationsquelleAutor Val
In einigen Fällen werden Sie brauchen, um zu überprüfen, ob der Benutzer übergebene argument an das Skript, und wenn nicht, fallen Sie zurück auf den Standardwert. Wie im Skript unten:
Hier, wenn der Benutzer noch nicht übergeben
scale
als 2. parameter, die ich starte den Android-emulator, mit-scale 1
standardmäßig.${varname:-word}
ist eine Erweiterung operator. Es gibt andere Erweiterung Operatoren:${varname:=word}
die setzt undefiniertvarname
anstatt dieword
Wert;${varname:?message}
welche entweder zurückvarname
wenn es definiert und nicht null ist oder druckt diemessage
und bricht das Skript (wie im ersten Beispiel);${varname:+word}
gibtword
nur, wennvarname
definiert und nicht null ist; liefert null sonst.${varname?message}
. Ist der extra:
ein Tippfehler, oder ändert sich das Verhalten?Eki, das ":" ist ein builtin-Kommando und die Kurzform für /bin/true in diesem Beispiel. Es stellt eine do-nothing-Befehl, der im Prinzip ignoriert die Argumente, die es bereitgestellt wird. Es ist wichtig, in diesem test in Ordnung zu halten, der interpreter versucht, zum ausführen der Inhalt der "$ "varname" (was Sie sicherlich NICHT wollen, zu passieren). Auch erwähnenswert; Sie kann testen, wie viele Variablen bei dieser Methode, wie Sie wollen. Und alle, die mit konkreten Fehlermeldungen. also
: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
InformationsquelleAutor Aleks N.
Versuchen:
$#
und0
?Kein problem, wenn wir ohne double-quotes als wie $ - # 0 und
auf windows, mingw dies ist der einzige Weg zu gehen.
Diese Antwort bietet der ideale Ausgangspunkt für ein Skript, das ich gerade gemacht. Vielen Dank für das zeigen der
else
auch.doppelte Anführungszeichen werden Variablen in der bash verhindern Platzhalter (z.B. ausbau Dateinamen wie
foo*
) und word-splitting (d.h. Aufspaltung der Inhalt, wenn der Wert enthält Leerzeichen). In diesem Fall ist es nicht notwendig zu zitieren$#
da diese beiden Fälle nicht zutreffen. Unter Angabe der0
ist auch nicht nötig, aber einige Leute lieber zu zitieren, Werte, da Sie wirklich strings und das macht es deutlicher.InformationsquelleAutor Ranjithkumar T
Anderen Weg, um zu erkennen, ob Argumente übergeben wurden, um das Skript:
Beachten Sie, dass
(( expr ))
bewirkt, dass der Ausdruck, der ausgewertet werden als pro-Regeln des Shell-Arithmetik.Um zu beenden in dem fehlen jeglicher Argumente, kann man sagen:
Anderen (Analog) Weg zu sagen, das obige wäre:
help let
sagt:statt
exit
das tötet meine zsh-Prozess, die ich nutzenreturn
die nicht töten, esInformationsquelleAutor devnull
Verwende ich oft das snippet für einfache Skripte:
InformationsquelleAutor f2cx
Nur, weil es eine weitere base point to point out ich werde hinzufügen, können Sie einfach testen Sie Ihre Zeichenkette null ist:
Ebenso, wenn Sie erwarten sind arg zählen, testen Sie einfach Ihre Letzte:
und so weiter mit jedem arg oder var
InformationsquelleAutor seorphates
Als eine kleine Erinnerung, die numerische test-Operatoren in der Bash nur Integer (
-eq
,-lt
,-ge
usw.)Ich mag, um sicherzustellen, dass meine $vars sind ints von
bevor ich testen, nur um zu verteidigen gegen die "[: integer arg erforderlich" - Fehler.
var=$(printf "%.0f" "$var")
verarbeiten kann, schwebt aber leidet unter der nicht-null exit, wenn Sie in einem gegebenen string. Wenn Sie nichts dagegen haben, eine awk, diese Methode, die ich verwenden, scheint die meisten robust, die für die Durchsetzung einer integer:var=$(<<<"$var" awk '{printf "%.0f", $0}')
. Wenn var nicht gesetzt ist, lautet der Standardwert "0". Wenn var ist ein float, ist es auf die nächste Ganzzahl gerundet. Negative Werte sind auch gut zu verwenden.InformationsquelleAutor Cwissy
Wenn Sie möchten, um zu überprüfen, ob das argument existiert können Sie überprüfen, ob die Anzahl der Argumente größer ist als oder gleich zu Ihrer Ziel-argument Nummer.
Das folgende Skript zeigt, wie dies funktioniert
test.sh
erzeugt die folgende Ausgabe
InformationsquelleAutor Brad Parks