Nar*_*asK 2 bash bash-expansion bash-array indirection
考虑以下示例,它似乎与 index 一起工作正常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
Run Code Online (Sandbox Code Playgroud)
但是对于索引,1它什么也不打印:
$ for x in a1 a2; do echo "${!x[1]}"; done
Run Code Online (Sandbox Code Playgroud)
数组本身就可以:
$ echo "${a1[1]} ${a2[1]}"
2 b
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
"${!x[1]}"是使用1数组索引处的元素的间接引用x。
$ foo=123; bar=456; x=(foo bar); echo "${!x[1]}"
456
Run Code Online (Sandbox Code Playgroud)
在当前版本的 Bash(4.3 及更高版本)中,您可以使用 namerefs 来获取您想要的内容:
$ a=(00 11 22 33 44)
$ typeset -n y=a
$ echo "${y[3]}"
33
Run Code Online (Sandbox Code Playgroud)
也就是说,在设置了 nameref 后,"${y[3]}"它是对3由 命名的数组中元素的引用y。
要像您在问题中所做x的那样遍历数组,您只需创建一个 nameref。
a1=(1 2 3); a2=(a b c)
typeset -n x;
for x in a1 a2; do
echo "${x[1]}"
done
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
原因"${!x[0]}"似乎是有效的,x并且x[0]是等价的。如果你echo "${x[0]}"在你的循环中(没有爆炸),你会得到a1, a2,与echo "$x".