湖北民族大学2021年春季考查课试卷 |
A或B |
||||||||||||||||
A 卷 |
|||||||||||||||||
课 程 |
Linux系统及编程 |
使用班级 |
0320203-04 |
制卷份数 |
姓名 |
||||||||||||
命题人 |
张华 |
试卷审核人 |
单位审核人 |
答题纸数 |
班级 |
||||||||||||
题 号 |
一 |
二 |
三 |
四 |
五 |
六 |
七 |
八 |
九 |
十 |
合计 |
学号 |
|||||
评 分 |
分数 |
||||||||||||||||
阅卷人 |
考查形式为论文撰写,要求如下:
以一个实际Linux Shell脚本管理系统为核心,从系统产生背景、问题提出、问题分析、系统分析、系统设计、系统实现等方面进行阐述。
1、题名要求简明扼要,能反映论文主题;摘要必须说明研究目的、方法、结果、结论,字数200字左右为宜,忌与引言及结论中的内容雷同; 2、 字数3000~5000 字 3、 论文参考架构 (请注意各级内容的字体格式,以示区分) 摘 要(五号黑): 内容(五号宋) 关键字(五号黑): 内容(五号宋) 1 引言
评分标准: 内容主题符合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操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多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 "-----------总成绩前1到5名---------------" 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