使用 bash 变量间接寻址时如何访问数组的更多成员?

使用 bash 变量间接寻址时如何访问数组的更多成员?

考虑下面的例子,看起来它与索引一起工作得很好0

$ a1=(1 2 3)
$ a2=(a b c)
$ for x in a1 a2; do echo "${!x}"; done
1
a
$ for x in a1 a2; do echo "${!x[0]}"; done
1
a

然而,使用索引1它不会打印任何内容:

$ for x in a1 a2; do echo "${!x[1]}"; done    

数组本身就很好:

$ echo "${a1[1]} ${a2[1]}"
2 b

编辑 - 基于的现实生活用例伊尔卡丘回答

SHIBB=(https://shibboleth.net/downloads/service-provider/3.0.2/ shibboleth-sp-3.0.2 .tar.gz)
XERCES=(http://apache.mirrors.nublue.co.uk//xerces/c/3/sources/ xerces-c-3.2.1 .tar.gz)
XMLSEC=(http://apache.mirror.anlx.net/santuario/c-library/ xml-security-c-2.0.1 .tar.gz)
XMLTOOL=(http://shibboleth.net/downloads/c++-opensaml/latest/ xmltooling-3.0.2 .tar.gz)
OPENSAML=(http://shibboleth.net/downloads/c++-opensaml/latest/ opensaml-3.0.0 .tar.gz)

typeset -n x
for x in XERCES XMLSEC XMLTOOL OPENSAML SHIBB; do
  url="${x[0]}" app="${x[1]}" ext="${x[2]}"
  [ -f "./${app}${ext}" ] || wget "${url}${app}${ext}"
  tar -xf "./${app}${ext}"
  cd "./${app}" && ./configure && make -j2 && make install && ldconfig
  cd ..
done

答案1

"${!x[1]}"1是使用数组索引处的元素的间接引用x

$ foo=123; bar=456; x=(foo bar); echo "${!x[1]}"
456

在当前版本的 Bash(4.3 及更高版本)中,您可以使用 namerefs 来获取您想要的内容:

$ a=(00 11 22 33 44)
$ typeset -n y=a
$ echo "${y[3]}"
33

也就是说,在设置了 nameref 后,是对名为 的数组中的"${y[3]}"元素的引用。3y


要像在问题中那样循环遍历数组,只需创建x一个 nameref 即可。

a1=(1 2 3); a2=(a b c)
typeset -n x;
for x in a1 a2; do
    echo "${x[1]}"
done

循环完成的赋值for会更改其自身的值x(更改引用指向的内容)。常规赋值(x=123、 或x[1]=123)会更改当前引用的变量x。所以这会将a1[1]和更改a2[1]foo

typeset -n x;
for x in a1 a2; do
    x[1]=foo
done

"${!x[0]}"似乎有效的原因是xx[0]是等价的。如果你有echo "${x[0]}"循环(没有爆炸),你会得到a1, a2, 与 相同echo "$x"

相关内容