无法使用间接扩展访问全局关联数组?

Can't access global associate array using indirect expansion?

我有以下设置:

#! /bin/bash

init_globals() {
    declare -gA global_arr1=( ["key"]="val" )
}
init_globals

echo "${global_arr1["key"]}" # WORKS! print val

local_arr1=( ["key"]="local val" )
i=1
temp=local_arr$i
current_arr=${!temp}
echo ${current_arr["key"]} # WORKS! print local val

temp=global_arr$i
current_arr=${!temp}
echo ${current_arr["key"]} # DOESN'T WORK! expect val but print nothing...

我正在尝试访问基于变量 i 的全局定义的关联数组。所以我使用间接扩展将 current_arr 分配给我想要的。它非常适合本地定义的关联数组。但它不适用于全局数组。为什么会这样?

是因为:

local_arr1=( ["key"]="local val" )

并不是真正的关联数组。您可以通过以下方式查看:

declare -p local_arr1

打印:

declare -a local_arr1='([0]="local val")'

如果你用对了:

declare -A local_arr1=( ["key"]="local val" )

那么两个数组的行为将相同。

您没有将 local_arr1 声明为关联数组。它诞生于

local_arr1=( [key]="local val" )

所以 bash 为你创建一个普通数组,key 被理解为一个变量,其值是数组中的索引(在这种情况下为零,因为没有 $key ).您可以使用 set -eukey=1.

进行测试

请注意,对数组使用间接寻址的正确方法是在字符串中包含索引:

arr1[2]=x
i=1
j=2
tmp=arr$i[$j]
echo ${!tmp}