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.