大二上学期Linux操作系统实验课综合实验1,现在本人大三,当时用了好长时间才完成某海滨老师布置的任务,现提供实验报告供学弟学妹参考,也供有兴趣的烙铁参考,请多指教!(本人实验满分,仅供参考)
一、实验目的:
- 掌握Linux环境下shell编程技术;
- 掌握Linux下常用命令
二、实验内容:
用shell设计一个模拟考勤程序,实现如下功能选择:
1:上班签到
2:下班签出
3:缺勤信息查阅
4:统计出勤率
考勤程序运行后,提示用户输入上述功能选择,并验证用户输入的用户名和密码;所有用户信息保存在userinfo.dat
中。
如果是上班签到,记录签到信息,如果签到时间大于上午8时,则提示用户迟到,并记录该迟到信息到文件check.dat
中。
如果是下班签出,记录签出信息,如果签出时间小于下午6时,则提示用户早退,并记录该早退信息到文件check.dat
。
如果用户选择缺勤信息查询,则将check.dat
中对应的用户迟到早退的信息查询出来并显示。
如果用户选择统计出勤率,则分别显示正常签到和签出的比例。
用户选择功能执行完,Shell程序继续回到功能选择界面等待下一个用户进行操作。
三、实验环境:
Ubuntu系统
四、实验原理:
while 循环
read -p 交互命令
echo 输出命令
if...else... ;case条件语句
grep 文件内容搜索命令
五、实验步骤:
-
运行程序,显示不同功能的选项(0-4)。
-
实现打卡进入功能,包括输入用户信息,与userinfo.dat文件中的信息对比验证,并在
check.dat
中记录签到时间和迟到记录。 -
打卡退出功能类似,需要验证用户信息,记录签出时间,并记录早退情况。
-
查看缺勤信息功能,从
check.dat
显示用户的迟到和早退数据。 -
出勤率计算功能,根据输入的日期显示正常签到和签出率,基于总用户数以及正确签到/签出的 用户数。
六、实验结果:
check.dat userinfo.dat
文件内容见附录
首先运行程序会先打印选项(0-4);对应五个选项分别对应五个功能:退出;签到;签退;查看缺勤信息;统计出勤率。用read键入选项,通过case进行相应功能的实现。
1、实现签到功能:
用read命令从键盘键入用户信息,再使用grep
搜索命令查找userinfo.dat
文件中存在的用户,通过if语句判断用户是否存在或者输入是否错误。
用户不存在时:屏幕输出红字“Incorrect username or password!”
用户存在时:将用户的姓名以及签到时间等相关信息保存至check.dat
文件中。若用户签到时间晚于上午8时,则屏幕输出红底白字的“Late!”告诉用户迟到,并在文件check.dat
中录入迟到信息。
若用户已经签到,则屏幕输出“Already Check In”。
2、实现签退功能:
用read命令从键盘键入用户信息,再使用grep搜索命令查找userinfo.dat
文件中存在的用户,通过if语句判断用户是否存在或者输入是否错误。
用户存在时:正常情况签退的情况会把用户的姓名以及签退时间等相关信息保存到check.dat
文件中。若签退时间早于晚上18点就会输出红底白字“Early Departure!” 。
如果用户没有签到就显示红底白字“Not Check In!”,且无法进行签退。
用户不存在时:屏幕输出红字“Incorrect username or password!”
3、实现缺勤信息查询功能:
使用read命令读取信息,通过grep命令搜索check.dat文件中用户的缺勤信息。
4、实现统计出勤率功能:
先使用read命令获取要查询的日期,再使用wc -l命令统计用户的数量,将grep命令与管道结合,找出当天正常出勤或签退的人数使用expr命令计算出正常的比例。
七、实验总结与分析
实验总结:
本次实验成功地设计了一个模拟考勤程序,实现了所要求的功能选择,包括上班签到、下班签出、缺勤信息查阅和统计出勤率。程序通过验证用户输入的用户名和密码,记录签到和签出的时间信息,并处理迟到和早退的情况。同时,程序还能够查询和显示缺勤信息,并统计正常签到和签出的比例。
实验中的问题和心得:
- 问题:在考勤程序中,用户名和密码的验证是关键的一步,需要确保输入的用户名和密码是正确的。如果验证不通过,程序应该给出明确的提示,以便用户能够及时更正。
- 心得:本次实验中,我们使用了shell编程来实现考勤程序,这不仅锻炼了我们的编程能力,也让我们更深入地了解了shell编程的特点和技巧。此外,我们还学会了如何处理文件和数据库中的数据,这对我们日后的学习和工作都有很大的帮助。
总之,本次实验让我们更好地了解了shell编程的特点和技巧,并锻炼了我们的编程能力。通过解决实验中的问题,我们收获了很多宝贵的经验和心得,为日后的学习和工作打下了坚实的基础。
八、附录
Clab.sh
程序代码如下:(为了学习,没有注释。)
#!/bin/bash
USERINFO_FILE="userinfo.dat"
CHECK_FILE="check.dat"
while true; do
echo -e "\033[34m ============================== \033[0m"
echo -e "\033[34m Attendance Program Options: \033[0m"
echo -n " 1:"
echo -e "\033[34m Clock In \033[0m"
echo -n " 2:"
echo -e "\033[34m Clock Out \033[0m"
echo -n " 3:"
echo -e "\033[34m View Absence Information \033[0m"
echo -n " 4:"
echo -e "\033[34m Calculate Attendance Rate \033[0m"
echo -n " 0:"
echo -e "\033[34m Exit Program \033[0m"
echo -e "\033[34m ==============================\033[0m"
read -p "Enter your choice (0-4): " choice
case $choice in
1)
read -p "Enter your username: " username
read -s -p "Enter your password: " password
echo
# Validate username and password; assume stored in userinfo.dat in the format "username:password"
if grep -q "${username}:${password}" "$USERINFO_FILE"; then
sign_in_time=$(date +"%Y-%m-%d %H:%M:%S")
sign_time=$(date +"%Y-%m-%d")
if !(grep "${username} ${sign_time}" "$CHECK_FILE"|grep -Eq "In|Late");then
if [ $(date +"%H") -ge 8 ]; then
echo -e "\033[41;37m Late! \033[0m"
echo "${username} ${sign_in_time} Late" >> "$CHECK_FILE"
else
echo "Welcome!!!"
echo "${username} ${sign_in_time} Clock In Successful" >> "$CHECK_FILE"
fi
else
echo "Already Checked In"
fi
else
echo -e "\033[31m Incorrect username or password! \033[0m"
fi
;;
2)
read -p "Enter your username: " username
read -s -p "Enter your password: " password
echo
# Validate username and password
if grep -q "${username}:${password}" "$USERINFO_FILE"; then
sign_out_time=$(date +"%Y-%m-%d %H:%M:%S")
sign_time=$(date +"%Y-%m-%d")
#if user not in check.dat ,he should check in.
if (grep -q "${username} ${sign_time}" "$CHECK_FILE");then
if !(grep "${username} ${sign_time}" "$CHECK_FILE"|grep -Eq "Out|Departure");then
if [ $(date +"%H") -le 18 ]; then
echo -e "\033[41;37m Early Departure! \033[0m"
echo "${username} ${sign_out_time} Early Departure" >> "$CHECK_FILE"
else
echo "Goodbye!"
echo "${username} ${sign_out_time} Clock Out Successful" >> "$CHECK_FILE"
fi
else
echo "Already Check Out"
fi
else
echo -e "\033[41;37m Not Check In! \033[0m"
fi
else
echo -e "\033[31m Incorrect username or password! \033[0m"
fi
;;
3)
read -p "Enter your username: " username
# View user's late and early departure information
grep "${username}" "$CHECK_FILE"|grep "Late"
grep "${username}" "$CHECK_FILE"|grep "Early Departure"
;;
4)
read -p "Please enter the date you want to search(format:00-00-00):" date
total_users=$(wc -l < "$USERINFO_FILE")
normal_sign_in=$(grep "Clock In Successful" "$CHECK_FILE"|grep -c "${date}")
normal_sign_out=$(grep "Clock Out Successful" "$CHECK_FILE"|grep -c "${date}")
echo "Normal Clock In Rate: `expr $normal_sign_in \* 100 / $total_users`%"
echo "Normal Clock Out Rate: `expr $normal_sign_out \* 100 / $total_users`%"
;;
0)
echo "Program Exiting!"
exit 0
;;
*)
echo "Invalid choice, please enter again"
;;
esac
done
文件check.dat
的内容(示例)
zhangsan 2023-12-28 07:01:11 Clock In Successful
zhangsan 2023-12-28 20:01:11 Clock Out Successful
zhangsan 2023-12-29 10:01:11 Late
zhangsan 2023-12-29 10:05:45 Early Departure
lisi 2023-12-28 06:41:11 Clock In Successful
lisi 2023-12-28 19:53:11 Clock Out Successful
lisi 2023-12-29 10:07:14 Late
lisi 2023-12-29 10:07:23 Early Departure
wangwu 2023-12-29 7:08:13 Clock In Successful
xiaoming 2023-12-29 11:57:14 Late
xiaoming 2023-12-29 16:19:03 Early Departure
zhangsan 2024-01-04 08:51:44 Late
zhangsan 2024-01-04 08:51:57 Early Departure
文件userinfo.dat
的内容(示例)
zhangsan:1357
lisi:2468
wangwu:1234
zhaoliu:5678
xiaoming:1111