Irgendeine Idee, warum echo
die Anweisung in beiden Szenarien ausgeführt wird?
Ausgaben it worked
:
#!/bin/bash
rizwan=''
if [ -n $rizwan ]; then
echo "it worked"
fi
Ersetzen Sie -n
es durch -z
, und es wird ausgegeben, it worked
wenn 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 if
Syntax. Ich meine, if [ …
verhält sich wie if true
, if false
oder if any_command
, wobei [
, true
, false
und any_command
Befehle 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 test
ist gleichwertig mit [
. Der einzige Unterschied besteht darin, test
dass kein erforderlich ist ]
.
[ -n whatever ]
ist gleichwertig mit test -n whatever
.
Wenn die Shell zu einem leeren String erweitert wird , werden $rizwan
die 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
-z
STRING
-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 $rizwan
in 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 rizwan
leer ist, if
lautet Ihr Befehl:
if [ -n ]
Die Syntax [ STRING ]
prüft, ob die Zeichenfolge leer ist (keine Zeichen). In Ihrem Fall ist [ -n ]
die Zeichenfolge also -n
offensichtlich nicht leer.