Shell脚本编写学生成绩管理系统(附源码)

目录

开发工具与环境

功能说明

代码结果展示

一、主界面 

二、添加学生成绩

三、修改学生成绩

四、删除学生成绩

五、查找单个学生成绩

六、显示所有学生成绩

七、给学生成绩排序

源码


开发工具与环境

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

喜欢的可以帮忙点个赞哦!谢谢大家

  • 23
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
学生成绩管理系统可以使用Shell脚本编写。下面是一个简单的示例: ```shell #!/bin/bash # 初始化学生信息数组 students=("张三" "李四" "王五") # 初始化学生成绩数组 scores=(80 90 85) # 显示菜单选项 function display_menu { echo "学生成绩管理系统" echo "1. 显示所有学生信息" echo "2. 添加学生信息" echo "3. 删除学生信息" echo "4. 修改学生成绩" echo "5. 退出" } # 显示所有学生信息 function display_students { echo "学生信息:" for ((i=0; i<${#students[@]}; i++)); do echo "${students[$i]}: ${scores[$i]}" done } # 添加学生信息 function add_student { read -p "请输入学生姓名: " name read -p "请输入学生成绩: " score students+=("$name") scores+=("$score") echo "添加成功!" } # 删除学生信息 function delete_student { read -p "请输入要删除的学生姓名: " name index=-1 for ((i=0; i<${#students[@]}; i++)); do if [[ "${students[$i]}" == "$name" ]]; then index=$i break fi done if [[ $index -ge 0 ]]; then unset students[$index] unset scores[$index] students=("${students[@]}") scores=("${scores[@]}") echo "删除成功!" else echo "学生不存在!" fi } # 修改学生成绩 function modify_score { read -p "请输入要修改成绩的学生姓名: " name index=-1 for ((i=0; i<${#students[@]}; i++)); do if [[ "${students[$i]}" == "$name" ]]; then index=$i break fi done if [[ $index -ge 0 ]]; then read -p "请输入新的学生成绩: " score scores[$index]=$score echo "修改成功!" else echo "学生不存在!" fi } # 主程序 while true; do display_menu read -p "请输入选项: " option case $option in 1) display_students;; 2) add_student;; 3) delete_student;; 4) modify_score;; 5) break;; *) echo "无效选项!";; esac done ``` 这个脚本实现了以下功能: - 显示所有学生信息:显示每个学生的姓名和成绩。 - 添加学生信息:允许输入新的学生姓名和成绩,并将其添加到数组。 - 删除学生信息:根据学生姓名删除相应的学生记录。 - 修改学生成绩:根据学生姓名修改对应的成绩

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aogu181

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值