我有几个不同的关联数组作为变量:
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
但是这两种方法都不太可行。我能否得到一个间接的层次,来指向我需要的关联数组呢?
读者注意:这篇答案是2013年的。你现在应该使用@ryenus的答案。
bash有变量间接引用,但使用起来有点麻烦:
$ declare -A FIRST=( [hello]=world [foo]=bar )
$ alias=FIRST
$ echo "${!alias[foo]}"
$ item=${alias}[foo]
$ echo ${!item}
bar
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 # 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
数组变量不能被赋予nameref属性。然而,nameref变量可以引用数组变量和带下标的数组变量。
同时,变量间接引用,或更正确地说是间接扩展,也使用感叹号(!),但它要求变量或参数不是一个nameref。
如果参数的第一个字符是感叹号(!),并且参数不是nameref,它会引入一层间接性。
#!/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]}
字符串变量间接引用
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
我认为这就是你的意思:
[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
-a
和-A
有什么区别? - AbsoluteƵERØ