← 项目列表
课程已完成2026年6月

Linux 成绩管理系统(Shell)

纯 Shell 脚本实现的成绩管理系统,多用户数据隔离、灵活查询、完善注释。

ShellLinux成绩管理ShellBashawksed
📋 项目概览
技术栈
ShellBashawksed
功能特性
  • 多用户登录(教师/学生)
  • 成绩增删改查 + 模糊搜索
  • CSV 批量导入成绩
  • 统计计算(平均分/最高低分/及格率)
  • 文本文件持久化 + 数据导出
🚀 在线演示新窗口打开 ↗
💻 核心代码Shell · Bash · awk · sed
bash主程序框架grade_manager.sh · 132 行

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.shShell 成绩管理系统完整脚本180
网站智能助手
💬 和我聊聊
🤖
你好呀 👋 有什么想聊的?