Por favor, note que [] && cmd não é o mesmo que if .. fi construção.
Às vezes, seu comportamento é bem parecido e você pode usar [] && cmd em vez de if .. fi . Mas só às vezes. Se você tiver mais de um comando para executar, se condição, ou você precisar de if .. else .. fi , seja cuidadoso e mostre a lógica.
Alguns exemplos:
[ -z "$VAR" ] && ls file || echo wiiii
Não é o mesmo que
if [ -z $VAR ] ; then
ls file
else
echo wiii
fi
porque se ls falhar, echo será executado, o que não acontecerá com if .
Outro exemplo:
[ -z "$VAR" ] && ls file && echo wiii
não é o mesmo que
if [ -z "$VAR" ] ; then
ls file
echo $wiii
fi
embora esta construção funcione da mesma forma
[ -z "$VAR" ] && { ls file ; echo wiii ; }
observe ; após o eco ser importante e estar presente.
Então, resumindo a declaração acima, podemos dizer
[] && cmd == se o primeiro comando for bem sucedido, então execute o próximo
if .. fi == se condição (que pode ser o comando de teste também) então execute o comando (s)
Portanto, para portabilidade entre [ e [[ use [ apenas.
if é compatível com POSIX. Então, se você tiver que escolher entre [ e if , escolha sua tarefa e comportamento esperado.