Observe que isso [] && cmdnão é o mesmo que if .. ficonstrução.
Às vezes, seu comportamento é bastante semelhante e você pode usar em [] && cmdvez de if .. fi. Mas apenas algumas vezes. Se você tiver mais de um comando para executar se condição ou precisar de if .. else .. ficuidado e qual 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 lsfalhar, echoserá 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 essa construção atue da mesma maneira
[ -z "$VAR" ] && { ls file ; echo wiii ; }
observe que o ;eco é importante e deve estar lá.
Então, retomando a declaração acima, podemos dizer
[] && cmd == se o primeiro comando for bem sucedido, execute o próximo
if .. fi == se condição (que também pode ser o comando de teste), execute o (s) comando (s)
Portanto, apenas para portabilidade [e [[uso [.
ifé compatível com POSIX. Então, se você tiver que escolher entre [e ifescolher a olhar para a sua tarefa e comportamento esperado.
[ … ]vs[[ … ]]vstest …, há respostas mais completas nesta pergunta quase duplicada .