Mein Code sieht ungefähr so aus:
VAR=""
while [ -z "$VAR" ]; do
VAR=$( command | grep "important_string" )
done
Also möchte ich die Ausgabe von abfragen command
, bis die important_string
erscheint und in $VAR
.
Gibt es einen funktionalen Unterschied zwischen [ -z "$VAR" ]
und [ "$VAR" = "" ]
?
shell-script
Minix
quelle
quelle
==
ist eine falsche Syntax, funktioniert aber in vielen Shells (vermutlich, weil es für jeden, der andere Sprachen verwendet, Muskelgedächtnis ist). Sie sollten verwenden=
.==
von irgendwoher. Mein Fehler.Antworten:
Ja, sie (
[ -z "$VAR" ]
und[ "$VAR" = "" ]
...) sind gleichwertig. Beide testen auf Leere von$VAR
(z. B. wenn es nicht gebunden oder auf eine leere Zeichenfolge gesetzt ist).Wie von Celada kommentiert , können bei der Verwendung von
[ "$VAR" = "" ]
ifVAR
ein gültiger Test (z. B. ifVAR
is-z
) schlimme Dinge passieren , insbesondere wenn[
(odertest
) keine eingebaute Shell ist. Aber aufbash
oderzsh
das[
ist ein eingebautes und das scheint kein Problem zu sein. Sie könnten[ "x$VAR" = "x" ]
für Ihren Test verwenden. Siehe Test (1)Natürlich gehe ich von einer POSIX-Shell oder ähnlichem aus.
Möglicherweise ist
-z
es etwas schneller (aber Sie sollten sich nicht um Mikrosekunden in Shell-Skripten kümmern), und Sie werden möglicherweise feststellen=
, dass es besser lesbar ist.quelle
[ "$VAR" = "" ]
das falsch war, denn wenn der Inhalt von$VAR
mit einem Bindestrich beginnen würde, würde dies zu einem Syntaxfehler führen, zum Beispiel wenn er$VAR
enthält-z
, würde er sich erweitern zu[ -z = "" ]
- würde dieser Test, wenn er=
leer ist (was er nicht ist)? und dann""
als fremdes Argument behandeln? Aber ich kann es nicht so scheitern lassen, jetzt wo ich es versuche, nachdem ich Ihre Antwort gelesen habe! Ich benutze seit Jahrzehnten Konstruktionen[ "x$VAR" = "xfoo" ]
, um mich vor Sonderzeichen zu schützen$VAR
, vielleicht unnötig!test
es keine eingebauten gibt.[[
in bash verwechselt ? Sie sind wirklich unterschiedlich. --- Ich beobachte kein spezielles Verhalten bezüglich der variablen Erweiterung mit demtest
Einbau von Bash.zsh
[ "$VAR" = "" ]
die sicherer zu verwenden sind-z
.