如何在 Bash Case 语句中使用条件构造?

如何在 Bash Case 语句中使用条件构造?

我需要使用 Bash shell 检查从包装脚本内部启动的两个子脚本的返回代码。

如果任一下脚本失败,它们将产生一个负整数作为返回代码。如果脚本有小错误,它将产生一个正整数。如果执行完全成功,返回代码将为 0。

我想创建一个变量,以便根据结果获取另一个变量的内容。目前我正在使用一个丑陋的if elif结构,但感觉我应该使用一个case语句。

这是我当前的代码:

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

我该如何重组它?

注意:如果这个问题更适合另一个 SE 网站,请告诉我。

答案1

类似这样的方法应该可以解决问题。我认为这样看起来不错:

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

答案2

这就像@imjoris的答案,但我把数学分解了。它是三进制的,其中 0 是 0,1 是正数,2 是负数。我重新整理了你的列表,让它更清楚——希望这不会让你困惑 :-)

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

顺便说一句,StackOverflow 可能是解决此类复杂脚本问题的更好的网站。

相关内容