2017-06-06 86 views
1

有没有办法编写一个更优雅的代码,它考虑多种可能的组合而不是编写冗长的if-else语句?在bash中改进long if-else语句

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

{
semester1 grade1 final_grade1
semester1a grade1a final_grade1a
}

{
semester2 grade2 final_grade2
semester2a grade2a final_grade2a
}

我已经WR我的数据的所有可能的逻辑组合伊顿代码:

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 

有没有检查这更好的办法?

+1

什么定义更好?任何代码行数较少的代码可能更难以让另一个人维​​护。至少在这里,意图是什么是无法理解的。 (将被bash精英的成员证明是错误的;-)。祝你好运。 – shellter

+0

[codereview.se]通常更欢迎在没有提出特定技术问题的情况下改进工作代码的问题。 –

+0

我喜欢这个问题。真值表(这本质上是这样)是可爱的,但很少有脚本语言似乎支持它们作为数据结构。对我来说,这感觉就像是在计算机科学中错过了一次机会。 – sampablokuper

回答

1

此循环可能会这样做。你需要的第二个为第二学期或也许把它变成一个函数,然后使瓦尔地方:

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 
0

如果你没有做计算;我只想指定一个默认值未定义的变量(“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是非常缺乏

+0

不幸的是,这些数据也将用于一些计算 – Afungus