编写Linux Bash成绩计算脚本:支持多科目及Prelim/Midterm/Final统计
Bash Script for Grade Calculation with Subject & Term Averages
Let's fix up your script to meet all the requirements—your original code had redundant input prompts, missed tracking subject names, and didn't calculate cross-subject term averages or the overall average. Here's the polished, functional version:
#!/bin/bash # Initialize total counters for term averages and overall total scores total_prelim=0 total_midterm=0 total_final=0 total_subject_averages=0 # Get number of subjects from user read -p "Enter number of subject: " subj_count # Loop through each subject to collect scores for (( i=1; i<=subj_count; i++ )); do read -p "Enter subject Name: " subj_name # Collect scores for each term read -p "Enter Prelim Grade For $subj_name: " prelim_score read -p "Enter Midterm Grade For $subj_name: " midterm_score read -p "Enter Final Grade For $subj_name: " final_score # Calculate current subject's average subject_average=$(echo "scale=4; ($prelim_score + $midterm_score + $final_score)/3" | bc) # Update running totals for cross-subject calculations total_prelim=$(echo "$total_prelim + $prelim_score" | bc) total_midterm=$(echo "$total_midterm + $midterm_score" | bc) total_final=$(echo "$total_final + $final_score" | bc) total_subject_averages=$(echo "$total_subject_averages + $subject_average" | bc) # Print subject-specific result echo "$subj_name Average is: $subject_average" echo done # Calculate cross-subject term averages prelim_average=$(echo "scale=4; $total_prelim / $subj_count" | bc) midterm_average=$(echo "scale=4; $total_midterm / $subj_count" | bc) final_average=$(echo "scale=4; $total_final / $subj_count" | bc) # Calculate overall average (average of all subject averages) overall_average=$(echo "scale=4; $total_subject_averages / $subj_count" | bc) # Print final summary averages echo "Prelim Average is: $prelim_average" echo "Midterm Average is: $midterm_average" echo "Final Average is: $final_average" echo "Overall Average is: $overall_average"
Key Improvements & Notes:
- Subject Name Tracking: Added a prompt for each subject's name to match your expected output format.
- Running Totals: Variables like
total_prelimkeep cumulative scores so we can compute cross-subject and overall averages at the end. - Clean Input Flow: No redundant subject count prompts—we read this value once upfront.
- Precision Control: Using
scale=4inbcensures consistent 4-decimal precision for all calculated averages. - Readable Output: Separated individual subject results from the final summary for clarity.
Expected Output Example:
Enter number of subject: 3 Enter subject Name: Math Enter Prelim Grade For Math: 89 Enter Midterm Grade For Math:89 Enter Final Grade For Math:89 Math Average is: 89.0000 Enter subject Name: English Enter Prelim Grade For English: 90 Enter Midterm Grade For English:90 Enter Final Grade For English:90 English Average is: 90.0000 Enter subject Name: Science Enter Prelim Grade For Science: 91 Enter Midterm Grade For Science:91 Enter Final Grade For Science:91 Science Average is: 91.0000 Prelim Average is: 90.0000 Midterm Average is: 90.0000 Final Average is: 90.0000 Overall Average is: 90.0000
内容的提问来源于stack exchange,提问作者Paraguraan




