¿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" = "" ]?


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.