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_string
aparezca y poner en $VAR
.
¿Hay alguna diferencia funcional entre [ -z "$VAR" ]
y [ "$VAR" = "" ]
?
shell-script
Minix
fuente
fuente
==
es una sintaxis incorrecta, pero funciona en muchos shells (presumiblemente porque es memoria muscular para cualquiera que use otros idiomas). Deberías estar usando=
.==
de alguna parte. Mi error.Respuestas:
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" = "" ]
siVAR
es una prueba válida (por ejemplo, si loVAR
es-z
), en particular cuando[
(otest
) no es un shell incorporado. Pero onbash
ozsh
the[
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
-z
podrí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.fuente
[ "$VAR" = "" ]
estaba mal porque si el contenido de$VAR
comenzara con un guión, entonces conduciría a un error de sintaxis, por ejemplo, si$VAR
contiene,-z
entonces 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$VAR
durante décadas, ¡quizás innecesariamente!test
no está integrado.[[
en bash? Son realmente diferentes --- No observo ningún comportamiento especial con respecto a la expansión variable con eltest
desarrollo de bash.zsh
[ "$VAR" = "" ]
que es más seguro usar-z
.