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

