Testbedingung im if-Befehl

Testbedingung im if-Befehl

Irgendeine Idee, warum echodie Anweisung in beiden Szenarien ausgeführt wird?

Ausgaben it worked:

#!/bin/bash

rizwan=''
if [ -n $rizwan ]; then
  echo "it worked"
fi

Ersetzen Sie -nes durch -z, und es wird ausgegeben, it workedwenn keine Ausgabe erwartet wird:

#!/bin/bash

rizwan=''
if [ -z $rizwan ]; then
  echo "it worked"
fi

Antwort1

Sie wissen es vielleicht oder auch nicht, aber lassen Sie es uns klarstellen: [ist kein Teil der ifSyntax. Ich meine, if [ …verhält sich wie if true, if falseoder if any_command, wobei [, true, falseund any_commandBefehle sind. Sie geben den Beendigungsstatus zurück und das ist es, was für zählt if.

Auch wenn [es ein integriertes Kommando ist (und das ist es in Bash), verhält es sich wie ein normaler Befehl. Es gibt sogar eine eigenständige [ausführbare Datei (z. B. /usr/bin/[), weil POSIX dies erfordert.

Das bedeutet, [ -n whatever ]dass es sich nur um einen [Befehl mit wenigen Argumenten handelt. Ja, ]es ist nur ein Argument, kein Trennzeichen oder ähnliches. Der benannte Befehl [muss nur ]das letzte Argument sein. Auf diese Weise ist der Code lesbarer und ]dient keinem anderen Zweck.

Der Befehl testist gleichwertig mit [. Der einzige Unterschied besteht darin, testdass kein erforderlich ist ].
[ -n whatever ]ist gleichwertig mit test -n whatever.

Wenn die Shell zu einem leeren String erweitert wird , werden $rizwandie Snippets [ -n $rizwan ]und zu bzw. . Der Befehl erkennt nicht, dass in Ihrem Code etwas zwischen (oder ) und war, er erhält genau zwei Argumente. Beide Tests werden als Syntax behandelt, wobei entweder oder ist . Diese Syntax prüft, ob nicht leer ist. Ihre Tests sind immer erfolgreich, da weder noch ein leerer String ist.[ -z $rizwan ][ -n ][ -z ][-n-z][ STRING ]STRING-n-zSTRING-n-z

[ -n STRING ]Damit die Snippets als oder funktionieren [ -z STRING ], müssen Sie die Variable in doppelte Anführungszeichen setzen. Die Shell [ -z "$rizwan" ]übergibt nach der Erweiterung genaudreiArgumente für [. Dies sind -z, der erweiterte Wert der Variablen (auch wenn es sich um eine leere Zeichenfolge handelt) und ]. Das Tool erhält alle gewünschten Argumente.

Wenn $rizwanin Ihren Beispielen keine Anführungszeichen verwendet werden, die auf mehr als ein Wort erweitert werden, [würden mehr als drei Argumente entstehen. Im Allgemeinen würde das Endergebnis vom Variableninhalt und der Implementierung von abhängen [.

VergleichenWarum gerät mein Shell-Skript ins Stocken, wenn es sich um Leerzeichen oder andere Sonderzeichen handelt?.

Beachten Sie, [[dass in Bash das anders ist. Es ist ein Schlüsselwort, es ist in den Shell-Parser integriert, es ändert einige Regeln, es erkennt tatsächlich Variablen und Anführungszeichen zwischen [[und ]]. Wenn Sie [[anstelle von [(und folglich ]]anstelle von ]) verwenden würden, würde Ihr Code wie erwartet funktionieren. Siehediese Antwort.

[ist das tragbare.

Antwort2

Da die Variable rizwanleer ist, iflautet Ihr Befehl:

if [ -n  ]

Die Syntax [ STRING ]prüft, ob die Zeichenfolge leer ist (keine Zeichen). In Ihrem Fall ist [ -n ]die Zeichenfolge also -noffensichtlich nicht leer.

verwandte Informationen