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

Bash中如何在循环迭代时将i用于动态数组变量名取值

Bash循环中嵌套迭代变量引用数组的实现方案

你原来的写法${CONTAINER_$i_FILES[@]}不符合Bash的变量扩展规则,Bash解析时不会优先处理内层的$i,会直接将CONTAINER_识别为变量名前缀,无法匹配到目标数组。可以用以下两种兼容度不同的方案实现需求:

方案1:Bash 4.3+ 推荐使用nameref(名称引用)

这是最简洁安全的实现方式,除读取外还支持直接修改原数组:

CONTAINER_1_FILES=("a.txt" "b.txt")
CONTAINER_2_FILES=("c.txt" "d.txt")
CONTAINER_3_FILES=("e.txt" "f.txt")

for ((i=1; i <= 3; i++))
do
  # 声明名称引用,指向目标数组
  declare -n current_container="CONTAINER_${i}_FILES"
  # 直接操作current_container等价于操作原数组
  echo "容器${i}文件列表:${current_container[@]}"
  # 示例新增元素:current_container+=("new_file.txt")会同步修改原CONTAINER_${i}_FILES数组
done

方案2:兼容旧版本Bash的间接扩展

不需要高版本Bash支持,仅读取数组场景可用:

CONTAINER_1_FILES=("a.txt" "b.txt")
CONTAINER_2_FILES=("c.txt" "d.txt")
CONTAINER_3_FILES=("e.txt" "f.txt")

for ((i=1; i <= 3; i++))
do
  # 先构造数组的完整扩展表达式
  array_expand="CONTAINER_${i}_FILES[@]"
  # 通过!前缀做间接扩展,拿到数组所有元素赋值给新数组
  CURRENT_CONTAINER=("${!array_expand}")
  echo "容器${i}文件列表:${CURRENT_CONTAINER[@]}"
done

注意事项

  • 不推荐使用eval实现该需求,eval存在代码注入风险,仅在完全可控的场景下可谨慎使用。
  • nameref方式支持对原数组的增删改操作,灵活度远高于间接扩展,环境允许时优先选择该方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:36:04