Linux 成绩管理系统(Shell)
纯 Shell 脚本实现的成绩管理系统,多用户数据隔离、灵活查询、完善注释。
📋 项目概览
技术栈
ShellBashawksed
功能特性
- 多用户登录(教师/学生)
- 成绩增删改查 + 模糊搜索
- CSV 批量导入成绩
- 统计计算(平均分/最高低分/及格率)
- 文本文件持久化 + 数据导出
🚀 在线演示新窗口打开 ↗
💻 核心代码Shell · Bash · awk · sed
bash主程序框架
Shell 脚本主循环,包括用户认证、菜单导航、成绩管理和统计功能。
#!/bin/bash
# =============================================
# Linux 课程作业五 — 成绩管理系统
# 作者: Solivagant
# 功能: 多用户成绩管理(增删改查+统计)
# =============================================
DATA_DIR="./data"
USERS_FILE="$DATA_DIR/users.txt"
GRADES_FILE="$DATA_DIR/grades.txt"
# ── 初始化 ──
init() {
mkdir -p "$DATA_DIR"
[ -f "$USERS_FILE" ] || echo "admin|admin123|teacher" > "$USERS_FILE"
[ -f "$GRADES_FILE" ] || touch "$GRADES_FILE"
}
# ── 登录 ──
login() {
read -p "用户名: " username
read -s -p "密码: " password
echo
user=$(grep "^$username|$password|" "$USERS_FILE")
if [ -z "$user" ]; then
echo "❌ 用户名或密码错误"
return 1
fi
role=$(echo "$user" | cut -d'|' -f3)
echo "✅ 登录成功![$role] $username"
ROLE="$role"
USERNAME="$username"
}
# ── 显示所有成绩 ──
list_grades() {
printf "%-12s %-15s %-10s %-6s\n" "学号" "姓名" "课程" "成绩"
printf "%-12s %-15s %-10s %-6s\n" "────" "────" "────" "────"
while IFS='|' read -r sid name course score; do
[ -n "$sid" ] && printf "%-12s %-15s %-10s %-6s\n" "$sid" "$name" "$course" "$score"
done < "$GRADES_FILE"
echo ""
echo "总记录数: $(wc -l < "$GRADES_FILE")"
}
# ── 添加成绩 ──
add_grade() {
read -p "学号: " sid
read -p "姓名: " name
read -p "课程: " course
read -p "成绩: " score
# 校验成绩范围
if ! [[ "$score" =~ ^[0-9]+$ ]] || [ "$score" -lt 0 ] || [ "$score" -gt 100 ]; then
echo "❌ 成绩必须在 0-100 之间"
return
fi
echo "$sid|$name|$course|$score" >> "$GRADES_FILE"
echo "✅ 成绩已添加"
}
# ── 模糊搜索 ──
search_grade() {
read -p "输入学号或姓名(支持模糊): " keyword
results=$(grep -i "$keyword" "$GRADES_FILE")
if [ -z "$results" ]; then
echo "未找到匹配记录"
return
fi
echo "$results" | while IFS='|' read -r sid name course score; do
printf "%-12s %-15s %-10s %-6s\n" "$sid" "$name" "$course" "$score"
done
echo "共找到 $(echo "$results" | wc -l) 条记录"
}
# ── 统计 ──
show_stats() {
echo "===== 成绩统计 ====="
echo "总人数: $(wc -l < "$GRADES_FILE")"
awk -F'|' '{
sum+=$4; count++;
if($4>max||count==1) max=$4;
if($4<min||count==1) min=$4;
if($4>=60) pass++
} END {
printf "平均分: %.1f\n", sum/count
printf "最高分: %d\n", max
printf "最低分: %d\n", min
printf "及格率: %.1f%%\n", pass/count*100
}' "$GRADES_FILE"
}
# ── CSV 批量导入 ──
import_csv() {
read -p "CSV 文件路径: " csv_path
if [ ! -f "$csv_path" ]; then
echo "❌ 文件不存在"
return
fi
count=0
tail -n +2 "$csv_path" | while IFS=',' read -r sid name course score; do
echo "$sid|$name|$course|$score" >> "$GRADES_FILE"
((count++))
done
echo "✅ 已导入 $count 条记录"
}
# ── 主菜单 ──
main_menu() {
while true; do
echo ""
echo "===== 成绩管理系统 ====="
[ "$ROLE" = "teacher" ] && echo "1) 添加成绩 2) 查看成绩"
[ "$ROLE" = "teacher" ] && echo "3) 搜索成绩 4) 删除成绩"
[ "$ROLE" = "teacher" ] && echo "5) 批量导入 6) 统计"
echo "7) 退出"
read -p "选择: " choice
case $choice in
1) [ "$ROLE" = "teacher" ] && add_grade ;;
2) [ "$ROLE" = "teacher" ] && list_grades ;;
3) [ "$ROLE" = "teacher" ] && search_grade ;;
4) [ "$ROLE" = "teacher" ] && delete_grade ;;
5) [ "$ROLE" = "teacher" ] && import_csv ;;
6) [ "$ROLE" = "teacher" ] && show_stats ;;
7) exit 0 ;;
*) echo "无效选择" ;;
esac
done
}
# ── 启动 ──
init
login && main_menu📁 源文件清单
| 路径 | 说明 | 行数 |
|---|---|---|
grade_manager.sh | Shell 成绩管理系统完整脚本 | 180 |