Estou trabalhando com o Bash 3 e tentando formar uma condicional. Em C / C ++, a sua simples mortos: ((A || B) && C)
. No Bash, não está sendo assim (acho que os autores do Git devem ter contribuído com esse código antes de avançarem para outros empreendimentos).
Isso não funciona. Observe que <0 or 1>
não é uma string literal; significa 0 ou 1 (geralmente vem grep -i
).
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ [ "$A" -eq "0" ] || [ "$B" -ne "0" ] ] && [ "$C" -eqe "0" ]; then ... fi
Isso resulta em:
line 322: syntax error near unexpected token `[['
Eu então tentei:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ ([ "$A" -eq "0" ]) || ([ "$B" -ne "0" ]) ] && [ "$C" -eq "0" ]; then ... fi
resulta em:
line 322: syntax error near unexpected token `[['
Parte do problema é que os resultados da pesquisa são exemplos triviais, e não os exemplos mais complexos com condicionais compostos.
Como faço para executar um simples ((A || B) && C)
no Bash?
Estou pronto para desenrolá-lo e repetir os mesmos comandos em vários blocos:
A=<0 or 1>
B=<0 or 1>
C=<0 or 1>
if [ "$A" -eq "0" ] && [ "$C" -eq "0" ]; then
...
elif [ "$B" -ne "0" ] && [ "$C" -eq "0" ]; then
...
fi
[[ … ]]
foi adicionado no bash 2.02.((…))
foi adicionado no bash 2.0.||
e a&&
mudança de[
para[[
e((
. Igual precedência em[
(use parênteses para controlar a ordem da avaliação), mas && tem maior precedência em[[
e((
que||
(como em C).Use
[[
:Se preferir
[
, o seguinte funciona:fonte
Use o
-o
operador em vez do seu aninhado ||. Você também pode-a
substituir &&, se necessário, em suas outras declarações.fonte
-a
e-o
, mas não experimentei com eles. Alguém no Stack Overflow disse para evitá-lo. Eu concordei com eles principalmente porque o script é menos legível usando-os.[[ ( "$A" -eq "0" || "$B" -ne "0" ) && "$C" -eq "0" ]]
terá problemas com eles?bash
ou qualquer outro shell que entenda[[ ... ]]
.