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

如何在Bash中嵌套For循环,动态调用关联数组实现遍历

解决Bash中动态遍历关联数组的问题

你的代码无法正确工作的核心原因是"${domain+arr[@]}"不是Bash中动态引用数组的正确语法,而且脚本开头用#!/bin/sh可能会导致Bash特有特性失效,建议改为#!/bin/bash。

下面提供两种可行的解决方案:

方案1:使用间接扩展(兼容Bash 3.x及以上)

通过构造数组名称,再用eval间接获取数组元素:

#!/bin/bash

domArr=( "ABC" "DEF" "GHI" )
ABCarr=( "1" "2" "3" )
DEFarr=( "4" "5" "6" )
GHIarr=( "7" "8" "9" )

for domain in "${domArr[@]}"
do
    # 构造对应数组的名称
    arr_name="${domain}arr"
    # 间接获取数组所有元素并遍历
    eval "for group in \"\${$arr_name[@]}\"; do
        echo \"domain = '$domain', group = '$group'\"
    done"
done

方案2:使用命名引用(Bash 4.3+推荐)

Bash 4.3及以上支持nameref(命名引用),可直接创建数组别名,写法更简洁安全:

#!/bin/bash

domArr=( "ABC" "DEF" "GHI" )
ABCarr=( "1" "2" "3" )
DEFarr=( "4" "5" "6" )
GHIarr=( "7" "8" "9" )

for domain in "${domArr[@]}"
do
    # 创建对应数组的命名引用
    declare -n current_arr="${domain}arr"
    # 直接遍历引用的数组
    for group in "${current_arr[@]}"
    do
        echo "domain = '$domain', group = '$group'"
    done
    # 可选:取消命名引用,避免后续冲突
    unset -n current_arr
done

说明

  • 方案1的eval需要注意引号转义,确保数组元素包含空格等特殊字符时也能正确处理;
  • 方案2的declare -n会创建指向目标数组的引用,操作current_arr等同于操作对应的ABCarr/DEFarr等数组,更直观且不易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:30:53