Bash脚本if条件失效:如何删除6个月未活跃用户?
问题排查与修复
你的脚本存在几个关键问题导致日期判断逻辑失效,逐一修正如下:
1. 变量赋值语法错误
原代码中date= date -d "-6 month" +%Y-%m-%d写法错误,无法将6个月前的日期正确赋值给变量。正确的命令替换语法需要用$()包裹命令:
date=$(date -d "-6 month" +%Y-%m-%d)
2. 日期格式不统一
你存储的用户活跃日期是2022-4-30(单数字月/日),而date命令生成的是YYYY-MM-DD格式(双数字月/日,比如2024-05-20)。字符串按字典序比较时,单数字格式会导致判断错误——比如2022-4-30会被误判为大于2023-11-20,因为第四个字符4比1大。
必须将用户活跃日期统一转换为YYYY-MM-DD格式,比如从JSON提取后用date命令格式化:
# 假设从JSON提取的原始日期为$raw_date user_last_active=$(date -d "$raw_date" +%Y-%m-%d)
3. 变量命名与逻辑优化
userlist变量名不符合实际用途(它存储的是单个用户的活跃日期),建议改为更清晰的名称,比如user_last_active,避免逻辑混淆。
修正后的完整代码
# 模拟从JSON提取用户最后活跃日期,先统一格式为YYYY-MM-DD user_last_active=$(date -d "2022-4-30" +%Y-%m-%d) # 获取6个月前的日期,格式保持YYYY-MM-DD six_months_ago=$(date -d "-6 month" +%Y-%m-%d) if [[ "$user_last_active" < "$six_months_ago" ]]; then echo "Inactive user. Delete it" else echo "Don't delete" fi
额外可靠方案
如果REST API返回的是时间戳,直接用数值比较更稳妥,无需关注日期格式:
user_timestamp=$(date -d "$user_last_active" +%s) six_months_ago_timestamp=$(date -d "-6 month" +%s) if [[ "$user_timestamp" -lt "$six_months_ago_timestamp" ]]; then echo "Inactive user. Delete it" else echo "Don't delete" fi
内容的提问来源于stack exchange,提问作者Kart
相关产品推荐
相关产品推荐

