Shell脚本日期格式验证与日期比较报错问题排查
修复Shell脚本的日期验证与比较问题
原脚本的两个核心问题
- 日期比较错误:用
-gt整数比较符直接对比MM/DD/YYYY格式的字符串,Shell会把这些字符串当成非整数,抛出integer expression expected错误。 - 格式验证逻辑完全错误:原代码把输入日期和当前日期的格式化输出做对比,这根本没法校验输入是否符合指定格式,完全是逻辑偏差。
修复后的完整脚本
#!/bin/bash # 先检查参数数量是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <日期1> <日期2>" echo "日期格式要求: MM/DD/YYYY (例如 04/10/1999)" exit 255 fi # 定义日期验证函数 validate_date() { local input="$1" # 尝试用date解析输入日期并按指定格式输出,失败则直接返回错误 local parsed if ! parsed=$(date -d "$input" +'%m/%d/%Y' 2>/dev/null); then return 1 fi # 确保解析后的日期和原输入完全一致,防止date自动修正非法日期(比如13/01/2023被转成2025/01/01) [ "$parsed" = "$input" ] } # 验证第一个日期格式 if ! validate_date "$1"; then echo "第一个日期格式无效,请遵循[MM/DD/YYYY]格式" exit 255 fi # 验证第二个日期格式 if ! validate_date "$2"; then echo "第二个日期格式无效,请遵循[MM/DD/YYYY]格式" exit 255 fi # 把日期转成Unix时间戳(整数)再做比较 timestamp1=$(date -d "$1" +%s) timestamp2=$(date -d "$2" +%s) # 判断第一个日期是否小于第二个日期 if [ "$timestamp1" -lt "$timestamp2" ]; then echo "1st should be greater than 2nd" exit 255 fi echo "日期格式合法,且第一个日期大于等于第二个日期" exit 0
关键修复细节
- 格式验证:
- 用
date -d "$input" +'%m/%d/%Y'尝试解析输入,2>/dev/null把错误输出丢到黑洞,避免干扰;如果解析失败(比如输入格式错、日期非法),函数返回1。 - 对比解析后的日期和原输入,防止
date自动修正非法日期(比如输入02/30/2024会被转成03/01/2024,这一步能拦截这种不符合要求的输入)。
- 用
- 日期比较:
用date -d "$date" +%s把日期转换成Unix时间戳(整数),这样就能用-lt等整数比较符正确判断日期先后,解决了原脚本的整数表达式错误。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

