3

有什么方法可以通过值引用变量来访问它吗?

BAR=("hello", "world")

function foo() {

    DO SOME MAGIC WITH $1

    // Output the value of the array $BAR
}

foo "BAR"
4

3 回答 3

5

也许您正在寻找的是间接扩展。来自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"

注意事项:

  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
    }
    
于 2012-08-16T10:04:14.337 回答
2
BAR=("hello", "world")

function foo() {
  eval echo "\${$1[@]}"
}
foo "BAR"
于 2012-08-16T10:10:37.847 回答
0

您可以将数组放入与其名称匹配的字典中。然后你可以查找这个字典来找到你的数组并显示它的内容。

于 2012-08-16T10:00:16.397 回答