无法使用间接扩展访问全局关联数组?
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 -eu
或 key=1
.
进行测试
请注意,对数组使用间接寻址的正确方法是在字符串中包含索引:
arr1[2]=x
i=1
j=2
tmp=arr$i[$j]
echo ${!tmp}
我有以下设置:
#! /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 -eu
或 key=1
.
请注意,对数组使用间接寻址的正确方法是在字符串中包含索引:
arr1[2]=x
i=1
j=2
tmp=arr$i[$j]
echo ${!tmp}