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

在Bash中按月份迭代起止日期,生成%Y-%m*格式字符串

刚好碰到过类似的场景,给你分享两个简洁的shell实现方案,完美适配你从HDFS拿到起止日期后的需求:

方案1:纯Bash+Date循环(最易理解)

这个方法依赖系统自带的date命令,不需要额外工具,逻辑直观,能轻松处理跨年度的月份迭代:

# 先把获取到的起止日期转换成YYYY-MM格式
ST_MONTH=$(date -d "$ST_DT" +%Y-%m)
EN_MONTH=$(date -d "$EN_DT" +%Y-%m)

# 初始化当前月份为起始月份
current_month="$ST_MONTH"

# 循环生成每个月份的目标字符串
while true; do
    echo "${current_month}*"
    # 到达结束月份时退出循环
    [[ "$current_month" == "$EN_MONTH" ]] && break
    # 计算下一个月份:基于当前月份的第一天加1个月
    current_month=$(date -d "$current_month-01 +1 month" +%Y-%m)
done

优点:无需额外依赖,逻辑清晰,支持跨年度(比如从2023-12到2024-02)的场景,兼容性强(Linux环境默认支持)。

方案2:高效数值迭代(适合大跨度月份)

如果你的起止日期跨度很大(比如几年),这个方法通过将月份转换成数值(YYYYMM)来计算差值,避免多次调用date命令,效率更高:

# 将起止日期转换成YYYYMM格式的数值
st_month_num=$(date -d "$ST_DT" +%Y%m)
en_month_num=$(date -d "$EN_DT" +%Y%m)

# 循环遍历所有月份数值
for ((i=st_month_num; i<=en_month_num; i++)); do
    # 把YYYYMM拆分成YYYY-MM格式并拼接*
    echo "${i:0:4}-${i:4:2}*"
done

优点:循环效率更高,减少外部命令调用次数,适合月份跨度大的场景。

完整整合脚本

把你从HDFS获取日期的命令和生成逻辑整合在一起,直接可用:

# 从HDFS获取起止日期(保留你原有的命令)
ST_DT=${6-`hdfs dfs -ls /filepath/key=* | head -2 | tail -1 | cut -d '/' -f6 | cut -d '=' -f2`}
EN_DT=${5-`hdfs dfs -ls /filepath/key=* | tail -1 | cut -d '/' -f6 | cut -d '=' -f2`}

# 生成目标月份字符串(这里用方案1,你可以替换成方案2)
ST_MONTH=$(date -d "$ST_DT" +%Y-%m)
EN_MONTH=$(date -d "$EN_DT" +%Y-%m)

current_month="$ST_MONTH"
while true; do
    echo "${current_month}*"
    [[ "$current_month" == "$EN_MONTH" ]] && break
    current_month=$(date -d "$current_month-01 +1 month" +%Y-%m)
done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:02:01