Afungus
Afungus

Reputation: 103

Improving a long if-else statement in bash

Is there a way to write a more elegant code which considers multiple possible combinations than writing a lengthy if-else statement?

I have randomly generated data sets like the ones below but some of the rows can be null sometimes.

{
semester1 grade1 final_grade1
semester1a grade1a final_grade1a
}

{
semester2 grade2 final_grade2
semester2a grade2a final_grade2a
}

I have already written code for all the possible logical combinations of my data:

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

Is there a better way for checking this?

Upvotes: 1

Views: 113

Answers (2)

mgamba
mgamba

Reputation: 1199

This loop might do it. You'd need a second one for the 2nd semester or maybe turn it into a function and then make the vars local:

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

Upvotes: 1

chepner
chepner

Reputation: 531175

If you aren't doing calculations; I would just assign a default value to undefined variables ("n/a" perhaps?)

: ${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, ."

This task cries out, though, for data structures like lists and dicts/hashes/maps that bash is sorely lacking in.

Upvotes: 0

Related Questions