有什么方法可以通过值引用变量来访问它吗?
BAR=("hello", "world")
function foo() {
DO SOME MAGIC WITH $1
// Output the value of the array $BAR
}
foo "BAR"
也许您正在寻找的是间接扩展。来自man bash
:
如果参数的第一个字符是感叹号(!),则引入了变量间接级别。Bash 使用由其余参数形成的变量的值作为变量的名称;然后扩展此变量,并将该值用于替换的其余部分,而不是参数本身的值。这称为间接扩展。例外情况是下面描述的 ${!prefix*} 和 ${!name[@]} 的扩展。为了引入间接性,感叹号必须紧跟在左大括号后面。
相关文档:Shell 参数扩展(Bash 手册)和 评估间接/引用变量(BashFAQ)。
这是一个例子。
$ MYVAR="hello world"
$ VARNAME="MYVAR"
$ echo ${!VARNAME}
hello world
请注意,数组的间接扩展有点麻烦(因为${!name[@]}
意味着其他东西。请参阅上面的链接文档):
$ BAR=("hello" "world")
$ v="BAR[@]"
$ echo ${!v}
hello world
$ v="BAR[0]"
$ echo ${!v}
hello
$ v="BAR[1]"
$ echo ${!v}
world
把这个放在你的问题的背景下:
BAR=("hello" "world")
function foo() {
ARR="${1}[@]"
echo ${!ARR}
}
foo "BAR" # prints out "hello world"
数组语法的间接扩展在旧版本的 bash(pre v3)中不起作用。请参阅BashFAQ 文章。
看来您不能使用它来检索数组大小。ARR="#${1}[@]"
不管用。但是,如果数组不是太大,您可以通过制作数组的副本来解决此问题。例如:
function foo() {
ORI_ARRNAME="${1}[@]"
local -a ARR=(${!ORI_ARRNAME}) # make a local copy of the array
# you can now use $ARR as the array
echo ${#ARR[@]} # get size
echo ${ARR[1]} # print 2nd element
}
BAR=("hello", "world")
function foo() {
eval echo "\${$1[@]}"
}
foo "BAR"
您可以将数组放入与其名称匹配的字典中。然后你可以查找这个字典来找到你的数组并显示它的内容。