Linux下基于shell脚本实现学生信息管理系统
#该管理系统是参考两位博主(时间有点远了,我忘了,请博主看到后联系我)后自行修改添加的。登录过程还有很多不完善,我就抛砖引玉啦。
废话不多,直接上码!
#!/bin/bash
# 学生管理系统
# @version 1.0
#设置全局变量
##学生信息和学院信息
#学院相关变量
school_num=""
school_name=""
#学生相关变量
stu_num=""
stu_name=""
stu_des=""
#成绩相关变量
course=""
score=""
score_des=""
#用户账户信息
user_name=""
user_passwd=""
##数据文件存放路径
source_dir="./source"
schools_db="./source/schools.db"
students_db="./source/students.db"
scores_db="./source/scores.db"
user_db="./source/user.db"
#创建数据文件
mkdir_sourcedir(){
if [ ! -d $source_dir ];then
mkdir -p $source_dir
fi
if [ ! -f $schools_db ];then
touch $schools_db
fi
if [ ! -f $students_db ];then
touch $students_db
fi
if [ ! -f $scores_db ];then
touch $scores_db
fi
if [ ! -f $user_db ];then
touch $user_db
fi
}
create_user(){
read -p "请输入你的用户名:" user_name
cat file | grep $user_name &>/dev/null
[ $? -eq 0 ] && echo "这个用户已经存在,请重新创建!" && create_user
if [ -z $user_name ];then
echo "该用户可创建" && create_user
fi
read -p "请输入密码:" user_passwd
read -p "请再次输入密码:" passwd1
if [[ "$user_passwd" != "$passwd1" ]] ;then
echo "密码验证不正确,请重新创建" && create_user
fi
if [ ! -z "$user_passwd" ];then
echo "$user_name "$user_passwd" " >>file
echo "创建成功!,按任意键将跳转到登录界面..."
fi
if [ -z "$user_passwd" ];then
echo "$user_name " " " >>file
echo "创建成功!,按任意键将跳转到登录界面..."
fi
clear
read choice
case $choice in
*)
login
;;
esac
}
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 -p "请输入你的密码:" user_passwd
c=`echo $user_passwd | sed 's/ //g'`
if [[ "$b" = "$c" ]];then
echo "登录成功!"
else
echo "密码验证不正确,请选择 1. 重新创建 2. 重新登录 3. 退出系统"
clear
read choice
case $choice in
1)
create_user
;;
2)
login
;;
3)
exit 0
;;
esac
fi
else
echo "该用户不存在,请选择 1. 重新创建 2. 重新登录 3. 退出系统"
#create_user
clear
read choice
case $choice in
1)
create_user
;;
2)
login
;;
3)
exit 0
;;
esac
fi
welcome
}
haha(){
case $main in
1)
create_user
;;
2)
login
;;
3)
exit 0
;;
esac
}
cat << eof
************请选择:**************
1) 创建用户
2) 直接登录
3) 退出
eof
read -p "choice:" main
# 主函数
welcome()
{
# reset
mkdir_sourcedir #数据文件不存在则创建
echo -e "\t\t\t--------------------------"
echo -e "\t\t\t 欢迎进入学生管理系统"
echo -e "\t\t\t--------------------------"
echo -e "\t\t\t 按任意键继续……"
read choice
case $choice in
*)
module
;;
esac
}
#模块选择
module(){
clear
echo -e "\t\t\t**********************"
echo -e "\t\t\t请输入对应数字选择信息模块"
echo -e "\t\t\t 1. 学院信息管理"
echo -e "\t\t\t 2. 学生信息管理"
echo -e "\t\t\t 3. 成绩信息管理"
echo -e "\t\t\t 4. 退出系统"
read choice
case $choice in
1)
menu1
;;
2)
menu2
;;
3)
menu3
;;
4)
exit 0
;;
*)
module
;;
esac
}
###############
#学院信息模块功能实现
###############
#学院信息模块菜单
menu1(){
clear
echo -e "\t\t\t****************************"
echo -e "\t\t\t请输入对应数字选择功能"
echo -e "\t\t\t 1. 添加学院"
echo -e "\t\t\t 2. 删除学院"
echo -e "\t\t\t 3. 学院列表"
echo -e "\t\t\t 4. 查找学院"
echo -e "\t\t\t 5. 修改学院"
echo -e "\t\t\t 6. 返回上级"
echo -e "\t\t\t 7. 退出系统"
echo -e "\t\t\t****************************"
echo "请选择:"
read choice
case $choice in
1)
echo -e "\t\t\t添加学院"
add_school
;;
2)
echo -e "\t\t\t删除学院"
del_school
;;
3)
echo -e "\t\t\t学院列表"
display_schools
;;
4)
echo -e "\t\t\t查找学院"
find_school
;;
5)
echo -e "\t\t\t修改学院"
update_school
;;
6)
echo -e "\t\t\t返回上级"
module
;;
7)
exit 0
;;
*)
menu1
;;
esac
echo "--------------------------"
echo "按任意键继续……"
read c
menu1
}
#1.添加学院信息
add_school(){
read -p "school_num:" 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:" school_num
done
read -p "school_name:" school_name
#防止输入空格
while [ "$school_name" = '' ];do
read -p "输入的学院名称不能为空,请重新输入学院名称:" school_name
done
echo -e "$school_num,\t$school_name,\r" >> $schools_db
}
#2.删除学院
del_school(){
read -p "请输入学院的编号" school_num
while ! grep -w "$school_num" "$schools_db" > /dev/null ; do
echo "不存在该编号的学校,请输入编号存在的学校编号: "
read -p "school_num:" school_num
done
echo "该学院的信息为:"
grep "^$school_num" $schools_db
read -p "确定删除吗?[yes|no]" choice
case "$choice" in
yes)
sed -i -e "/^$school_num/d" $schools_db
if [ "$?" -eq 0 ];then
echo "删除成功"
else
echo "不存在该条记录或者删除失败"
fi
;;
no)
:
;;
*)
echo "请输入[yes|no]"
del_school
;;
esac
}
#3.展示全部学院信息
display_schools(){
echo -e "编号\t学院\t"
cat $schools_db
}
#4.查找学院
find_school(){
echo "--------------------------"
echo "输入要查询的学院编号"
read school_num
echo "--------------------------"
echo -e "编号\t学院\t"
grep -w $school_num $schools_db #-w只显示全字符合的列
echo "--------------------------"
echo "查询成功"
}
#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:" 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 "确定删除吗?[yes|no]" choice
case "$choice" in
yes)
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)
:
;;
*)
echo "请输入[yes|no]"
del_student
;;
esac
}
###################
#学生信息模块功能实现
###################
#学生信息模块菜单
menu2() {
clear
echo -e "\t\t\t**********************"
echo -e "\t\t\t请输入对应数字选择功能"
echo -e "\t\t\t 1. 添加学生"
echo -e "\t\t\t 2. 删除学生"
echo -e "\t\t\t 3. 学生列表"
echo -e "\t\t\t 4. 查找学生"
echo -e "\t\t\t 5. 修改学生"
echo -e "\t\t\t 6. 返回上级"
echo -e "\t\t\t 7. 退出系统"
echo -e "\t\t\t**********************"
echo "请选择:"
read choice
case $choice in
1)
echo -e "\t\t\t添加学生信息"
add_student
;;
2)
echo -e "\t\t\t删除学生信息"
del_student
;;
3)
echo -e "\t\t\t展示学生信息"
display_students
;;
4)
echo -e "\t\t\t搜索学生信息"
search_student_num
;;
5)
echo -e "\t\t\t修改学生信息"
modify_student
;;
6)
echo -e "\t\t\t返回上一个页面"
module
;;
7)
exit 0
;;
*)
menu2
;;
esac
echo "--------------------------"
echo "按任意键继续……"
read c
menu2
}
#1.添加学生信息
add_student(){
read -p "stu_num:" stu_num
while grep -w "$stu_num" "$students_db" > /dev/null ;do
echo "已经存在该学号的学生了,请改用其他学号!"
read -p "stu_num:" stu_num
done
read -p "stu_name:" stu_name
read -p "school_num:" school_num
#将结果丢失,不显示在屏幕中
while ! grep -w "$school_num" "$schools_db" > /dev/null ; do
echo "不存在该编号的学校,请输入编号存在的学校编号: "
read -p "school_num:" school_num
done
read -p "stu_des:" stu_des
echo -e "$stu_num,\t$stu_name,\t$school_num,\t$stu_des,\r" >> $students_db
echo "成功添加学生信息,添加的信息为: "
grep -w $stu_num $students_db
}
#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.显示所有学生信息
display_students() {
echo "--------------------------"
echo -e "学号\t姓名\t学院\t说明"
sed -n '1,$p' $students_db
echo "--------------------------"
echo -e "\r"
}
#4.查询学生信息
search_student_num() {
echo "--------------------------"
echo "输入要查询的学号"
read num
echo "--------------------------"
echo -e "学号\t姓名\t学院\t说明"
grep -w $num $students_db
# grep -w "${num#*,}" $students_db
echo "--------------------------"
echo "查询成功"
}
#5.修改学生信息
modify_student() {
echo "--------------------------"
echo "输入学生所在的学院:"
read school_num
#防止输入空格
while [ "$school_num" = '' ];do
read -p "输入有误,请重新。输入学生所在的学院:" school_num
done
while ! grep -w "$school_num" "$schools_db" > /dev/null;do
echo "不存在该编号的学院,请重新输入:"
read school_num
#防止输入空格
while [ "$school_num" = '' ];do
read -p "输入有误,请重新。输入学生所在的学院:" school_num
done
done
echo "输入要查询的学号:"
read num
#防止输入空格
while [ "$num" = '' ];do
read -p "输入有误,请重新。输入要查询的学号:" num
done
while ! grep -w "$num,.*,.*,.*," "$students_db" > /dev/null;do
echo "不存在该编号的学生,请重新输入:"
read num
#防止输入空格
while [ "$num" = '' ];do
read -p "输入有误,请重新。输入要查询的学号:" num
done
done
echo "--------------------------"
echo -e "学号\t姓名\t学院\t说明"
grep "${num#,}" $students_db
echo "--------------------------"
echo "要修改的字段信息"
read str1
#防止输入空格
while [ "$str1" = '' ];do
read -p "输入有误,请重新。要修改的字段信息:" str1
done
while ! grep -w "$num,.*,.*,.*," "$students_db"|grep -w "$str1"> /dev/null;do
echo "不存在该字段,请重新输入:"
read str1
#防止输入空格
while [ "$str1" = '' ];do
read -p "输入有误,请重新。要修改的字段信息:" str1
done
done
echo "修改后的字段信息"
read str2
#防止输入空格
while [ "$str2" = '' ];do
read -p "输入有误,请重新。修改后的字段信息:" str2
done
if [ "$str1" = "$school_num" ];then
while ! grep -w "$str2" "$schools_db" > /dev/null;do
echo "不存在该编号的学院,请重新输入:"
read str2
#防止输入空格
while [ "$str2" = '' ];do
read -p "输入有误,请重新。修改后的字段信息:" str2
done
done
fi
read -p "确定删除吗?[yes|no]" choice
case "$choice" in
yes)
#如果修改的是学生编号还要修改成绩表里的学生编号
if [ "$str1" = "$num" ];then
sed -i "/${num#,}/ s/$str1/$str2/" $scores_db
fi
#如果修改的是学生姓名还要修改成绩表里的学生姓名
studentname=$(grep "^$num," "$students_db"|sed -n "1p"|cut -d "," -f 2|cut -f 2) #获取学生的姓名,最后一个cut作用是去除字符串前的制表符
if [ "$str1" = "$studentname" ];then
sed -i "/^$num,/ s/$studentname/$str2/" "$scores_db" #根据学号来修改成绩表姓名的信息
fi
#修改学生表
sed -i "/${num#,}/ s/$str1/$str2/" $students_db
if [ "$?" -eq 0 ];then
echo "------------修改成功--------------"
echo "修改后的学生信息"
echo -e "学号\t姓名\t学院\t说明"
grep "${num#,}" $students_db | grep "$str2"
else
echo "修改失败"
fi
;;
no)
:
;;
*)
echo "请输入[yes|no]"
modify_student
;;
esac
}
###################
#成绩信息模块功能实现
###################
#成绩信息模块菜单
menu3() {
clear
echo -e "\t\t\t**********************"
echo -e "\t\t\t请输入对应数字选择功能"
echo -e "\t\t\t 1. 添加成绩"
echo -e "\t\t\t 2. 删除成绩"
echo -e "\t\t\t 3. 成绩列表"
echo -e "\t\t\t 4. 查找成绩"
echo -e "\t\t\t 5. 修改成绩"
echo -e "\t\t\t 6. 成绩统计"
echo -e "\t\t\t 7. 返回上级"
echo -e "\t\t\t 8. 退出系统"
echo -e "\t\t\t**********************"
echo "请选择:"
read choice
case $choice in
1)
echo -e "\t\t\t添加成绩"
add_score
;;
2)
echo -e "\t\t\t删除成绩"
del_score
;;
3)
echo -e "\t\t\t展示成绩信息"
display_scores
;;
4)
echo -e "\t\t\t搜索成绩信息"
search_score_num
;;
5)
echo -e "\t\t\t修改成绩信息"
modify_score
;;
6)
echo -e "\t\t\t成绩统计"
score_count
;;
7)
echo -e "\t\t\t返回上一个页面"
module
;;
8)
exit 0
;;
*)
menu3
;;
esac
echo "--------------------------"
echo "按任意键继续……"
read c
menu3
}
#成绩统计模块
score_count(){
clear
echo -e "\t\t\t**********************"
echo -e "\t\t\t请输入对应数字选择功能"
echo -e "\t\t\t 1. 每学科的前3名"
echo -e "\t\t\t 2. 个人总成绩前5名"
echo -e "\t\t\t 3. 返回上一级"
echo -e "\t\t\t 4. 退出系统"
echo -e "\t\t\t**********************"
echo "请选择:"
read choice
case $choice in
1)
echo -e "\t\t\t每学科的前3名"
such_course_sort_score
;;
2)
echo -e "\t\t\t个人总成绩前5名"
sort_score_sum_five
;;
3)
menu3
;;
4)
exit 0
;;
*)
score_count
;;
esac
echo "--------------------------"
echo "按任意键继续……"
read c
score_count
}
#1.添加成绩
input_score_info(){ #成绩信息输入
read -p "stu_num:" stu_num
while ! grep -w "$stu_num" "$students_db" > /dev/null ;do
echo "此学号没有录入在系统中,请重新输入正确的学号!"
read -p "stu_num:" stu_num
done
read -p "stu_name:" stu_name
while ! grep -w "$stu_name" "$students_db" > /dev/null ;do
echo "名字和学号不对应,请重新输入"
read -p "stu_name:" stu_name
done
read -p "course:" course
read -p "score:" score
read -p "score_des:" score_des
while grep -w $stu_num $scores_db|grep -w $course > /dev/null ;do #学号和科目确定成绩的唯一性
echo "该学生的此科目成绩已经录入,请再次输入: "
input_score_info
done
}
add_score(){ #添加成绩
input_score_info
echo -e "$stu_num,\t$stu_name,\t$course,\t$score,\t$score_des,\r" >> $scores_db
echo "成功添加学生成绩信息,添加的信息为: "
echo -e "学号\t姓名\t科目\t成绩\t说明"
grep -w $stu_num $scores_db|grep -w $course #学号和科目确定成绩的唯一性
}
#2.删除成绩
del_score(){
read -p "请输入学生的学号" num
read -p "请输入该学生要删除的科目" score
echo "该条成绩信息为:"
grep "^$num," $scores_db|grep "$score,"
read -p "确定删除吗?[yes|no]" choice
case "$choice" in
yes)
sed -i -e "/^$num,.*$score,/d" $scores_db
if [ "$?" -eq 0 ];then
echo "删除成功"
else
echo "不存在该条记录或者删除失败"
fi
;;
no)
:
;;
*)
echo "请输入[yes|no]"
del_score
;;
esac
}
#3.成绩列表
display_scores(){
echo ""
echo -e "学号\t姓名\t科目\t 成绩 说明"
cat $scores_db|column -t
}
#4.查找成绩
search_score_num(){
read -p "输入要查看的学生的学号" num
read -p "输入要查看的科目" score
echo -e "学号\t姓名\t科目\t成绩\t说明"
grep "^$num," $scores_db|grep "$score,"
}
#5.修改成绩
modify_score() {
echo "--------------------------"
read -p "输入学号(不能有空格):" num
while ! grep "^$num," "$scores_db" > /dev/null;do
echo "不存在该编号的学生,请重新输入:"
read num
done
#防止输入空格
while [ "$num" = '' ];do #num=$(printf "$num"|sed s/[[:space:]]//g)
echo "输入有误,请重新:"
read -p "输入学号(不能有空格):" num
done
read -p "输入科目:" course
#防止输入空格
while [ "$course" = '' ];do
echo "输入有误,请重新:"
read -p "输入科目:" course
done
while ! grep "^$num,.*$course," "$scores_db" > /dev/null;do
echo "成绩表里不存在该编号的学生,请重新输入:"
read course
#防止输入空格
while [ "$course" = '' ];do
echo "输入有误,请重新:"
read -p "输入科目:" course
done
done
echo "--------------------------"
echo -e "学号\t姓名\t科目\t成绩\t说明"
grep "^$num," "$scores_db"|grep "$course," #学号和科目确定成绩的唯一性
echo "--------------------------"
read -p "要修改的字段信息:" str1
#防止输入空格
while [ "$str1" = '' ];do
echo "输入有误,请重新:"
read -p "要修改的字段信息:" str1
done
while [ "$str1" = "$num" ];do
echo "请输入其他字段(成绩表里不能瞎改学号,如果非要改,请修改学生表:)"
read str1
#防止输入空格
while [ "$str1" = '' ];do
echo "输入有误,请重新:"
read -p "要修改的字段信息:" str1
done
done
scores_db_studentname=$(grep "^$num," "$scores_db"|sed -n "1p"|cut -d "," -f 2|cut -f 2) #从成绩表里获取学生姓名
while [ "$str1" = "$scores_db_studentname" ];do
echo "请输入其他字段(成绩表里不能瞎改姓名,如果非要改,请修改学生表:)"
read str1
#防止输入空格
while [ "$str1" = '' ];do
echo "输入有误,请重新:"
read -p "要修改的字段信息:" str1
done
done
while ! grep "^$num,.*$course," "$scores_db"|grep "$str1,"> /dev/null;do
echo "不存在该字段,请重新输入:"
read str1
#防止输入空格
while [ "$str1" = '' ];do
echo "输入有误,请重新:"
read -p "要修改的字段信息:" str1
done
done
read -p "修改后的字段信息:" str2
#防止输入空格
while [ "$str2" = '' ];do
echo "输入有误,请重新:"
read -p "修改后的字段信息:" str2
done
read -p "确定删除吗?[yes|no]" choice
case "$choice" in
yes)
sed -i "/^$num,.*$course,/ s/$str1/$str2/" $scores_db
if [ "$?" -eq 0 ];then
echo "------------修改成功--------------"
echo "修改了的信息"
echo -e "学号\t姓名\t科目\t成绩\t说明"
grep "^$num,.*$course," "$scores_db" #学号和科目确定成绩的唯一性
echo "--------------------------"
else
echo "修改失败"
fi
;;
no)
:
;;
*)
echo "请输入[yes|no]"
modify_score
;;
esac
}
#6.个人总成绩前5名排序
sort_score_sum_five(){
echo "-----------总成绩前1到5名---------------"
printf "学号\t\t总成绩\t排名\t\n";
awk -f"," '{ary[$1]+=$4} end{for(key in ary) print key ",\t" 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
}
#程序入口
haha
exit 0
上一篇: 有主见
推荐阅读
-
linux下保留文件系统下剩余指定数目文件的shell脚本
-
Linux下使用Shell脚本实现ftp的自动上传下载的代码小结
-
Linux下实现SNMP一键安装的Shell脚本
-
Linux下实现SSH免密码登录和实现秘钥的管理、分发、部署SHELL脚本分享
-
linux下采用shell脚本实现批量为指定文件夹下图片添加水印的方法
-
shell脚本实现linux系统文件完整性检测
-
linux下实现ftp自动备份shell脚本
-
Bash 脚本实现每次登录到 Shell 时可以查看 Linux 系统信息
-
Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤
-
Shell脚本实现在Linux系统中自动安装JDK