Grade calculation in shell script | Shell Scripting

If you are trying to learn bash scripting and want to learn arithmetic operations and arrays in bash then this example will be helpful to you.

Here we are using bash scripting to calculate average, minimum and maximum grade and its subsequent letter grade using bubble sorting. Bubble sort, sometimes referred to as sinking sort, is a simple sorting algorithm that works by repeatedly stepping through the list to be sorted, comparing each pair of adjacent items and swapping them if they are in the wrong order. The pass through the list is repeated until no swaps are needed, which indicates that the list is sorted. If you are sorting the data in Ascending order, at the end of the first pass, the  “heaviest” element has move to bottom. In the second pass, the comparisons are made till the last but one position and now second largest element is placed at the last but one position. And so forth.

Below is the script written in bash:
Script Name: bubblearray.sh

#!/bin/bash
#####################################################################
# Define Functions Here #
#####################################################################

printnumbers()
{
echo ${ARRAY[*]}

#You can also use bellow code
#for ((i=0;i<count;i++))
#do
#echo -n " ${ARRAY[i]} "
#done
}

exchange()
{
temp=${ARRAY[$1]}

ARRAY[$1]=${ARRAY[$2]}

ARRAY[$2]=$temp

}

sortnumbers()
{
for (( last=count-1;last>0;last--))
do
for((i=0;i<last;i++))
do
j=$((i+1))
if [ ${ARRAY[i]} -gt ${ARRAY[j]} ]
then

exchange $i $j

fi
done
done
}

#Checking the overall grade according to average marks scored.

gradecalc(){

ifgrade=$1

if [[ $ifgrade -ge 90 && $ifgrade -le 100 ]]; then
echo "A"

elif [[ $ifgrade -ge 80 && $ifgrade -le 89 ]]; then

echo "B"

elif [[ $ifgrade -ge 70 && $ifgrade -le 79 ]]; then
echo "C"
elif [[ $ifgrade -ge 60 && $ifgrade -le 69 ]]; then
echo "D"

elif [[ $ifgrade -ge 0 && $ifgrade -le 59 ]]; then
echo "F"
else
echo "Incorrect Value Entered"

fi
}
#####################################################################
# Variable Initialization #
#####################################################################

echo "------------------------------------------";
echo "| Available Grades :- |";
echo "| Very Good : A (90+%) |";
echo "| Good : B (80+%) |";
echo "| Fair : C (70+%) |";
echo "| Average : D (60+%) |";
echo "| Failed : F (59-%) |";
echo "------------------------------------------";

echo "Enter the list of grades to be Sorted"

read -a ARRAY

count=${#ARRAY[@]}

#####################################################################
# Main Script Starts Here #
#####################################################################

echo "--------------------------------------------------------------"

echo "All Grades Before bubble Sort :"

printnumbers

echo

sortnumbers

echo "All Grades After bubble Sort : "

printnumbers

echo "--------------------------------------------------------------"

sum=$(
awk 'BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}' "${ARRAY[@]}"
)

#echo -ne "Sum of Array Numbers : $sum \n"

# Finding Array length to calculate the average grade

tLen=${#ARRAY[@]}

#calculating the average

decimalavg=$(echo $sum / $tLen | bc -l)

#echo -ne "Decimal Average: $decimalavg \n";

#Rounding off the average.

avg=`echo "($decimalavg+0.5)/1" | bc`

echo -en "Average Grade : $avg \n";

echo -en "Average Letter Grade : $(gradecalc ${avg}) \n";

# finding min/max
max=${ARRAY[0]}
min=${ARRAY[0]}

# Loop through all elements in the array
for i in "${ARRAY[@]}"
do
# Update max if applicable
if [[ "$i" -gt "$max" ]]; then
max="$i"
fi

# Update min if applicable
if [[ "$i" -lt "$min" ]]; then
min="$i"
fi
done

# Output results:
echo "Max Grade is : $max";
echo "Max Letter Grade is : $(gradecalc ${max}) ";
echo "Min Grade is : $min"
echo "Min Letter Grade is : $(gradecalc ${min}) ";

 

Sample Outputs:

Bubble sorting shell script

 

In case of any ©Copyright or missing credits issue please check CopyRights page for faster resolutions.

Leave a Reply