Considere duas expressões condicionais expr1e expr2, por exemplo, $i -eq $je $k -eq $l. Podemos escrever isso de bashvárias maneiras. Aqui estão duas possibilidades
[[ expr1 || expr2 ]]
[[ expr1 ]] || [[ expr2 ]]
Tenho certeza de que vi recomendações aqui de que o segundo deveria ser preferido, mas não consigo encontrar evidências para apoiar isso.
Aqui está um exemplo de script que parece demonstrar que não há diferença:
for i in 0 1
do
for j in 0 1
do
for k in 0 1
do
for l in 0 1
do
if [[ $i -eq $j || $k -eq $l ]]; then printf "1-yes\t"; else printf "1-no\t"; fi
if [[ $i -eq $j ]] || [[ $k -eq $l ]]; then printf "2-yes\n"; else printf "2-no\n"; fi
done
done
done
done
e saída mostrando que ambas as construções de condição produzem o mesmo resultado:
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-no 2-no
1-no 2-no
1-yes 2-yes
1-yes 2-yes
1-no 2-no
1-no 2-no
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
1-yes 2-yes
Existe algum benefício em usar uma construção sobre a outra?
Para pontos de bônus, a mesma pergunta, mas generalizando para várias condições usando ||e &&. Por exemplo [[ expr1 && expr2 || expr3 ]],.
[outest( não[[), procure asOBtags (vinculadas à definição "obsolescente") na especificação POSIX paratest. Emtest, existem alguns casos patológicos em que pode ser impossível dizer se(ou)pretende ser sintaxe significativo para o comando de teste ou uma string a ser testados, para que as pessoas que ignoram os marcadores obsolescência e usam essa sintaxe pode realmente precisa do otherwise-"x$foo"prática obsoleta ; com[[, isso não é um problema.