0

我有以下设置:

#! /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我想要的东西。它非常适用于本地定义的关联数组。但它不适用于全局数组。为什么这样?

4

2 回答 2

3

您没有声明local_arr1为关联数组。它随着

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

所以 bash 为您创建一个普通数组,key理解为一个变量,其值是数组中的索引(在这种情况下为零,因为没有$key)。您可以使用set -eu或对其进行测试key=1

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

arr1[2]=x
i=1
j=2
tmp=arr$i[$j]
echo ${!tmp}
于 2016-02-09T17:46:29.907 回答
1

这是因为:

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

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

declare -p local_arr1

打印:

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

如果你正确使用它:

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

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

于 2016-02-09T17:43:48.057 回答