Tenga en cuenta que eso [] && cmd
no es lo mismo que la if .. fi
construcción.
A veces su comportamiento es bastante similar y puedes usarlo en [] && cmd
lugar de if .. fi
. Pero solo a veces. Si tiene más de un comando para ejecutar si la condición o necesita if .. else .. fi
tener cuidado y cambiar la lógica.
Un par de ejemplos:
[ -z "$VAR" ] && ls file || echo wiiii
No es lo mismo que
if [ -z $VAR ] ; then
ls file
else
echo wiii
fi
porque si ls
falla, echo
se ejecutará, lo que no sucederá con if
.
Otro ejemplo:
[ -z "$VAR" ] && ls file && echo wiii
no es lo mismo que
if [ -z "$VAR" ] ; then
ls file
echo $wiii
fi
aunque esta construcción actuará igual
[ -z "$VAR" ] && { ls file ; echo wiii ; }
tenga en cuenta que ;
después del eco es importante y debe estar allí.
Entonces, resumiendo la declaración anterior, podemos decir
[] && cmd
== si el primer comando es exitoso, ejecute el siguiente
if .. fi
== si la condición (que también puede ser el comando de prueba), entonces ejecute los comandos
Por lo tanto, para la portabilidad [
y el [[
uso [
solo.
if
es POSIX compatible. Entonces, si tiene que elegir [
y if
elegir mirar su tarea y el comportamiento esperado.
[ … ]
vs[[ … ]]
vstest …
, hay respuestas más completas en esta pregunta mayormente duplicada .