我有以下设置:
#! /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
分配给我想要的东西。它适用于本地定义的关联数组。但它不适用于全局数组。为什么这样?
答案 0 :(得分: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}
答案 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" )
然后两个数组的行为都相同。