我有几个不同的关联数组作为变量:
declare -A FIRST=( [hello]=world [foo]=bar )
declare -A SECOND=( [bonjour]=monde [fu]=ba )
我想要做的是获取第三个变量并将其分配给一个或另一个,例如:
usethisarray=$FIRST
或许
declare -a usethisarray=$FIRST
但这些都没有真正起作用。我可以获得一定程度的间接指向我需要的关联数组吗?
我有几个不同的关联数组作为变量:
declare -A FIRST=( [hello]=world [foo]=bar )
declare -A SECOND=( [bonjour]=monde [fu]=ba )
我想要做的是获取第三个变量并将其分配给一个或另一个,例如:
usethisarray=$FIRST
或许
declare -a usethisarray=$FIRST
但这些都没有真正起作用。我可以获得一定程度的间接指向我需要的关联数组吗?
bash 具有可变间接性,但使用起来有点痛苦:
$ declare -A FIRST=( [hello]=world [foo]=bar )
$ alias=FIRST
$ echo "${!alias[foo]}"
$ item=${alias}[foo]
$ echo ${!item}
bar
我认为这是唯一的方法:
#!/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]}
我想这就是你的意思:
[bob in ~] ARRAY=(一二三)
[bob in ~] echo ${ARRAY[*]} 一二三
[bob in ~] echo $ARRAY[ ] one[ ]
[bob in ~] echo ${ARRAY[2]} 三
[bob in ~] ARRAY[3]=四
[bob in ~] echo ${ARRAY[*]} 一二三四
参考如下:
有关更多信息,请参阅链接:http: //tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html
字符串变量间接
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
答案是肯定的,并且引用变量需要是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
${arr_ref[@]}: monde ba
${!arr_ref[@]}: bonjour fu
${#arr_ref[@]}: 2
见https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameters
不能为数组变量赋予 nameref 属性。但是,nameref 变量可以引用数组变量和下标数组变量。
同时,可变间接,或更准确地说是间接扩展,使用起来并不痛苦,只是不适合这种用例:
如果 parameter 的第一个字符是感叹号 (!),并且 parameter 不是 nameref,则它引入了间接级别。