在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
相关产品推荐
相关产品推荐

