目录
开发工具与环境
1.操作系统:Linux
2.VMware Workstation Pro 虚拟机
3.发行版本:CenOS 7
版本不一定要一样,是Linux环境下能运行shell脚本就行
功能说明
1.添加学生成绩
2.修改学生成绩
3.删除学生成绩
4.查找单个学生成绩
5.显示所有学生成绩
6.给学生成绩排序
代码结果展示
一、主界面
二、添加学生成绩
三、修改学生成绩
四、删除学生成绩
五、查找单个学生成绩
六、显示所有学生成绩
七、给学生成绩排序
源码
#!bin/bash
#定义存放程序数据文件的位置
# NO.1 学生成绩文件
Student_Score=/home/ao181/praticeShell/linuxClass/Student_Score.dat
#程序起始界面菜单
startMenu(){
clear #清屏:将此行作为第一行,如果不习惯的可以去掉,也可以自行添加
Student_Score_page
}
#学生成绩管理模块
#===========================================================================
#学生成绩管理界面
Student_Score_page(){
echo -e "\t-------------欢迎使用学生成绩管理系统---------------"
echo -e "\t* 1. 学生成绩添加. *"
echo -e "\t* 2. 学生成绩修改. *"
echo -e "\t* 3. 学生成绩删除. *"
echo -e "\t* 4. 查看单个学生. *"
echo -e "\t* 5. 查看所有成绩. *"
echo -e "\t* 6. 查看成绩排名. *"
echo -e "\t* 0. 退出系统. *"
echo -e "\t* *"
echo -e "\t* 小组成员:xxx、xxx、xxx *"
echo -e "\t----------------------------------------------------"
echo -n "请输入功能选择(0~5):"
if [ -f ./Student_Score.dat ]
then
:
else
touch ./Student_Score.dat
fi
while [ true ] ; do
read select
case $select in
1) add_Score_Info ;;
2) modify_Score_Info ;;
3) del_Score_Info ;;
4) search_Score_Single_Info ;;
5) view_Score_Info ;;
6) rank_Viewer ;;
0) quit_Program ;;
*) error_chose_function ;;
esac
done
}
#查看单个学生成绩
search_Score_Single_Info(){
#检测ID有效性
while [ true ] ; do
echo -n "请输入要查询的学生ID (1000~~):"
read sid
ID_flag=$(echo "$sid" |grep -c "^[0-9]\{4,10\}$")
if [ "$ID_flag" = "0" ]
then
echo "警告:ID输入不合法,请按照要求输入!"
continue
fi
#检验id是否存在,
count=$(grep "$sid" $Student_Score | wc -l)
if [ "$count" = "0" ]
then
echo "警告:学生ID不存在,请输入正确的ID~"
continue
fi
break
done
lineNum=$(grep -n $sid $Student_Score |cut -d ":" -f 1 )
echo -e "ID\t姓名\t科目\t成绩\t科目\t成绩\t科目\t成绩\t总分"
sed -n "${lineNum}p" $Student_Score
while [ true ] ; do
echo -n "是否继续查询:(Y or N):"
read make_sure
case "$make_sure" in
y | Y) search_Score_Single_Info ;;
n | N) Student_Score_page ;;
*) echo "警告:输入错误! 请按照要求输入!";;
esac
done
}
#学生成绩添加(包括:学生编号<唯一>和学生姓名,科目,成绩)
add_Score_Info(){
#检测ID有效性
while [ true ] ; do
echo -n "输入学生ID (1000~~):"
read sid
ID_flag=$(echo "$sid" |grep -c "^[0-9]\{4,10\}$")
if [ "$ID_flag" = "0" ]
then
echo "警告:ID输入不合法,请按照要求输入!"
continue
fi
#检验id是否存在,确保id唯一性
count=$(grep "$sid" $Student_Score | wc -l)
if [ "$count" = "1" ]
then
echo "警告:学生ID已经存在,无法添加成绩~"
continue
fi
break
done
#获取指定学号学生姓名
#lineNum=$(grep -n $sid $Student_Information |cut -d ":" -f 1 )
#name=$(cat $Student_Information | awk '{print $2 }'|sed -n ''"$lineNum"'p') #从指定的文本中获取指定行的指定列的参数
while [ true ] ; do
read -p "请输入姓名:" name
if [ "$name" = "" ] ; then
echo "名字不能为空!!请重新输入!!"
continue
else
break
fi
done
echo -ne "$sid\t$name" >> $Student_Score
#统一输入学生考试的科目和成绩 (语文、数学、英语):
echo "请输入各科成绩(0~100)"
i=3
total=0
while [ "$i" -gt 0 ] ; do
case "$i" in #科目有需要可以自行添加
"3") cname="语文" ;;
"2") cname="数学" ;;
"1") cname="英语" ;;
esac
echo -ne "\t$cname" >> $Student_Score
#检测成绩有效性
while [ true ] ; do
echo -n "输入$cname成绩:"
read score
if [ "$score" = "" ]
then
echo "成绩不能为空!请重新输入"
continue
fi
if [ "$score" -gt -1 -a "$score" -lt 101 ] #-gt(grant than ,大于)
then #-lt(less than 小于)
: #-a(and,逻辑“与”关系)
else #注意[]里的空格
echo "警告:输入不符合要求,请重新输入!范围:0~100"
continue
fi
echo -ne "\t$score" >> $Student_Score
total=$(($total + $score)) #计算总成绩
break
done
i=$((i-1)) #下一科
done
echo -e "\t$total" >> $Student_Score
#判断添加完成一条记录的后续操作
while [ true ] ; do
echo -n "是否继续添加:(Y or N):"
read make_sure
case "$make_sure" in
y | Y) add_Score_Info ;;
n | N) Student_Score_page ;;
*) echo "警告:输入错误! 请按照要求输入!";;
esac
done
}
#学生成绩修改
modify_Score_Info(){
#检测ID有效性
while [ true ] ; do
echo -n "输入要修改的学生ID (1000~~):"
read sid
ID_flag=$(echo "$sid" |grep -c "^[0-9]\{4,10\}$")
if [ "$ID_flag" = "0" ]
then
echo "警告:ID输入不合法,请按照要求输入!"
continue
fi
count=$(grep "$sid" $Student_Score | wc -l)
if [ "$count" = "0" ]
then
echo "警告:学生ID不存在!无法修改~"
continue
fi
break
done
#获取指定学号学生姓名
lineNum=$(grep -n $sid $Student_Score |cut -d ":" -f 1 )
name=$(cat $Student_Score | awk '{print $2 }'|sed -n ''"$lineNum"'p') #从指定的文本中获取指定行的指定列的参数
newInfo=$sid"\t"$name
#统一输入学生要修改的成绩 (语文、数学、英语):
echo "请修改各科成绩(0~100)"
i=3
total=0
while [ "$i" -gt 0 ] ; do
case "$i" in
"3") cname="语文" ;;
"2") cname="数学" ;;
"1") cname="英语" ;;
esac
newInfo=$newInfo"\t"$cname
#检测成绩有效性
while [ true ] ; do
echo -n "请输入$cname成绩:"
read score
if [ "$score" = "" ]
then
echo "成绩不能为空,请重新输入!"
continue
fi
if [ "$score" -gt -1 -a "$score" -lt 101 ] #-gt(grant than ,大于)
then #-lt(less than 小于)
: #-a(and,逻辑“与”关系)
else #注意[]里的空格
echo "警告:输入不符合要求,请重新输入!范围:0~100"
continue
fi
total=$(($total + $score))
break
done
i=$((i-1))
newInfo=$newInfo"\t"$score
done
newInfo=$newInfo"\t"$total
echo "原记录为:"
echo -e $(grep $sid $Student_Score )
echo "新记录为:"
echo -e $newInfo
lineNum=$(grep -n $sid $Student_Score |cut -d ":" -f 1 )
while [ true ] ; do
echo -n "确定要记录修改?(Y or N):"
read make_sure
case "$make_sure" in
Y | y ) sed -i ' '"$lineNum"'s/.*/'"$newInfo"'/ ' $Student_Score
echo "修改成功!"
break ;;
N | n ) Student_Score_page ;;
*) echo echo "警告:错误输入,请重新输入!" ;;
esac
done
#判断修改完成一条记录的后续操作
while [ true ] ; do
echo -n "是否继续修改:(Y or N):"
read make_sure
case "$make_sure" in
y | Y) modify_Score_Info ;;
n | N) Student_Score_page ;;
*) echo "警告:输入错误! 请按照要求输入!";;
esac
done
}
#学生信息删除
del_Score_Info(){
while [ true ] ; do
echo -n "输入要删除的学生ID (1000~~):"
read sid
ID_flag=$(echo "$sid" |grep -c "^[0-9]\{4,10\}$")
if [ "$ID_flag" = "0" ]
then
echo "警告:ID输入不合法,请按照要求输入!"
continue
fi
count=$(grep "$sid" $Student_Score | wc -l)
if [ "$count" = "0" ]
then
echo "警告:该学生ID不存在! 无法删除~"
continue
fi
break
done
echo "原记录为:"
echo -e $(grep $sid $Student_Score )
while [ true ] ; do
echo -n "确定要删除记录?(Y or N):"
read make_sure
case "$make_sure" in
Y | y ) sed -i '/'"$sid"'/d' $Student_Score
echo "删除成功!"
break ;;
N | n ) Student_Score_page ;;
*) echo echo "警告:错误输入,请重新输入!" ;;
esac
done
#判断删除完成一条记录的后续操作
while [ true ] ; do
echo -n "是否继续删除:(Y or N):"
read make_sure
case "$make_sure" in
y | Y) del_Score_Info ;;
n | N) Student_Score_page ;;
*) echo "警告:输入错误! 请按照要求输入!";;
esac
done
}
#显示学生信息
view_Score_Info(){
echo -e "------------------------------------------------------------"
echo -e "学生信息列表:"
echo -e "ID\t姓名\t科目\t成绩\t科目\t成绩\t科目\t成绩\t总分"
#cat -e $Student_Score | awk '{print $1 "\t" $2 "\t" $3 "\t" $4 "\t" $5 "\t" $6 "\t" $7 "\t" $8 "\t" $9 }'
cat $Student_Score
echo -e "------------------------------------------------------------"
echo -n "按回车键退出!"
read some
Student_Score_page
}
#查看排名
rank_Viewer(){
#cat $Student_Score |sed -n '1,3p' #只输出该文本的前三行
#cat $Student_Score |awk '{print $1 "\t" $2 "\t"}'
#cat $Student_Score |sort -k4,4 -r -n
#排序,第一个4代表的开始排序的列,第二个4是表示结束排序的列 -r(逆转结果) -n 代表按照指定的列来排序
echo -n "请输入要查询的排名(前几名):"
read num
echo "------------------------------------------------------------"
i=3
while [ "$i" -gt 0 ] ; do
case "$i" in
"3") cname="语文"
k=4 ;;
"2") cname="数学"
k=6 ;;
"1") cname="英语"
k=8 ;;
esac
echo -e "$cname前"$num"名:"
echo -e "学号\t姓名\t分数"
index=0
# -k 按指定列进行排序 指定(k)
# -r 降序排列
# -n 依照数值的大小排序
if [ $k=4 ] ; then
cat $Student_Score |sort -k $k,$k -r -n |sed -n '1,'"$num"'p' |awk '{print $1 "\t" $2 "\t" $4 }'
elif [ $k=6 ]; then
cat $Student_Score |sort -k $k,$k -r -n |sed -n '1,'"$num"'p' |awk '{print $1 "\t" $2 "\t" $6 }'
else
cat $Student_Score |sort -k $k,$k -r -n |sed -n '1,'"$num"'p' |awk '{print $1 "\t" $2 "\t" $8 }'
fi
echo "------------------------------------------------------------"
i=$((i-1))
done
echo "总分前"$num"名:"
echo -e "学号\t姓名\t总分"
cat $Student_Score |sort -k 9,9 -r -n | sed -n '1,'"$num"'p'|awk '{print $1 "\t" $2 "\t" $9 "\t"}'
echo "-------------------------------------------------------"
echo -n "按回车键退出!"
read some
Student_Score_page
}
#===========================================================================
#退出程序
quit_Program(){
echo "bye! 欢迎下次使用~"
exit
}
#输出错误信息
error_chose_function(){
echo "功能选择错误,请输入选项对应的数字来进行功能的选择."
echo -n "请重新输入:"
}
#启动程序起始界面
startMenu
喜欢的可以帮忙点个赞哦!谢谢大家