有没有办法通过引用值来访问变量?
BAR=("hello", "world")
function foo() {
DO SOME MAGIC WITH $1
// Output the value of the array $BAR
}
foo "BAR"
答案 0 :(得分:5)
也许您正在寻找的是间接扩张。来自man bash
:
如果参数的第一个字符是感叹号(!),则引入一个变量间接的级别。 Bash使用了 由参数的其余部分形成的变量的值作为变量的名称;然后扩展此变量和该值 用于替换的其余部分,而不是参数本身的值。这被称为间接扩张。该 对此的例外是下面描述的$ {!prefix *}和$ {!name [@]}的扩展。感叹号必须立即跟随 低左支撑以引入间接。
相关文档:Shell parameter expansion (Bash Manual)和Evaluating indirect/reference variables (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 article。
看来您无法使用它来检索数组大小。 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
}
答案 1 :(得分:2)
BAR=("hello", "world")
function foo() {
eval echo "\${$1[@]}"
}
foo "BAR"
答案 2 :(得分:0)
您可以将数组放入与其名称匹配的字典中。然后,您可以查找此字典以查找数组并显示其内容。