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

如何将Shell脚本中echo输出的日期结果存入数组以实现循环?

如何将循环生成的日期存入Bash数组?

我需要通过循环日期获取所有周二和周五,现有脚本能正确打印结果,但不知道怎么把结果存入数组。

原脚本如下:

enddate='2023-05-15'
startdate=2022-12-27
d1=
while ! [[ $d1 > $enddate ]]; do  
    startdate=$(date -d "$startdate + 7 days" +%Y-%m-%d)
    d1=$(date -d "$startdate +3 days" +%Y-%m-%d)
    result=$(printf "$startdate $d1")
    echo ${result[@]} | tr "\n " " "
done 

执行后输出(所有周二和周五的日期):

2023-01-03 2023-01-06 2023-01-10 2023-01-13 2023-01-17 2023-01-20 2023-01-24 2023-01-27 2023-01-31 2023-02-03 2023-02-07 2023-02-10 2023-02-14 2023-02-17 2023-02-21 2023-02-24 2023-02-28 2023-03-03 2023-03-07 2023-03-10 2023-03-14 2023-03-17 2023-03-21 2023-03-24 2023-03-28 2023-03-31 2023-04-04 2023-04-07 2023-04-11 2023-04-14 2023-04-18 2023-04-21 2023-04-25 2023-04-28 2023-05-02 2023-05-05 2023-05-09 2023-05-12 2023-05-16 2023-05-19

我尝试用以下代码存值,但结果是分行的,没法直接用数组循环:

result=$(echo ${result[@]} | tr "\n " " ")
echo ${result[@]}

输出:

2023-01-03 2023-01-06
2023-01-10 2023-01-13
2023-01-17 2023-01-20
2023-01-24 2023-01-27
...

解决方法

核心问题是你之前用result=$(printf...)每次都会覆盖变量的值,无法累积所有日期。正确的做法是初始化一个空数组,每次循环将生成的日期追加到数组中。

修改后的完整脚本:

enddate='2023-05-15'
startdate='2022-12-27'  # 给日期加引号,避免潜在的空格解析问题
dates=()  # 初始化空数组
d1=

while ! [[ $d1 > $enddate ]]; do  
    startdate=$(date -d "$startdate + 7 days" +%Y-%m-%d)
    d1=$(date -d "$startdate +3 days" +%Y-%m-%d)
    # 将当前生成的两个日期追加到数组
    dates+=("$startdate" "$d1")
done 

# 验证数组内容:打印所有日期(空格分隔)
echo "${dates[@]}"

# 遍历数组的示例:逐个打印每个日期
echo "遍历数组输出:"
for date in "${dates[@]}"; do
    echo "$date"
done

关键说明

  • dates=():创建一个空的Bash数组。
  • dates+=("$startdate" "$d1"):使用数组的追加语法,把每次生成的周二(startdate)和周五(d1)添加到数组末尾。引号确保即使日期包含空格(虽然这里不会)也能被正确识别为单个元素。
  • "${dates[@]}":引用整个数组,会展开为数组的所有元素,每个元素作为独立的字符串(避免空格分割问题)。

这样处理后,你就可以直接通过数组dates来操作所有生成的日期,不需要写入文件再读取。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:37:45