Como posso usar construções condicionais em uma instrução de caso bash?

1

Eu preciso verificar os códigos de retorno de dois sub-scripts iniciados a partir de um script wrapper, usando o shell Bash.

Se algum subscrito falhar, ele produzirá um inteiro negativo como um código de retorno. Se um script tiver erros menores, ele produzirá um número inteiro positivo. Se a execução for totalmente bem-sucedida, o código de retorno será 0.

Eu quero criar definir uma variável para ter o conteúdo de outra variável com base no resultado. Atualmente estou usando uma grande e feia if elif construção, mas parece que eu deveria estar usando uma declaração case .

Este é o meu código atual:

if [[ "$sumcreate_retval" -lt "0" ]] && [[ "$movesum_retval" -lt "0" ]]
then
   script_retcode="$both_warn_err"
elif [[ "$sumcreate_retval" -gt "0" ]] && [[ "$movesum_retval" -gt "0" ]]
then
   script_retcode="$both_crit_err"
elif [[ "$sumcreate_retval" -gt "0" ]] && [[ "$movesum_retval" -lt "0" ]]
then
   script_retcode="$createwarn_movecrit_err"
elif [[ "$sumcreate_retval" -gt "0" ]] && [[ "$movesum_retval" -eq "0" ]]
then
   script_retcode="$createwarn_err"
elif [[ "$sumcreate_retval" -lt "0" ]] && [[ "$movesum_retval" -gt "0" ]]
then
   script_retcode="$createcrit_movewarn_err"
elif [[ "$sumcreate_retval" -lt "0" ]] && [[ "$movesum_retval" -eq "0" ]]
then
   script_retcode="$createcrit_err"
elif [[ "$sumcreate_retval" -eq "0" ]] && [[ "$movesum_retval" -gt "0" ]]
then
   script_retcode="$movewarn_err"
elif [[ "$sumcreate_retval" -eq "0" ]] && [[ "$movesum_retval" -lt "0" ]]
then
   script_retcode="$movecrit_err"
else
   script_retcode="$success_return"
fi

Como devo reestruturar isso?

Nota: Se esta questão é mais adequada para outro site da SE, por favor me avise.

    
por Arronical 27.07.2016 / 14:22

2 respostas

2

Algo como isso deve fazer o truque. Eu acho que parece legal assim:

case $((
  sumcreate_retval <  0 && movesum_retval <  0 ? 1 :
  sumcreate_retval >  0 && movesum_retval >  0 ? 2 :
  sumcreate_retval >  0 && movesum_retval <  0 ? 3 :
  sumcreate_retval >  0 && movesum_retval == 0 ? 4 :
  sumcreate_retval <  0 && movesum_retval >  0 ? 5 :
  sumcreate_retval <  0 && movesum_retval == 0 ? 6 :
  sumcreate_retval == 0 && movesum_retval >  0 ? 7 :
  sumcreate_retval == 0 && movesum_retval <  0 ? 8 : 
  0
)) in
  (1) script_retcode="$both_warn_err";;
  (2) script_retcode="$both_crit_err";;
  (3) script_retcode="$createwarn_movecrit_err";;
  (4) script_retcode="$createwarn_err";;
  (5) script_retcode="$createcrit_movewarn_err";;
  (6) script_retcode="$createcrit_err";;
  (7) script_retcode="$movewarn_err";;
  (8) script_retcode="$movecrit_err";;
  (0) script_retcode="success_return";;
esac
    
por imjoris 28.07.2016 / 02:36
1

Isto é como a resposta do @imjoris, mas eu terminei a matemática. É em ternário, onde 0 é 0, 1 é positivo e 2 é negativo por padrão. Eu reorganizei sua lista para torná-la mais clara - espero que isso não te atrapalhe: -)

case $((
  sumcreate_retval == 0 ? 0 :
  sumcreate_retval >  0 ? 1 :
  2
  ))$((
  movesum_retval == 0 ? 0 :
  movesum_retval >  0 ? 1 :
  2
)) in
  00) script_retcode="$success_return" ;;
  01) script_retcode="$movewarn_err" ;;
  02) script_retcode="$movecrit_err" ;;
  10) script_retcode="$createwarn_err" ;;
  11) script_retcode="$both_crit_err" ;;
  12) script_retcode="$createwarn_movecrit_err" ;;
  20) script_retcode="$createcrit_err" ;;
  21) script_retcode="$createcrit_movewarn_err" ;;
  22) script_retcode="$both_warn_err" ;;
esac

BTW, o StackOverflow é provavelmente o melhor site para perguntas complexas sobre scripts, como essas.

    
por wjandrea 28.07.2016 / 05:27