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

在Bash中生成指定格式日期时遭遇无限循环问题

Bash脚本无限循环问题修复:生成指定区间的小时级日期

你的脚本陷入无限循环的核心原因是变量d的格式在循环中发生了变化:

  • 初始d是纯日期格式2023-11-04
  • 第一次执行d=$(date -d "$d 1 hour")后,d会变成包含时分秒的完整时间字符串(比如Sat Nov 4 01:00:00 UTC 2023,具体格式取决于系统locale)
  • 后续循环中,d永远不会等于纯日期字符串2023-11-06,导致循环条件永远成立

以下是两种可靠的修复方案:

方案1:统一日期格式比较

保持日期字符串的比较逻辑,每次更新d后提取纯日期部分进行判断:

#!/bin/bash

d=2023-11-04
end_date="2023-11-06"

while true; do
    # 输出当前小时的目标格式
    printf "%s\n" "$(date -d "$d" +'%Y-%m-%d-%H')"
    
    # 提取当前日期的纯日期部分
    current_date=$(date -d "$d" +'%Y-%m-%d')
    # 到达结束日期时退出循环
    if [ "$current_date" = "$end_date" ]; then
        break
    fi
    
    # 推进1小时
    d=$(date -d "$d 1 hour")
done

方案2:使用时间戳(更可靠)

通过时间戳数值比较,彻底避免格式匹配问题,尤其适合跨时区或夏令时场景:

#!/bin/bash

# 将起始/结束时间转换为Unix时间戳(秒)
start_ts=$(date -d "2023-11-04 00:00" +%s)
end_ts=$(date -d "2023-11-06 00:00" +%s)

current_ts=$start_ts
while [ "$current_ts" -lt "$end_ts" ]; do
    # 输出目标格式
    date -d "@$current_ts" +'%Y-%m-%d-%H'
    # 每次推进3600秒(1小时)
    current_ts=$((current_ts + 3600))
done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:05:16