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

