Ich muss das Vorhandensein 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 existiert?
Es ist:
if [ $# -eq 0 ]
then
echo "No arguments supplied"
fi
Die Variable $#
gibt an, wie viele Eingabeargumente das Skript übergeben hat.
Oder Sie können überprüfen, ob ein Argument eine leere Zeichenfolge ist oder nicht:
if [ -z "$1" ]
then
echo "No argument supplied"
fi
Der Schalter -z
testet, ob die Erweiterung von "$ 1" eine Nullzeichenfolge ist oder nicht. Wenn es sich um eine Nullzeichenfolge handelt, wird der Text ausgeführt.
Es ist besser, diesen Weg zu demonstrieren
if [[ $# -eq 0 ]] ; then
echo 'some message'
exit 1
fi
Normalerweise müssen Sie beenden, wenn Sie zu wenige Argumente haben.
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 Skript unten:
scale=${2:-1}
emulator @$1 -scale $scale
Wenn der Benutzer scale
nicht als zweiten Parameter übergeben hat, starte ich Android Emulator standardmäßig mit -scale 1
. ${varname:-Word}
ist ein Expansionsoperator. Es gibt auch andere Expansionsbetreiber:
${varname:=Word}
, der den undefinierten varname
setzt , anstatt den Word
-Wert zurückzugeben;${varname:?message}
, das entweder varname
zurückgibt, wenn es definiert ist und nicht null ist, oder das message
ausgibt und das Skript abbricht (wie im ersten Beispiel);${varname:+Word}
, das Word
nur zurückgibt, wenn varname
definiert ist und nicht null ist; Gibt sonst null zurück.Versuchen:
#!/bin/bash
if [ "$#" -eq "0" ]
then
echo "No arguments supplied"
else
echo "Hello world"
fi
Eine andere Möglichkeit, festzustellen, ob Argumente an das Skript übergeben wurden:
((!$#)) && echo No arguments supplied!
Beachten Sie, dass (( expr ))
bewirkt, dass der Ausdruck gemäß den Regeln von Shell Arithmetic ausgewertet wird.
Um ohne Argumente auszusteigen, kann man sagen:
((!$#)) && echo No arguments supplied! && exit 1
Eine andere (analoge) Möglichkeit, das Obige zu sagen, wäre:
let $# || echo No arguments supplied
let $# || { echo No arguments supplied; exit 1; } # Exit if no arguments!
help let
sagt:
let: let arg [arg ...]
Evaluate arithmetic expressions. ... Exit Status: If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.
Ich benutze dieses Snippet oft für einfache Skripte:
#!/bin/bash
if [ -z "$1" ]; then
echo -e "\nPlease call '$0 <argument>' to run this command!\n"
exit 1
fi
Nur weil es einen weiteren Basispunkt gibt, möchte ich hinzufügen, dass Sie einfach testen können, ob Ihre Zeichenfolge null ist:
if [ "$1" ]; then
echo yes
else
echo no
fi
Ebenso, wenn Sie Arg Count erwarten, testen Sie einfach Ihren letzten:
if [ "$3" ]; then
echo has args correct or not
else
echo fixme
fi
und so weiter mit jedem arg oder var
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
#!/usr/bin/env bash
if [ $# -ge 3 ]
then
echo script has at least 3 arguments
fi
erzeugt die folgende Ausgabe
$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments
Zur Erinnerung: Die numerischen Testoperatoren in Bash arbeiten nur mit Ganzzahlen (-eq
, -lt
, -ge
usw.).
Ich möchte sicherstellen, dass meine $ vars ints von sind
var=$(( var + 0 ))
bevor ich sie teste, nur um mich gegen den Fehler "[: integer arg required" zu verteidigen.