You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修复细节

  • 格式验证:
    1. 用date -d "$input" +'%m/%d/%Y'尝试解析输入,2>/dev/null把错误输出丢到黑洞,避免干扰;如果解析失败(比如输入格式错、日期非法),函数返回1。
    2. 对比解析后的日期和原输入,防止date自动修正非法日期(比如输入02/30/2024会被转成03/01/2024,这一步能拦截这种不符合要求的输入)。
  • 日期比较:
    用date -d "$date" +%s把日期转换成Unix时间戳(整数),这样就能用-lt等整数比较符正确判断日期先后,解决了原脚本的整数表达式错误。

内容的提问来源于stack exchange,提问作者Lisa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:01:09