쉘 스크립트의 if-else 문과 부동 소수점 숫자 비교

쉘 스크립트의 if-else 문과 부동 소수점 숫자 비교

그래서 저는 성적 입력을 받아 각 섹션의 가중치를 기준으로 성적을 계산하는 스크립트를 작성해 왔습니다. 마지막으로 계산된 성적을 바탕으로 문자 등급을 출력합니다. 내 코드는 if-else 문까지는 문제가 없지만 각 if-else 문의 조건에서 잘못된 숫자 오류가 발생하기 시작합니다.

#!/bin/sh
#Calculate weighted grade and output grade letter

echo "What is your total Lab/Assignments grade?"
read labGrade
echo "What is your Midterm grade?"
read midtermGrade
echo "What is your total Quizzes grade?"
read quizGrade
echo "What is your Final Exam grade?"
read finalGrade

weightedLab=`echo "0.25*$labGrade" | bc`
weightedMidterm=`echo "0.30*$midtermGrade" | bc`
weightedQuiz=`echo "0.15*$quizGrade" | bc`
weightedFinal=`echo "0.30*$finalGrade" | bc`

totalGrade=`echo "$weightedLab + $weightedMidterm + $weightedQuiz + $weightedFinal" | bc`

if [ $totalGrade -ge 90.00 ]
then
        echo "Your total grade is an A+!"
elif [ $totalGrade -ge 85.00 -a $totalGrade -le 89.00 ]
then
        echo "Your total grade is an A!"
elif [ $totalGrade -ge 80.00 -a $totalGrade -le 84.00 ]
then
       echo "Your total grade is an A-!"
elif [ $totalGrade -ge 76.00 -a $totalGrade -le 79.00 ]
then
        echo "Your total grade is a B+"
elif [ $totalGrade -ge 72.00 -a $totalGrade -le 75.00 ]
then
        echo "Your total grade is a B"
elif [ $totalGrade -ge 68.00 -a $totalGrade -le 71.00 ]
then
        echo "Your total grade is a B-"
elif [ $totalGrade -ge 64.00 -a $totalGrade -le 67.00 ]
then
        echo "Your total grade is a C+"
elif [ $totalGrade -ge 60.00 -a $totalGrade -le 63.00 ]
then
        echo "Your total grade is a C"
elif [ $totalGrade -ge 56.00 -a $totalGrade -le 59.00 ]
then
        echo "Your total grade is a C-"
elif [ $totalGrade -ge 50.00 -a $totalGrade -le 55.00 ]
then
        echo "Your total grade is a D"
else
        echo "Your total grade is an F"
fi
What is your total Lab/Assignments grade?
100
What is your Midterm grade?
100
What is your total Quizzes grade?
100
What is your Final Exam grade?
90
./A2.sh: 20: [: Illegal number: 97.00
./A2.sh: 23: [: Illegal number: 97.00
./A2.sh: 26: [: Illegal number: 97.00
./A2.sh: 29: [: Illegal number: 97.00
./A2.sh: 32: [: Illegal number: 97.00
./A2.sh: 35: [: Illegal number: 97.00
./A2.sh: 38: [: Illegal number: 97.00
./A2.sh: 41: [: Illegal number: 97.00
./A2.sh: 44: [: Illegal number: 97.00
./A2.sh: 47: [: Illegal number: 97.00
Your total grade is an F

이 값을 올바르게 비교하려면 코드를 어떻게 변경해야 합니까?

답변1

Bash는 부동 소수점 연산을 수행하지 않습니다.

그러나 임의의 비율이 필요하지 않기 때문에 정수가 남도록 숫자를 100으로 확대하여 계산을 수행합니다.

lab=100 midterm=70 quiz=90 exam=80
total=$((25*lab + 30*midterm + 15*quiz + 30*exam))
if (( total >= 8000 )); then
    echo "you scored at least 80! (actually $(( total / 100 )))"
fi

또는 부동 소수점 숫자를 처리할 수 있는 다른 도구를 사용할 수 있습니다. 다음을 참조하세요.
Bash 또는 다른 언어/프레임워크에서 정수 및 부동 소수점 계산을 수행하는 방법은 무엇입니까?

답변2

첫째, bash정수만 처리할 수 있습니다. 따라서 부동 소수점 비교를 위해 외부도 사용해야 합니다.

간단한 방법은 bcFALSE 문과 TRUE 문에서 출력되는 비교 연산자를 사용하는 것입니다. , , , 및 . 그들은 당신이 이미 알고 있는 것처럼 작동합니다.01<<=>>===!=

 echo '1 > 2' | bc -l
 0
 echo '1 <= 2' | bc -l
 1

따라서 테스트를 다음으로 변경하십시오.

 [ $(echo "$totalGrade >= 90.00" | bc -l) -eq 1 ]

등.

팁 1

elif [ $totalGrade -ge 80.00 -a $totalGrade -le 84.00 ]

이 표현식에서는 -a $totalGrade -le 84.00IF 루프가 스크립트와 동일한 순서로 평가되므로 중복되므로 $totalGrade -le 84.00FALSE이면 이미 처리된 것입니다 $totalGrade -ge 85.00.

팁 2성적이 84.5이면 어떻게 되나요? 평가에서는 이러한 값을 무시합니다.

관련 정보