首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用bash变量间接访问数组的进一步成员?

如何使用bash变量间接访问数组的进一步成员?
EN

Unix & Linux用户
提问于 2018-09-04 20:03:26
回答 1查看 95关注 0票数 2

考虑一下下面的例子,似乎它在索引0中运行得很好:

代码语言:javascript
复制
$ 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,它不会输出任何内容:

代码语言:javascript
复制
$ for x in a1 a2; do echo "${!x[1]}"; done    

数组本身是可以的:

代码语言:javascript
复制
$ echo "${a1[1]} ${a2[1]}"
2 b

编辑-一个基于ilkkachu答案

的真实生活用例

代码语言:javascript
复制
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
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-09-04 20:54:12

"${!x[1]}"是一个间接引用,它使用数组x的索引D2中的元素。

代码语言:javascript
复制
$ foo=123; bar=456; x=(foo bar); echo "${!x[1]}"
456

在当前版本的Bash (4.3及以上版本)中,您可以使用名称厨师获得所需的内容:

代码语言:javascript
复制
$ a=(00 11 22 33 44)
$ typeset -n y=a
$ echo "${y[3]}"
33

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

要像在问题中那样循环数组,只需使x成为一个名称。

代码语言:javascript
复制
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

代码语言:javascript
复制
typeset -n x;
for x in a1 a2; do
    x[1]=foo
done

"${!x[0]}"看起来起作用的原因是xx[0]是等价的。如果在循环中有echo "${x[0]}" (没有砰),就会得到a1a2,和echo "$x"一样。

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/466859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档