实验项目名称:基于shell脚本的模拟考勤程序

大二上学期Linux操作系统实验课综合实验1,现在本人大三,当时用了好长时间才完成某海滨老师布置的任务,现提供实验报告供学弟学妹参考,也供有兴趣的烙铁参考,请多指教!(本人实验满分,仅供参考)

一、实验目的:

  1. 掌握Linux环境下shell编程技术;
  2. 掌握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 文件内容搜索命令 

五、实验步骤:

  1. 运行程序,显示不同功能的选项(0-4)。

  2. 实现打卡进入功能,包括输入用户信息,与userinfo.dat文件中的信息对比验证,并在check.dat中记录签到时间和迟到记录。

  3. 打卡退出功能类似,需要验证用户信息,记录签出时间,并记录早退情况。

  4. 查看缺勤信息功能,从check.dat显示用户的迟到和早退数据。

  5. 出勤率计算功能,根据输入的日期显示正常签到和签出率,基于总用户数以及正确签到/签出的 用户数。

六、实验结果:

check.dat userinfo.dat文件内容见附录
首先运行程序会先打印选项(0-4);对应五个选项分别对应五个功能:退出;签到;签退;查看缺勤信息;统计出勤率。用read键入选项,通过case进行相应功能的实现。
图1

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命令计算出正常的比例。
在这里插入图片描述
在这里插入图片描述

七、实验总结与分析

实验总结:

本次实验成功地设计了一个模拟考勤程序,实现了所要求的功能选择,包括上班签到、下班签出、缺勤信息查阅和统计出勤率。程序通过验证用户输入的用户名和密码,记录签到和签出的时间信息,并处理迟到和早退的情况。同时,程序还能够查询和显示缺勤信息,并统计正常签到和签出的比例。

实验中的问题和心得:

  1. 问题:在考勤程序中,用户名和密码的验证是关键的一步,需要确保输入的用户名和密码是正确的。如果验证不通过,程序应该给出明确的提示,以便用户能够及时更正。
  2. 心得:本次实验中,我们使用了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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值