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

循环初始化Shell数组仅存最后值?日期数组生成问题求助

解决Shell脚本中日期数组仅保留最后一个元素的问题

我来帮你排查下问题所在,其实核心原因是子shell的环境隔离,还有几个小的语法/逻辑问题,咱们一步步解决:

问题根源分析

  1. 子shell环境隔离:你用了ls muonic_data|(while read line; do ... done),这里的括号会创建一个独立的子shell。子shell内的变量(包括myTab数组)都是临时的,当子shell执行完毕,所有修改都不会传递回父shell,所以父shell里的myTab根本没被正确填充。
  2. 数组索引未递增:你一直用i作为数组索引,但从未对i进行自增操作,导致每次循环都在覆盖同一个位置的元素。
  3. 语法错误:myDate=${myYears[i]}-${myMonths[i]}-${myDays[i]}这行缺少闭合的},导致语法解析混乱。
  4. 不安全的文件遍历:用ls遍历文件可能在文件名包含空格、特殊字符时出错,不是最佳实践。

修复后的完整脚本

#!/bin/bash

# 初始化空数组
myTab=()

# 用Shell Glob遍历目录下的文件,避免ls的缺陷
for line in muonic_data/*; do
    # 提取纯文件名(去掉路径前缀)
    filename=$(basename "$line")
    
    # 用read和参数展开简化日期提取逻辑
    IFS='-' read -r year month rest <<< "$filename"
    day=${rest%%_*}
    
    # 拼接标准格式的日期字符串
    myDate="${year}-${month}-${day}"
    
    echo "Mes dates : $myDate"
    
    # 验证日期格式(bash的[[ =~ ]]不需要给正则加引号)
    if [[ $myDate =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
        # 直接追加元素到数组,无需手动管理索引
        myTab+=("$myDate")
        echo "当前数组内容: ${myTab[*]}"
    fi
done

# 打印完整的日期数组
echo "Mon tableau : ${myTab[*]}"

# 调用expect脚本传递数组元素
expect recupFileName.exp "${myTab[@]}"

关键改进点说明

  • 移除子shell:改用for循环+Glob遍历文件,所有变量操作都在当前shell环境中,数组修改会被永久保留。
  • 数组追加语法:用myTab+=("$myDate")直接向数组末尾添加元素,彻底避免索引覆盖问题。
  • 简化日期提取:用read分割字符串,配合${rest%%_*}(从右往左删除第一个_及之后的内容),比多次调用cut更高效简洁。
  • 安全的文件遍历:Glob模式muonic_data/*能正确处理含空格、特殊字符的文件名,比ls更可靠。

现在执行脚本,你就能得到完整的符合格式要求的日期数组了。

内容的提问来源于stack exchange,提问作者lL. Bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:21:29