我需要使用 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 可能是解决此类复杂脚本问题的更好的网站。