如何在Bash中通过for循环提取关联数组的指定键值?
问题解决:通过循环访问关联数组的指定键值
你尝试的${${i}[column_b]}属于Bash不支持的嵌套变量展开语法,因此触发bad substitution错误。以下是几种可行的解决方法:
方法1:使用nameref(Bash 4.3+ 推荐)
nameref是Bash 4.3及以上版本支持的特性,可创建变量引用,直接通过引用访问关联数组:
APP_LIST=('app1' 'app2') declare -A app1=([column_a]="111" [column_b]="222") declare -A app2=([column_a]="333" [column_b]="444") for i in "${APP_LIST[@]}"; do declare -n current_app="$i" # 创建关联数组的引用 echo "${current_app[column_b]}" unset -n current_app # 可选:取消引用 done
执行后会输出:
222 444
方法2:使用eval(兼容旧版本)
如果你的Bash版本低于4.3,可通过eval间接执行变量展开(注意:若$i包含不可控内容,存在安全风险):
APP_LIST=('app1' 'app2') declare -A app1=([column_a]="111" [column_b]="222") declare -A app2=([column_a]="333" [column_b]="444") for i in "${APP_LIST[@]}"; do eval "echo \${$i[column_b]}" done
方法3:间接引用结合数组展开
通过间接引用获取关联数组的定义,再赋值给临时数组访问:
APP_LIST=('app1' 'app2') declare -A app1=([column_a]="111" [column_b]="222") declare -A app2=([column_a]="333" [column_b]="444") for i in "${APP_LIST[@]}"; do declare -A temp="${!i}" echo "${temp[column_b]}" done
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

