Sind ["$ VAR" = ""] und [-z "$ VAR"] immer gleichwertig?

8

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_stringerscheint und in $VAR.

Gibt es einen funktionalen Unterschied zwischen [ -z "$VAR" ]und [ "$VAR" = "" ]?

Minix
quelle
3
==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 =.
10b0
@ l0b0 kopierte das ==von irgendwoher. Mein Fehler.
Minix

Antworten:

5

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" = "" ] if VARein gültiger Test (z. B. if VARis -z) schlimme Dinge passieren , insbesondere wenn [(oder test) keine eingebaute Shell ist. Aber auf bashoder zshdas [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 -zes 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.

Basile Starynkevitch
quelle
5
Ich war mir sicher, dass [ "$VAR" = "" ]das falsch war, denn wenn der Inhalt von $VARmit einem Bindestrich beginnen würde, würde dies zu einem Syntaxfehler führen, zum Beispiel wenn er $VARenthä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!
Celada
@ Celada: Ich denke, dein Punkt ist wahr für die seltenen Muscheln, in denen testes keine eingebauten gibt.
Basile Starynkevitch
1
Ich denke, dass sich Shell-Einbauten in Bezug auf Erweiterungen genauso verhalten sollten wie externe Befehle. Haben Sie es nicht mit Schlüsselwörtern wie [[in bash verwechselt ? Sie sind wirklich unterschiedlich. --- Ich beobachte kein spezielles Verhalten bezüglich der variablen Erweiterung mit dem testEinbau von Bash.
Pabouk
Ich habe getestet mitzsh
Basile Starynkevitch
@ Celada eigentlich, Sie haben Recht, es gibt einfach so viele Dinge, die schief gehen könnten, [ "$VAR" = "" ]die sicherer zu verwenden sind -z.
Braiam