基于日期对比的Bash校园学生用户创建与管理脚本开发
解决方案:基于离校日期管理学生用户的Bash脚本
嗨,作为Bash新手能自己动手写初始脚本已经超棒啦!我会帮你修改脚本,完美实现根据离校日期创建、停用、删除用户的需求,每一步都会给你讲清楚,方便你理解。
先明确几个前提
- 假设你的CSV文件
file.csv的字段顺序是:firstname;lastname;Day of Entry;Day of leaving,且日期格式为YYYY-MM-DD(如果你的日期是其他格式,比如DD/MM/YYYY,我后面会加转换方法) - 脚本需要以root权限运行(因为
useradd/usermod/userdel都是系统管理命令) - 我们会先把日期转换成统一的可比较格式,Bash中YYYY-MM-DD格式的字符串可以直接用比较运算符判断先后
完整修改后的脚本
#!/bin/bash # 保存原始IFS,避免影响其他命令 OLDIFS=$IFS IFS=";" # 获取当前日期和4周前的日期(统一为YYYY-MM-DD格式) current_date=$(date +%Y-%m-%d) four_weeks_ago=$(date -d "4 weeks ago" +%Y-%m-%d) # 读取CSV文件,跳过第一行表头(如果你的CSV没有表头,可以去掉| sed 1d) while read firstname lastname entry_date leave_date do # 跳过空行(防止CSV末尾有空行导致报错) [ -z "$firstname" ] && continue # 定义用户名(用lastname,和你原来的脚本一致) username="$lastname" # 1. 离校日期在未来:创建用户(如果用户不存在) if [[ "$leave_date" > "$current_date" ]]; then if ! id "$username" &>/dev/null; then useradd -c "${firstname} ${lastname}" -d "/home/${firstname}" -G group1 -s /bin/bash "$username" echo "已创建用户:$username" else echo "用户$username已存在,无需重复创建" fi # 2. 离校日期已过期但不足4周:停用用户 elif [[ "$leave_date" <= "$current_date" && "$leave_date" > "$four_weeks_ago" ]]; then if id "$username" &>/dev/null; then usermod -L "$username" echo "已停用用户:$username" else echo "用户$username不存在,无需停用" fi # 3. 离校日期超过4周:删除用户(-r选项同时删除家目录) elif [[ "$leave_date" <= "$four_weeks_ago" ]]; then if id "$username" &>/dev/null; then userdel -r "$username" echo "已删除用户:$username" else echo "用户$username不存在,无需删除" fi fi done < <(cat file.csv | sed 1d) # sed 1d用于跳过第一行表头,不需要就去掉 # 恢复原始IFS IFS=$OLDIFS
关键部分解释
日期处理:
date +%Y-%m-%d:把当前日期转换成YYYY-MM-DD格式,方便字符串直接比较date -d "4 weeks ago" +%Y-%m-%d:计算出4周前的日期,用来判断是否需要删除用户
用户存在性检查:
id "$username" &>/dev/null:检查用户是否存在,不存在时返回非0值;&>/dev/null是把输出和错误信息都丢弃,避免干扰脚本输出
用户操作命令:
useradd:和你原来的命令一致,添加了存在性检查,避免重复创建报错usermod -L:锁定(停用)用户,用户将无法登录userdel -r:删除用户并同时删除其家目录,如果你不想删家目录可以去掉-r
跳过表头和空行:
sed 1d:跳过CSV的第一行(表头),如果你的CSV没有表头,直接改成< file.csv即可[ -z "$firstname" ] && continue:跳过空行,防止CSV末尾的空行导致变量为空引发错误
如果你CSV的日期格式不是YYYY-MM-DD怎么办?
比如你的日期是DD/MM/YYYY格式,可以用date命令转换成YYYY-MM-DD:
# 把DD/MM/YYYY转换成YYYY-MM-DD leave_date_converted=$(date -d "${leave_date//\//-}" +%Y-%m-%d)
然后在比较的时候用leave_date_converted代替leave_date即可。
测试建议
在正式运行脚本前,你可以先把useradd、usermod -L、userdel -r换成echo,先看看脚本会执行哪些操作,确认没问题再替换回真实命令:
# 比如把创建用户的行换成: echo "将要创建用户:$username"
内容的提问来源于stack exchange,提问作者Chloe
相关产品推荐
相关产品推荐

