你可以在Bash中将关联数组分配给变量吗?

3

我有几个不同的关联数组作为变量:

declare -A FIRST=( [hello]=world [foo]=bar )
declare -A SECOND=( [bonjour]=monde [fu]=ba )

我希望能够将第三个变量赋值给其中一个变量,类似于以下内容:
usethisarray=$FIRST

或者也许

declare -a usethisarray=$FIRST

但是这两种方法都不太可行。我能否得到一个间接的层次,来指向我需要的关联数组呢?


大小写敏感会造成问题吗?-a-A有什么区别? - AbsoluteƵERØ
抱歉,我在这里输入错误了。实际脚本中我确实使用了-A,但它不起作用... - maxst
5个回答

6

读者注意:这篇答案是2013年的。你现在应该使用@ryenus的答案。


bash有变量间接引用,但使用起来有点麻烦:

$ declare -A FIRST=( [hello]=world [foo]=bar )
$ alias=FIRST
$ echo "${!alias[foo]}"

$ item=${alias}[foo]
$ echo ${!item}
bar

就是这样,这正是我在寻找的。而且你说得对,使用起来确实有点麻烦。唉... - maxst
1
这并不是正确的答案,你需要一个nameref,请参考另一个答案:https://dev59.com/inPYa4cB1Zd3GeqPhEzA#70070402 - ryenus
在我的辩护中,namerefs是2013年的一个相当新的功能。 - glenn jackman

3
答案是肯定的,使用数组时参考变量需要是nameref类型:
declare -A FIRST=( [hello]=world [foo]=bar )
declare -A SECOND=( [bonjour]=monde [fu]=ba )

#### ordinary variable assignment does NOT work
declare any_var=FIRST
echo -e '${any_var[@]}:' "${any_var[@]}"
echo -e '${!any_var[@]}:' "${!any_var[@]}"
echo -e '${#any_var[@]}:' "${#any_var[@]}"

#### nameref works, via 'declare -n' or 'local -n'
declare -n arr_ref=SECOND
echo '${arr_ref[@]}:' "${arr_ref[@]}"
echo '${!arr_ref[@]}:' "${!arr_ref[@]}"
echo '${#arr_ref[@]}:' "${#arr_ref[@]}"

结果:

普通变量赋值不起作用

${any_var[@]}: FIRST
${!any_var[@]}: 0
${#any_var[@]}: 1

nameref 可以通过 'declare -n' 或 'local -n' 实现

${arr_ref[@]}: monde ba     # values of the associative array / map
${!arr_ref[@]}: bonjour fu  # keys of the associative array / map
${#arr_ref[@]}: 2           # size of the associative array / map

请参阅https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameters

数组变量不能被赋予nameref属性。然而,nameref变量可以引用数组变量和带下标的数组变量。

同时,变量间接引用,或更正确地说是间接扩展,也使用感叹号(!),但它要求变量或参数不是一个nameref。

如果参数的第一个字符是感叹号(!),并且参数不是nameref,它会引入一层间接性。


1
我认为这是唯一的方法:
#!/bin/bash
declare -A FIRST=( [hello]=world [foo]=bar )
declare -A SECOND=( [bonjour]=monde [fu]=ba )
declare -A usethisarray
for key in ${!FIRST[@]}; do
    usethisarray["$key"]="${FIRST["$key"]}"
done
echo ${usethisarray[hello]}
echo ${usethisarray[foo]}

0

字符串变量间接引用

ARRAY=([a]=1 [b]=2 [c]=3)

name="ARRAY"

eval a=\${$name['a']}

eval b=\${$name['b']}

eval c=\${$name['c']}

echo "$a$b$c"

Output>>> 123

eval $array['a']=10             

echo ${ARRAY['a']}


Output>>> 10

0

我认为这就是你的意思:

[bob in ~] ARRAY=(one two three)

[bob in ~] echo ${ARRAY[*]} one two three

[bob in ~] echo $ARRAY[] one[]

[bob in ~] echo ${ARRAY[2]} three

[bob in ~] ARRAY[3]=four

[bob in ~] echo ${ARRAY[*]} one two three four

参考以下链接:

请查看以下链接以获取更多信息: http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html


抱歉,请尝试此链接。与您所询问的更相关。https://dev59.com/v2w15IYBdhLWcg3wWqj- - Liam Sorsby
这段文本不是我要找的,因为那只是标准的数组操作。另一个stackoverflow链接更接近我的需求,因为它讲到了重命名关联数组。我需要的是一种间接引用正确的关联数组的方法(我的脚本有几个不同的关联数组)。我希望能够在需要时设置一个变量来引用/复制正确的数组。 - maxst
这个内容与数组的直接引用有关,其中包含一个示例:https://dev59.com/6Ggu5IYBdhLWcg3wpYcj - Liam Sorsby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接