Я пытаюсь использовать бинарный поиск, чтобы отобразить оценку ученика, если он находится в массиве. В моем поиске нет проблем, однако я, по-видимому, неправильно сравниваю данные в моих условных утверждениях. elif
работает независимо от того, какое имя я ввожу. Кажется, есть некоторая проблема по крайней мере с одним из значений, которые я сравниваю. Вот что хранится в массиве:
Ann:A
Bob:C
Cindy:B
Dean:F
Emily:A
Frank:C
Ginger:D
Hal:B
Ivy:A
Justin:F
Karen:D
Вот мой скрипт.
#!/bin/bash
# Create array from student list
studentArray=($(cat ./studentList.dat))
# Ask for student name
echo "Enter Student Name"
studentName=$(read)
# variable to store if a student has been found
studentFound="false"
# variable to store student grade
studentGrade=""
# start and end index of the studentArray
START=0
END=$((${#studentArray[@]}-1))
# binary search
while [ "$START" -le "$END" ]; do
MIDDLE=$((START+((END-START)/2)))
middleItem=$(echo ${studentArray[$MIDDLE]} | cut -d: -f1)
if [ "$studentName" = "$middleItem" ]; then
studentFound="true"
studentGrade=$(echo ${studentArray[$MIDDLE]} | cut -d: -f2)
break
elif [[ "$studentName" < "$middleItem" ]]; then
((END=MIDDLE-1))
else
((START=MIDDLE+1))
fi
done
if [ "$studentFound" == "true" ]; then
echo $studentGrade
else
echo "Sorry, there is no student by that name"
fi