Fil*_*str 3 unix linux bash shell
有没有办法通过引用值来访问变量?
BAR=("hello", "world")
function foo() {
    DO SOME MAGIC WITH $1
    // Output the value of the array $BAR
}
foo "BAR"
Run Code Online (Sandbox Code Playgroud)
    也许您正在寻找的是间接扩张.来自man bash:
如果参数的第一个字符是感叹号(!),则引入一个变量间接的级别.Bash使用从参数的其余部分形成的变量的值作为变量的名称; 然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值.这被称为间接扩张.例外情况是下面描述的$ {!prefix*}和$ {!name [@]}的扩展.感叹号必须紧跟左支撑,以引入间接.
相关文档:Shell参数扩展(Bash手册)和 评估间接/参考变量(BashFAQ).
这是一个例子.
$ MYVAR="hello world"
$ VARNAME="MYVAR"
$ echo ${!VARNAME}
hello world
Run Code Online (Sandbox Code Playgroud)
请注意,数组的间接扩展有点麻烦(因为它${!name[@]}意味着其他东西.请参阅上面的链接文档):
$ BAR=("hello" "world")
$ v="BAR[@]"
$ echo ${!v}
hello world
$ v="BAR[0]"
$ echo ${!v}
hello
$ v="BAR[1]"
$ echo ${!v}
world
Run Code Online (Sandbox Code Playgroud)
把它放在你的问题的上下文中:
BAR=("hello" "world")
function foo() {
    ARR="${1}[@]"
    echo ${!ARR}
}
foo "BAR"  # prints out "hello world"
Run Code Online (Sandbox Code Playgroud)
数组语法的间接扩展在旧版本的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
}
Run Code Online (Sandbox Code Playgroud)