Bash,按值引用数组?

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)

Sha*_*hin 5

也许您正在寻找的是间接扩张.来自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)

注意事项:

  1. 数组语法的间接扩展在旧版本的bash(pre v3)中不起作用.请参阅BashFAQ文章.

  2. 看来您无法使用它来检索数组大小.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)