Bash,按值引用数组?

时间:2012-08-16 09:48:47

标签: linux bash shell unix

有没有办法通过引用值来访问变量?

BAR=("hello", "world")

function foo() {

    DO SOME MAGIC WITH $1

    // Output the value of the array $BAR
}

foo "BAR"

3 个答案:

答案 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"

注意事项:

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

  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
    }
    

答案 1 :(得分:2)

BAR=("hello", "world")

function foo() {
  eval echo "\${$1[@]}"
}
foo "BAR"

答案 2 :(得分:0)

您可以将数组放入与其名称匹配的字典中。然后,您可以查找此字典以查找数组并显示其内容。