【问题标题】:Improving a long if-else statement in bash改进 bash 中的长 if-else 语句
【发布时间】:2017-11-07 21:52:00
【问题描述】:

有没有办法编写一个比编写冗长的 if-else 语句更优雅的代码来考虑多种可能的组合?

我有如下随机生成的数据集,但有些行有时可能为空。

{
学期 1 年级 1 final_grade1
学期 1a 等级 1a 期末_等级 1a
}

{
学期 2 年级 2 final_grade2
学期2a 等级2a final_grade2a
}

我已经为我的数据的所有可能的逻辑组合编写了代码:

if [[ -n $semester1 && -z $semester1a && -z $semester2 && -z $semester2a ]]; then
echo "Section 1:$semester1=$grade1, final grade for $semester1=$final_grade1 ."

elif [[ -n $semester1 && -n $semester1a && -z $semester2 && -z $semester2a ]]; then
echo "Section 1:$semester1=$grade1, $semester1a=$grade1a, final grade for $semester1=$final_grade1, final grade for $semester1a=$final_grade1a."

elif [[ -n $semester1 && -n $semester1a && -n $semester2 && -z $semester2a ]]; then
echo "Section 1:$semester1=$grade1, $semester1a=$grade1a, final grade for $semester1=$final_grade1, final grade for $semester1a=$final_grade1a."
echo "Section 2:$semester2=$grade2, final grade for $semester2=$final_grade2 ."

elif [[ -n $semester2 && -z $semester2a && -z $semester1 && -z $semester1a ]]; then
echo "Section 2:$semester2=$grade2, final grade for $semester2=$final_grade2 ."

elif [[ -n $semester2 && -n $semester2a && -z $semester1 && -z $semester1a ]]; then
echo "Section 2:$semester2=$grade2, $semester2a=$grade2a, final grade for $semester2=$final_grade2, final grade for $semester2a=$final_grade2a, ."

elif [[ -n $semester2 && -n $semester2a && -n $semester1 && -z $semester1a ]]; then
echo "Section 1:$semester1=$grade1, final grade for $semester1=$final_grade1 ."
echo "Section 2:$semester2=$grade2, $semester2a=$grade2a, final grade for $semester2=$final_grade2, final grade for $semester2a=$final_grade2a, ."

elif [[ -n $semester2 && -n $semester2a && -n $semester1 && -n $semester1a ]]; then
echo "Section 1:$semester1=$grade1, $semester1a=$grade1a, final grade for $semester1=$final_grade1, final grade for $semester1a=$final_grade1a, ."
echo "Section 2:$semester2=$grade2, $semester2a=$grade2a, final grade for $semester2=$final_grade2, final grade for $semester2a=$final_grade2a, ."

fi

有没有更好的检查方法?

【问题讨论】:

  • 什么定义更好?任何代码行数较少的代码都可能更难让其他人维护。至少,在这里,意图是什么是可辨认的。 (bash 精英的成员将很高兴地证明这是错误的;-)。祝你好运。
  • 在不提出具体技术问题的情况下寻求改进工作代码的方法的问题通常更欢迎Code Review
  • 我喜欢这个问题。真值表(本质上就是这样)很可爱,但似乎很少有脚本语言支持它们作为数据结构。对我来说,这感觉就像错过了计算机科学领域的机会。

标签: bash shell unix if-statement scripting


【解决方案1】:

这个循环可能会做到。第二学期你需要第二个,或者可能把它变成一个函数,然后把 vars 本地化:

if [[ -n $semester1 ]]; then
  section="Section 1:$semester1=$grade1"
  final="final grade for $semester1=$final_grade1"
  if [[ -n $semester1a ]]; then
    section="$section, $semester1a=$grade1a"
    final="$final, final grade for $semester1a=$final_grade1a."
  fi
  echo "$section, $final"
fi

【讨论】:

    【解决方案2】:

    如果您不进行计算;我只会为未定义的变量分配一个默认值(也许是“n/a”?)

    : ${semester1:=n/a} ${semester1a:=n/a} ${semester2:=n/a} ${semester2a:=n/a}
    : ${grade1:=n/a} ${grade1a:=n/a} ${grade2:=n/a} ${grade2a:=n/a}
    : ${final_grade1:=n/a} ${final_grade1a:=n/a} ${final_grade2:=n/a} ${final_grade2a:=n/a}
    echo "Section 1:$semester1=$grade1, $semester1a=$grade1a, final grade for $semester1=$final_grade1, final grade for $semester1a=$final_grade1a, ."
    echo "Section 2:$semester2=$grade2, $semester2a=$grade2a, final grade for $semester2=$final_grade2, final grade for $semester2a=$final_grade2a, ."
    

    不过,这项任务需要 bash 严重缺乏的数据结构,如列表和字典/哈希/映射。

    【讨论】:

    • 很遗憾,这些数据也会用于一些计算
    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2017-05-13
    相关资源
    最近更新 更多