No bash (e shells similares), [ x ] && y || z
é uma maneira abreviada idiomática de escrever if [ x ] ; then y ; else z ; fi
, quando y
é uma declaração simples que não pode / não pode ser avaliada como false
. É útil quando você não quer perder 5 linhas de valioso espaço vertical de tela / editor para um teste simples.
Por "idiomática", quero dizer que é uma prática comum de programação shell. Um que aproveita a maneira como o AND lógico ( &&
) e OR ( ||
) funcionam no shell. y
é executado se x
for verdadeiro. z
é executado se x
for falso ... a captura é que z
é também executado se x
for true e y
for executado, mas for avaliado como falso (isto é, retorna um código de saída diferente de zero) - é por isso que não deve ser usado se houver alguma chance de isso ocorrer. por exemplo. [ -z "" ] && false || echo 1
produz "1", mesmo que a condição -z ""
seja verdadeira.
Em outras palavras, é (quase) equivalente a:
if [ -z "" ] ; then
echo 0
else
echo 1
fi
Esta construção if; then ... ; else ... ; fi
de formulário completo não possui a mesma falha que o formulário de atalho. Esse constructo está correto e sempre funciona, enquanto o shorthand é um hack rápido e sujo que é útil em algumas circunstâncias limitadas.
-z
testa se uma string está vazia.
Esse comando é em inglês:
If the empty string is empty then display "0", otherwise display "1".
Ele sempre exibirá "0".