Mixagem se ..; com {agrupamento de comandos} e [[teste]] e operadores lógicos [fechados]

4

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?

    
por afuna 16.08.2018 / 20:24

3 respostas

4

Você pode usar um subshell para agrupá-lo:

if cmd1 || ( [[ "$x" == 'z' ]] && cmd2 ); then
  ...
else
  ...
fi
    
por 16.08.2018 / 20:27
4

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
    
por 16.08.2018 / 21:03
0

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.

    
por 16.08.2018 / 23:28