Tenga en cuenta que eso [] && cmdno es lo mismo que la if .. ficonstrucción.
A veces su comportamiento es bastante similar y puedes usarlo en [] && cmdlugar de if .. fi. Pero solo a veces. Si tiene más de un comando para ejecutar si la condición o necesita if .. else .. fitener 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 lsfalla, echose 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.
ifes POSIX compatible. Entonces, si tiene que elegir [y ifelegir mirar su tarea y el comportamiento esperado.
[ … ]vs[[ … ]]vstest …, hay respuestas más completas en esta pregunta mayormente duplicada .