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

