基于Linux Shell脚本学生管理系统的设计与实现


湖北民族大学2021年春季考查课试卷

A或B

A 卷

课 程

Linux系统及编程

使用班级

0320203-04

制卷份数

 

姓名

 

命题人

张华

试卷审核人

 

单位审核人

 

答题纸数

 

班级

 

题 号

合计

学号

 

评 分

                     

分数

 

阅卷人

                     

 

考查形式为论文撰写,要求如下:

  1. 内容

以一个实际Linux Shell脚本管理系统为核心,从系统产生背景、问题提出、问题分析、系统分析、系统设计、系统实现等方面进行阐述。

  1. 具体要求

1、题名要求简明扼要,能反映论文主题;摘要必须说明研究目的、方法、结果、结论,字数200字左右为宜,忌与引言及结论中的内容雷同;

2、 字数3000~5000 字

3、 论文参考架构 (请注意各级内容的字体格式,以示区分)
论文标题 (三号黑体)
班级、学号、姓名 (五号宋)

摘 要(五号黑): 内容(五号宋)

关键字(五号黑): 内容(五号宋)

1 引言

  1. 系统设计   (小三黑)
    1. 设计原则 (四号黑)

    正文(五号宋)

    1. 功能模块划分
  2. 系统实现
    1. 实现技术
    2. 具体实现
    3. 性能优化(如果有的话)
  3. 结束语

 

评分标准:

内容主题符合20分,系统设计30分,系统实现30分,格式规范20分,合计100分

 

基于Linux Shell脚本学生管理系统的设计与实现

目录

1.绪论    3

1.1 研究背景以及意义    3

1.2 Linux特点    3

1.3 Shell脚本介绍    3

2.脚本设计    3

2.1 系统概要设计    3

2.2 系统功能模块    3

2.2.1 模块层次图    3

2.2.2 数据存储体系    4

2.2.3 系统流程图    4

2.2.4 菜单设计    5

3.脚本实现    6

3.1 登录注册模块    6

3.2 增加数据模块举例(添加学院)    7

3.3 删除数据模块举例(删除学生)    8

3.4 修改数据模块举例(更新学院)    9

3.5 查询数据模块举例(成绩统计)    11

总结与展望    13

 

 

1.绪论

1.1研究背景以及意义

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIXUnix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

Shell的开发与使用是Linux操作系统日渐普及的产物。而对于微型Linux系统shell的研究是Linux研究的重点。利用微型的shell,不仅可以让用户更容易操作Linux,也可以帮助用户理解Linux工作原理,同时保护内核的安全性。本文对shell的研究包括对其功能的了解,并实现对shell的列表、管道、输入重定向、输出重定向等命令功能,可以比较全面地认识shell解释器,编写出可以实现的各种功能的具体代码,这样来编写一个简易的Linux

1.2 Linux特点

Linux采取了许多安全技术措施,其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。Linux由于需要应用到网络服务器,这对稳定性也有比较高的要求,实际上Linux在这方面也十分出色。Linux系统在设计的时候就是针对多用户环境的,所以对系统文件,用户文件都做了明确地区分,每个文件都有不同的用户属性,作为一个普通用户,通常只能读写自己的文件,而对一般的系统文件只能读取不能改动,一些敏感的系统文件甚至连读取都是被禁止的,这种设计从根本上保证了系统的安全性,即使一个用户文件出现了问题,也不会殃及整个系统。

1.3 Shell脚本介绍

shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互(执行脚本程序)的方式。

2.脚本设计

2.1 脚本概要设计

概要设计的主要任务是设计软件结构和数据结构。设计软件结构的具体任务是:将一个复杂系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等。数据结构设计包括数据特征的描述、确定数据的结构特性、以及数据库的设计。显然,概要设计建立的是目标系统的逻辑模型,与计算机无关。总体设计包括系统模块结构设计和计算机物理系统的配置方案设计。

整体分为三个功能模块,分别是学院信息管理、学生信息管理以及成绩信息管理,用户登录后可通过输入相应编号进入不同的功能模块,相应能对各模块的数据功能进行增删改查操作,且能将操作永久存储至系统磁盘。

2.2 系统功能模块

shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互(执行脚本程序)的方式。

2.2.1模块层次图

shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互(执行脚本程序)的方式。

 

2.1 模块层次图

2.2.2数据存储体系

数据存储使用文件储存方式实现,分为用户密码存储文件、学院存储文件、学生存储文件以及分数存储文件,都单独存放于各自文件中,需要时使用awk命令读取。

2.2 数据文件分布图

2.2.3系统流程图

系统主要以CRUD操作为主,每次执行增加操作时,需要检测数据库中是否已经存在;删除操作时,需要查询数据库中是否已有相应的数据;改修数据时既需要判断用户输入的数据是否存在,也需要判断修改后的数据是否符合条件;查询时,直接按行读取数据库中的数据,而后显示即可,但查询成绩时,需要对数据进行排序而后输出前三名或总分前五名。下面是具体的流程图:

2.3 系统流程图

2.2.4菜单设计

菜单设计中,主要以功能模块为主,交互式友好度为辅下面详见程序菜单运行图:

2.4.1 登录菜单

2.4.2 主菜单

 

2.4.3 学院管理菜单

2.4.4 学生管理菜单

2.4.5 成绩管理菜单

3.脚本实现

3.1 登录注册模块

登录功能的实现,首先让用户输入用户名,再根据用户输入的用户名使用awk命令组合管道,在数据库中寻找对应的密码,再取出存入变量中,而后再判断用户输入的密码是否与数据库中的密码一致,如果一致则登录成功,进入欢迎页面,如果失败则提醒用户登录失败,需要重新输入用户名以密码。

 

login() {

    read -p "请输入用户名:" user_name

    a="$(cat file | awk '$1=="'$user_name'"' | cut -d ' ' -f2-)"

    b=$(echo "$a" | sed 's/ //g')

    cat file | awk '$1=="'$user_name'"' &>/dev/null

    if [ $? -eq 0 ]; then

        read -s -p "请输入你的密码:" user_passwd

        c=$(echo $user_passwd | sed 's/ //g')

        if [[ "$b" == "$c" ]]; then

            clear

            echo "登录成功!"

        else

            clear

            echo "密码验证不正确,请选择 1. 重新创建 2. 重新登录 3. 退出系统"

            read choice

            case $choice in

            1)

                create_user

                ;;

            2)

                login

                ;;

            3|*)

                echo "退出系统"

                exit 0

                ;;

            esac

        fi

    else

        echo "该用户不存在,请选择 1. 重新创建 2. 重新登录 3. 退出系统"

        #创建用户

        clear

        read choice

        case $choice in

        1)

            create_user

            ;;

        2)

            login

            ;;

        3|*)

            echo "退出系统"

            exit 0

            ;;

        esac

    fi

    #登录成功,跳转至欢迎页

    Welcome

}

 

3.1.1 创建用户

3.1.2 登录成功

3.2增加数据模块举例(添加学院)

学院信息管理模块中,主要是对数据规范性做文章,当添加学院信息时,需要检测新添加的学院是否存在于数据库中,且各字段不能为空,所以一般在增删改查中需要编写大量的数据校验代码。

添加学院校验代码:

add_school() {

    read -p "学院编号:" school_num

    #防止输入空格

    while [ "$school_num" = '' ]; do

        read -p "输入的学院编号不能为空,请重新输入学院编号:" school_num

    done

    while grep -w "$school_num" "$schools_db" >/dev/null; do

        echo "已经存在该编号的学院了,请改用其他编号!"

        read -p "学院编号:" school_num

    done

    read -p "学院名称:" school_name

    #防止输入空格

    while [ "$school_name" = '' ]; do

        read -p "输入的学院名称不能为空,请重新输入学院名称:" school_name

    done

    #符合规则,将其写入到数据库中

    echo -e "$school_num,\t$school_name,\r" >>$schools_db

}

 

3.2.1 添加学院

3.2.2 添加学院时输入已存在的数据

3.3删除数据模块举例(删除学生)

删除模块较为简单,只需要用户输入数据后,进行一次查询判断即可完成,如果存在数据则删除,如果数据不存在则提示数据不存在。

#2.删除学生

del_student() {

    read -p "请输入要删除的学生的学号:" num

    echo "该学生的信息为:"

    grep "^$num" $students_db

    read -p "确定删除吗?[yes|no]" choice

    case "$choice" in

    yes)

        sed -i -e "/^$num/d" $students_db

        if [ "$?" -eq 0 ]; then

            echo "删除成功"

        else

            echo "不存在该条记录或者删除失败"

        fi

        ;;

    no)

        :

        ;;

    *)

        echo "请输入[yes|no]"

        del_student

        ;;

    esac

}

 

3.3 删除学生

3.4修改数据模块举例(更新学院)

相对较为复杂的是修改学院,因为其涉及判断输入编号以及字段是否为空、以及输入字段不存在等相关校验信息,且修改时可能还会涉及多表修改,具体代码为:

#5.修改学院信息

update_school() {

    echo "--------------------------"

    read -p "输入学院编号:" school_num

    #防止输入空格

    while [ "$school_num" = '' ]; do

        read -p "输入有误,请重新。输入学院编号:" school_num

    done

    while ! grep -w "$school_num" "$schools_db" >/dev/null; do

        echo "不存在该编号的学院,请输入编号存在的学院编号: "

        read -p "输入学院编号:" school_num

        #防止输入空格

        while [ "$school_num" = '' ]; do

            read -p "输入有误,请重新。输入学院编号:" school_num

        done

    done

    echo "--------------------------"

    echo -e "编号\t学院\t"

    grep -w $school_num $schools_db

    echo "--------------------------"

    read -p "要修改的字段信息::" str1

    #防止输入空格

    while [ "$str1" = '' ]; do

        read -p "输入有误,请重新。要修改的字段信息::" str1

    done

    while ! grep -w "$school_num,.*," "$schools_db" | grep -w "$str1" >/dev/null; do

        echo "不存在该字段,请重新输入:"

        read str1

        #防止输入空格

        while [ "$str1" = '' ]; do

            read -p "输入有误,请重新。要修改的字段信息::" str1

        done

    done

    read -p "修改后的字段信息" str2

    #防止输入空格

    while [ "$str2" = '' ]; do

        read -p "输入有误,请重新。修改后的字段信息:" str2

    done

    read -p "确定修改吗?[y|n]" choice

    case "$choice" in

    yes|y)

        sed -i "/${school_num#,}/ s/$str1/$str2/" $schools_db

        if [ "$?" -eq 0 ]; then

            echo "修改成功"

            echo "--------------------------"

            echo "修改后的学院信息"

            echo -e "编号\t学院\t"

            cat $schools_db

            if [ "$str1" = "$school_num" ]; then #如果修改的是学院编号还要修改学生表里的学院编号

                sed -i "/${school_num#,}/ s/$str1/$str2/" $students_db

            fi

        else

            echo "修改失败"

        fi

        ;;

    no|n)

        :

        ;;

    *)

        echo "请输入[yes|no]"

        del_student

        ;;

    esac

}

    修改学院模块会涉及schools_db数据库与students_db数据库的联合查询,确保数据有效性。

3.4 修改学院流程图

 

3.5查询数据模块举例(成绩统计)

查询数据模块中比较有特色的是成绩统计功能,这里主要研究的是统计各科目的前三名和个人总成绩前五,这里使用awk命令加管道,再利用sed命令取出前几条数据将其输出。

#6.个人总成绩前5名排序

sort_score_sum_five() {

    echo "-----------总成绩前15---------------"

    printf "学号\t总成绩\t排名\t\n"

    awk -F"," '{ary[$1]+=$4} END{for(key in ary) print key "," ary[key]",\t"}' $scores_db | sort -r -n -t',' -k 2 | awk -F"," '{print $1 ",\t" $2",\t" NR ",\t"}' | sed -n '1,5p'

    echo "--------------------------"

}

 

#7.每个学科的前3

such_course_sort_score() {

    awk 'BEGIN{FS=","}{ary[$3]=$3} END{for(key in ary) print ary[key]}' $scores_db >temp

    size=$(cat temp | wc -l)

    top=1

    while [ "$top" -le "$size" ]; do

        var=$(sed -n "$top p" temp)

        grep "$var," $scores_db | sort -r -n -t "," -k 4 | sed -n '1,3p' | awk 'BEGIN{FS="," ; printf "科目\t学号\t姓名\t排名\t\n"}{printf $3 "\t" $1 "\t" $2 "\t" NR "\t\n"}' | column -t

        echo ""

        top=$(($top + 1))

    done

    rm -rf temp

}

 

3.5.1 每科的前3

3.5.2 个人总成绩前5

 

 

总结与展望

在互联网和Linux系统不断发展的今天,以Linux系统为代表的服务器技术及产品得到了极大的推广, Shell脚本程序也是花样翻新层出不穷。通过这次设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。基于Linux Shell脚本学生管理系统设计的基本目的,在于通过理论与实际的结合进一步提高思想觉悟,将以前学习的知识串联起来并进一步巩固。

在本次论文设计的 Shell脚本开发过程中,也学习到了很多软件工程领域的规范化的开发方法、数据存储同时也锻炼了自己查找资料和文档撰写的能力。在需求分析阶段,我根据所学Linux系统及编程理论知识,特别是需求分析、总体设计、详细设计部分的知识,和其中的分析和建模的方法,设计了需要实现的基本功能。提出

本项目所要实现的目标,系统性能、安全性、可靠性方面的要求等。在系统设计阶段,我们又仔细复习教材中

关于概要设计中应用的相关方法、应注意的几个问题和概要设计阶段的目标,在需求分析的基础上有提出了更

具体的可行性分析和实现方案。

通过这次开发使自己对知识的运用能力得到提升,而且还锻炼了我的自学能力,更重要的是培养了观

察、分析和解决问题的实际工作能力,对以后的工作将会起到较大作用。

 

论文源文件:

https://xiaochengzi.lanzoui.com/i1sZPs2dn8j

程序源文件:

https://xiaochengzi.lanzoui.com/iB1Zds2dpkd


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM