¿Son [“$ VAR” = “”] y [-z “$ VAR”] siempre equivalentes?

8

Mi código se parece a esto:

VAR=""

while [ -z "$VAR" ]; do
  VAR=$( command | grep "important_string" )
done

Así que quiero sondear la salida de command, hasta que important_stringaparezca y poner en $VAR.

¿Hay alguna diferencia funcional entre [ -z "$VAR" ]y [ "$VAR" = "" ]?

Minix
fuente
3
==es una sintaxis incorrecta, pero funciona en muchos shells (presumiblemente porque es memoria muscular para cualquiera que use otros idiomas). Deberías estar usando =.
l0b0
@ l0b0 copió el ==de alguna parte. Mi error.
Minix

Respuestas:

5

Sí, ellos ( [ -z "$VAR" ]y [ "$VAR" = "" ]...) son equivalentes. Ambos están probando el vacío de $VAR(p. Ej., Cuando no está vinculado o configurado en una cadena vacía).

Como comentó Celada , pueden ocurrir cosas malas cuando se usa [ "$VAR" = "" ] si VARes una prueba válida (por ejemplo, si lo VARes -z), en particular cuando [(o test) no es un shell incorporado. Pero on basho zshthe [es un incorporado y eso no parece ser un problema. Podrías usar [ "x$VAR" = "x" ]para tu prueba. Ver prueba (1)

Por supuesto, estoy asumiendo un shell POSIX o algo similar.

Quizás -zpodría ser un poco más rápido (pero no debería importarle los microsegundos en los scripts de shell) y =quizás le resulte más legible.

Basile Starynkevitch
fuente
55
Pensé con certeza que eso [ "$VAR" = "" ]estaba mal porque si el contenido de $VARcomenzara con un guión, entonces conduciría a un error de sintaxis, por ejemplo, si $VARcontiene, -zentonces se expandiría a [ -z = "" ]- si esa prueba estuviera =vacía (que no lo está) y luego tratarlo ""como un argumento extraño? ¡Pero no puedo hacer que falle de esa manera ahora que lo intento después de leer tu respuesta! He estado usando construcciones como [ "x$VAR" = "xfoo" ]para protegerme de personajes especiales $VARdurante décadas, ¡quizás innecesariamente!
Celada
@Celada: Creo que su punto es cierto para las conchas raras donde testno está integrado.
Basile Starynkevitch
1
Creo que con respecto a las expansiones, los complementos integrados de shell deberían comportarse de la misma manera que los comandos externos. ¿No lo confundiste con palabras clave como [[en bash? Son realmente diferentes --- No observo ningún comportamiento especial con respecto a la expansión variable con el testdesarrollo de bash.
pabouk
zsh
Probé
@Celada en realidad, tienes razón, hay tantas cosas que podrían salir mal [ "$VAR" = "" ]que es más seguro usar -z.
Braiam