Ich muss die Existenz eines Eingabearguments überprüfen. Ich habe das folgende Skript
if [ "$1" -gt "-1" ]
then echo hi
fi
Ich bekomme
[: : integer expression expected
Wie überprüfe ich zuerst das Eingabeargument1, um festzustellen, ob es vorhanden ist?
[ -z "$1" ] && echo "No argument supplied"
Ich bevorzuge Einzeiler, da sie für mich einfacher sind. und es ist auch schneller Check Exit - Wert, im Vergleich zur Verwendungif
exit 1
am Ende Ihrer Echos im if-Block einfügen, wenn das Argument erforderlich ist, damit das Skript funktioniert. Offensichtlich, aber der Vollständigkeit halber erwähnenswert.programname "" secondarg third
. Die$#
Prüfung prüft eindeutig die Anzahl der Argumente.if [ ! -z "$1" ]; then ...
Es ist besser, diesen Weg zu demonstrieren
Normalerweise müssen Sie beenden, wenn Sie zu wenige Argumente haben.
quelle
exit 1
was Sie normalerweise wollen, und verwendet den[[ ]]
Test, der (iirc) normalerweise vernünftiger ist. Für Leute, die blind Code einfügen, ist dies die bessere Antwort.In einigen Fällen müssen Sie überprüfen, ob der Benutzer ein Argument an das Skript übergeben hat, und wenn nicht, auf einen Standardwert zurückgreifen. Wie im folgenden Skript:
Hier, wenn der Benutzer nicht
scale
als 2. Parameter übergeben hat, starte ich-scale 1
standardmäßig den Android-Emulator mit .${varname:-word}
ist ein Expansionsoperator. Es gibt auch andere Expansionsbetreiber:${varname:=word}
das setzt das undefinierte,varname
anstatt denword
Wert zurückzugeben;${varname:?message}
die entweder zurückgibt,varname
wenn sie definiert ist und nicht null ist, odermessage
das Skript druckt und abbricht (wie im ersten Beispiel);${varname:+word}
dieword
nur zurückgibt , wennvarname
definiert und nicht null ist; Gibt sonst null zurück.quelle
${varname?message}
. Ist das Extra:
ein Tippfehler oder ändert es das Verhalten?: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
Versuchen:
quelle
$#
und0
?else
auch gezeigt hast.foo*
) und das Aufteilen von Wörtern (dh das Aufteilen des Inhalts, wenn der Wert Leerzeichen enthält). In diesem Fall ist kein Zitat erforderlich,$#
da beide Fälle nicht zutreffen. Das Zitieren von0
ist ebenfalls nicht erforderlich, aber einige Leute bevorzugen das Zitieren von Werten, da es sich wirklich um Zeichenfolgen handelt, und das macht es expliziter.Eine andere Möglichkeit, um festzustellen, ob Argumente an das Skript übergeben wurden:
Beachten Sie,
(( expr ))
dass der Ausdruck gemäß den Regeln der Shell-Arithmetik ausgewertet wird .Um ohne Argumente zu beenden, kann man sagen:
Eine andere (analoge) Art, das Obige zu sagen, wäre:
help let
sagt:quelle
exit
meinen zsh-Prozess zu beenden, verwende ich einen,return
der ihn nicht beendet((!$#))
eine Historienersetzung ausgelöst werden?Ich benutze dieses Snippet oft für einfache Skripte:
quelle
Nur weil es einen weiteren Basispunkt gibt, möchte ich hinzufügen, dass Sie einfach testen können, ob Ihre Zeichenfolge null ist:
Wenn Sie eine Arg-Anzahl erwarten, testen Sie einfach Ihre letzte:
und so weiter mit jedem arg oder var
quelle
Wenn Sie überprüfen möchten, ob das Argument vorhanden ist, können Sie überprüfen, ob die Anzahl der Argumente größer oder gleich Ihrer Zielargumentnummer ist.
Das folgende Skript zeigt, wie dies funktioniert
test.sh
erzeugt die folgende Ausgabe
quelle
Als kleine Erinnerung, die numerische Test Operatoren in Bash arbeiten nur auf ganze Zahlen (
-eq
,-lt
,-ge
, etc.)Ich möchte sicherstellen, dass meine $ vars Ints von sind
bevor ich sie teste, nur um mich gegen den Fehler "[: integer arg required" zu verteidigen.
quelle
var=$(printf "%.0f" "$var")
kann mit Floats umgehen, leidet jedoch unter dem Exit ungleich Null, wenn eine Zeichenfolge angegeben wird. Wenn Ihnen ein awk nichts ausmacht, scheint diese Methode, die ich verwende, die robusteste zu sein, um eine Ganzzahl zu erzwingen :var=$(<<<"$var" awk '{printf "%.0f", $0}')
. Wenn var nicht gesetzt ist, wird standardmäßig "0" verwendet. Wenn var ein Float ist, wird es auf die nächste Ganzzahl gerundet. Negative Werte sind ebenfalls in Ordnung.Validierung der One-Liner-Bash-Funktion
Funktionsnamen und Verwendung hinzufügen
Fügen Sie eine Validierung hinzu, um zu überprüfen, ob eine Ganzzahl vorliegt
Um eine zusätzliche Validierung hinzuzufügen, z. B. um zu überprüfen, ob das übergebene Argument eine Ganzzahl ist, ändern Sie die Validierung eines Liners, um eine Validierungsfunktion aufzurufen:
Erstellen Sie dann eine Validierungsfunktion, die das Argument validiert und 0 bei Erfolg, 1 bei Fehler und eine Die-Funktion zurückgibt, die das Skript bei Fehler abbricht
Noch einfacher - einfach benutzen
set -u
set -u
stellt sicher, dass jede referenzierte Variable festgelegt ist, wenn sie verwendet wird. Legen Sie sie einfach fest und vergessen Sie siequelle