Bash,指的是按值排列?

有没有办法通过引用一个值来访问variables?

BAR=("hello", "world") function foo() { DO SOME MAGIC WITH $1 // Output the value of the array $BAR } foo "BAR" 

也许你正在寻找的是间接扩张。 从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 } 
 BAR=("hello", "world") function foo() { eval echo "\${$1[@]}" } foo "BAR" 

你可以把你的数组放到与他们的名字匹配的字典中。 然后你可以查看这个字典来找到你的数组并显示它的内容。