AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 803568
Accepted
Arronical
Arronical
Asked: 2016-07-28 04:22:18 +0800 CST2016-07-28 04:22:18 +0800 CST 2016-07-28 04:22:18 +0800 CST

如何在 bash case 语句中使用条件构造?

  • 772

我需要使用 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 站点,请告诉我。

command-line
  • 2 2 个回答
  • 176 Views

2 个回答

  • Voted
  1. Best Answer
    imjoris
    2016-07-28T16:36:55+08:002016-07-28T16:36:55+08:00

    像这样的东西应该可以解决问题。我觉得这样看起来不错:

    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
  2. wjandrea
    2016-07-28T19:27:16+08:002016-07-28T19:27:16+08:00

    这就像@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 可能是解决此类复杂脚本问题的更好站点。

    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve