Você pode usar um subshell para agrupá-lo:
if cmd1 || ( [[ "$x" == 'z' ]] && cmd2 ); then
...
else
...
fi
Editar : tentei novamente e agora funciona bem em bash
. Eu não sei o que mudou. Meu editor (extensão VS Code with Bash IDE) ainda me fornece um erro failed to parse
, mas o script é executado corretamente. Devo excluir a pergunta?
Pergunta original
Meu script atualmente faz isso:
if cmd1; then
echo Success
else
if [[ "$x" == "z" ]] && cmd2; then
echo Success
else
echo Failure
fi
fi
Eu tenho tentado encurtar isso para um 'one-liner', mas bash
engasga com uma afirmação como esta:
if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
echo Success
else
echo Failure
fi
Eu acho que o { grouping }
é necessário porque senão o && cmd
será sempre executado. Como posso consertar isso?
Você pode usar um subshell para agrupá-lo:
if cmd1 || ( [[ "$x" == 'z' ]] && cmd2 ); then
...
else
...
fi
Funciona bem:
cmd1() { return 1; }
cmd2() { return 0; }
x=z
if cmd1 || { [[ "$x" = "z" ]] && cmd2; }; then
echo Success
else
echo Failure
fi
Success
Tem a certeza de que não está a executar este código em sh
? Isso vai te dar algo parecido com
sh: 4: [[: not found
O código na pergunta deve funcionar bem em um shell real, mas eu posso entender que algum outro programa pode não ser capaz de analisá-lo. Supondo que não podemos consertar esse programa, uma solução alternativa pode ser dividir a segunda parte da condição em uma função:
cond2() { [[ "$x" = "z" ]] && cmd2; }
if cmd1 || cond2; then
...
Isso não é tão breve, mas se o analisador vale qualquer coisa , ele deve ser capaz de analisar essa definição de função.
Tags bash test shell-script