我已经为这个问题努力了很长时间,而且似乎找不到可行的解决方案。
假设我已经声明了两个关联数组。
inititalize
我可以像这样获得键列表:
declare -A FOO_ARRAY=(
[a]="first"
[b]="second"
[c]="third"
)
declare -A BAR_ARRAY=(
[a]="first"
[b]="second"
[c]="third"
)
我还可以通过执行以下操作来动态地从数组中引用键:
$ echo ${!FOO_ARRAY[@]}
c b a
$ echo ${!BAR_ARRAY[@]}
c b a
但是,如果您注意到用于动态引用变量的运算符也与从关联数组中获取键列表相同,那么我该如何做才能在关联数组中动态列出键呢?
像这样的天真示例会导致for KEY in FOO BAR
do
temp="${KEY}_ARRAY[a]"
echo ${!temp}
done
错误。
invalid variable name
我正在寻找的是一种从关联数组中动态返回键列表的方法,就像上面的代码示例返回了一样:
$ export NAME=foo
$ export temp="\!${NAME^^}_ARRAY[@]"
$ echo ${!temp}
bash: \!FOO_ARRAY[@]: invalid variable name
答案 0 :(得分:3)
您可以使用nameref
:
declare -rgA FOO_ARRAY=(
[a]="first"
[b]="second"
[c]="third"
)
name="foo"
declare -n array="${name^^}_ARRAY"
echo "The keys are: " "${!array[@]}"
答案 1 :(得分:3)
使用declare -n
。来自help declare
:
-n make NAME a reference to the variable named by its value
示例:
declare -A foo_array=(
[a]="first"
[b]="second"
[c]="third"
)
declare -n temp="foo_array"
echo "${!temp[@]}" # -> a b c
有关更多详细信息,请参见"Bash Builtins" section下的info bash
。
答案 2 :(得分:0)
这将有效
NAME=foo
temp="${NAME^^}_ARRAY[@]"
echo ${!temp}
说明::此处temp仅将“ FOO_ARRAY [@]”存储为字符串,并以引用方式回显时,它确实会打印值。
示例
declare -rgA FOO_ARRAY=(
[a]="first"
[b]="second"
[c]="third"
)
declare -rgA BAR_ARRAY=(
[a]="first"
[b]="second"
[c]="third"
)
echo ${!FOO_ARRAY[@]}
echo ${!BAR_ARRAY[@]}
for KEY in FOO BAR
do
temp="${KEY}_ARRAY[a]"
echo ${!temp}
done
NAME=foo
temp="${NAME^^}_ARRAY[@]"
echo ${!temp}
运行:
a b c
a b c
first
first
first second third