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

时间:2016-02-09 17:35:02

标签: bash global-variables variable-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分配给我想要的东西。它适用于本地定义的关联数组。但它不适用于全局数组。为什么这样?

2 个答案:

答案 0 :(得分:3)

您没有将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}

答案 1 :(得分:1)

这是因为:

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

实际上不是一个关联数组。您可以查看:

declare -p local_arr1

打印:

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

如果你正确使用它:

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

然后两个数组的行为都相同。