Wenn $VARIABLE
es sich um eine Zeichenfolge handelt, die Leerzeichen oder andere Sonderzeichen enthält, und einzelne eckige Klammern verwendet werden (dies ist eine Verknüpfung für den test
Befehl), kann die Zeichenfolge in mehrere Wörter aufgeteilt werden. Jedes dieser Argumente wird als separates Argument behandelt.
Damit eine Variable in viele Argumente aufgeteilt wird :
VARIABLE=$(/some/command);
# returns "hello world"
if [ $VARIABLE == 0 ]; then
# fails as if you wrote:
# if [ hello world == 0 ]
fi
Gleiches gilt für jeden Funktionsaufruf, der eine Zeichenfolge mit Leerzeichen oder anderen Sonderzeichen aufgibt.
Einfache Lösung
Schließen Sie die Variablenausgabe in doppelte Anführungszeichen ein und zwingen Sie sie, als eine Zeichenfolge zu bleiben (daher ein Argument). Beispielsweise,
VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
# some action
fi
So einfach ist das. Fahren Sie jedoch mit "Auch Vorsicht ..." fort, wenn Sie nicht garantieren können, dass Ihre Variable keine leere Zeichenfolge oder eine Zeichenfolge ist, die nur Leerzeichen enthält.
Oder ein alternatives fix ist doppelt eckige Klammern zu verwenden (was eine Abkürzung für den IS - new test
Befehl).
Dies existiert jedoch nur in Bash (und anscheinend in Korn und Zsh) und ist daher möglicherweise nicht mit Standard-Shells kompatibel, die von /bin/sh
usw. aufgerufen werden .
Dies bedeutet, dass es auf einigen Systemen möglicherweise von der Konsole auscron
funktioniert, jedoch nicht, wenn es an einer anderen Stelle aufgerufen wird, z. B. von , je nachdem, wie alles konfiguriert ist.
Es würde so aussehen:
VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
# some action
fi
Wenn Ihr Befehl doppelte eckige Klammern wie diese enthält und Sie Fehler in den Protokollen erhalten, diese jedoch über die Konsole funktionieren, versuchen Sie, die [[
gegen eine hier vorgeschlagene Alternative auszutauschen, oder stellen Sie sicher, dass für die Ausführung Ihres Skripts eine Shell verwendet wird, die [[
aka unterstützt new test
.
Achten Sie auch auf den [: unary operator expected
Fehler
Wenn der Fehler "Zu viele Argumente" angezeigt wird, erhalten Sie wahrscheinlich eine Zeichenfolge von einer Funktion mit unvorhersehbarer Ausgabe. Wenn es auch möglich ist, eine leere Zeichenfolge (oder alle Leerzeichen) abzurufen, wird dies selbst mit der obigen "Schnellkorrektur" als Nullargument behandelt und schlägt fehl[: unary operator expected
Es ist das gleiche "Gotcha", wenn Sie an andere Sprachen gewöhnt sind - Sie erwarten nicht, dass der Inhalt einer Variablen effektiv in den Code wie dieser gedruckt wird, bevor er ausgewertet wird.
Hier ist ein Beispiel, das sowohl die [: too many arguments
als auch die [: unary operator expected
Fehler verhindert: Ersetzen der Ausgabe durch einen Standardwert, wenn sie leer ist (in diesem Beispiel 0
), mit doppelten Anführungszeichen um das Ganze:
VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
# some action
fi
(Hier wird die Aktion ausgeführt, wenn $ VARIABLE 0 oder leer ist. Natürlich sollten Sie die 0 (den Standardwert) in einen anderen Standardwert ändern, wenn ein anderes Verhalten gewünscht wird.)
Schlussbemerkung: Da [
es sich um eine Verknüpfung für handelt test
, gilt alles oben Genannte auch für den Fehler test: too many arguments
(und auch test: unary operator expected
)