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" = "" ]?
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" = "" ]siVARes una prueba válida (por ejemplo, si loVARes-z), en particular cuando[(otest) no es un shell incorporado. Pero onbashozshthe[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.fuente
[ "$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!testno está integrado.[[en bash? Son realmente diferentes --- No observo ningún comportamiento especial con respecto a la expansión variable con eltestdesarrollo de bash.zsh[ "$VAR" = "" ]que es más seguro usar-z.