Bash脚本日期转换报错排查:解决date: invalid date问题
解决Bash脚本中域名过期日期转换的「date: invalid date」错误
我来帮你搞定这个日期转换的问题!出现「date: invalid date, invalid conversion」错误的核心原因是你直接把whois输出的整行(带"Expiration Date:"这类前缀文本)传给了date命令,它没法识别这种混杂了标签的字符串。另外脚本最后一行还有个语法小错误,咱们一步步修复:
问题根源拆解
你当前的代码里,expdate变量拿到的是whois输出的整行内容,比如类似这样:
Expiration Date: 2025-12-31T23:59:59Z
直接把这个字符串传给date -d,它会因为前面的"Expiration Date:"标签而无法解析成有效日期,自然报错。
修复步骤
1. 提取纯日期字符串
先把whois输出里的日期标签去掉,只保留纯日期部分。可以用sed来完成这个提取:
# 获取带标签的过期日期行 expdate_raw=$(whois $d | egrep -i 'Expiration|Expires on' | head -1) # 提取冒号后面的纯日期字符串(忽略前面的标签和空格) expdate_str=$(echo "$expdate_raw" | sed -E 's/^.*: *//')
2. 转换日期为时间戳
现在用纯日期字符串调用date命令,就能正常转换成时间戳了:
expdate=$(date -d "$expdate_str" +%s)
如果遇到某些whois服务器返回的特殊日期格式(比如31-Dec-2025),GNU date的-d参数通常能自动识别,要是真的识别失败,可以手动指定格式解析,比如:
# 针对DD-Mon-YYYY格式的手动解析 expdate=$(date -d "$expdate_str" +%s)
3. 修复最后一行的语法错误
你脚本最后一行计算剩余天数的代码少了闭合括号,而且要把秒数转换成天数(一天=86400秒),修正后应该是:
printf "Days for expiration : %s\n" "$(((expdate - curdate) / 86400))"
完整修正后的脚本
#!/bin/bash DOM="onet.pl wp.pl" for d in $DOM do echo -n "$d - " whois $d | egrep -i 'Expiration|Expires on' | head -1 # 写入文件 whois $d | egrep -i 'Expiration|Expires on' | head -1 >> /tmp/domain.date # 提取纯日期字符串 expdate_raw=$(whois $d | egrep -i 'Expiration|Expires on' | head -1) expdate_str=$(echo "$expdate_raw" | sed -E 's/^.*: *//') # 转换为时间戳 expdate=$(date -d "$expdate_str" +%s) curdate=$(date +%s) printf "Expiration timestamp : %s\n" "$expdate" printf "Current timestamp : %s\n" "$curdate" printf "Days for expiration : %s\n" "$(((expdate - curdate) / 86400))" done
额外优化建议
- 可以加个判断,如果
expdate_str为空(比如whois查询失败),就跳过转换,避免报错:
if [ -n "$expdate_str" ]; then expdate=$(date -d "$expdate_str" +%s) # 后续计算逻辑 else echo "Failed to get expiration date for $d" fi
内容的提问来源于stack exchange,提问作者ashaneen
相关产品推荐
相关产品推荐

