Bash间接数组寻址?

Xiè*_*léi 26 arrays bash

假设我有一些bash数组:

A1=(apple trees)
A2=(building blocks)
A3=(color television)
Run Code Online (Sandbox Code Playgroud)

和索引一样J=2,如何获取数组内容A2

Xiè*_*léi 20

我已经找到了解决方案,这可以通过以下方式完成:

$ Aref=A$J
$ echo ${!Aref}
building
$ Aref=A$J[1]
$ echo ${!Aref}
blocks
$ Aref=A$J[@]
$ echo "${!Aref}"
building blocks
Run Code Online (Sandbox Code Playgroud)

  • 你怎么能分配给'A $ J`?你需要一个没有扩展的名称来分配,但是`A $ J =(...)`不起作用. (2认同)

小智 17

值得注意的是,即使是在评估变量时也会替换索引:

$ A2=(building blocks)
$ Aref=A2[index]
$ index=1
$ echo "${!Aref}"
blocks
Run Code Online (Sandbox Code Playgroud)

  • **很棒.**多年的shell脚本+阅读手册至少十几次+*显式尝试正是这个*未能展现这个小宝石!注意,像文字索引一样,**任何算术表达式都是有效的,包括嵌套扩展**,例如.`cycle =(0 1 2); REF = '周期[I ++%$ {#周期[*]}]'; echo $ {!ref} $ {!ref} $ {!ref} $ {!ref} $ {!ref} $ {!ref}#=> 0 1 2 0 1 2` (2认同)

Cha*_*ffy 5

今天(使用 bash 4.3 及更高版本),最佳实践是使用nameref支持:

A1=(apple trees)
A2=(building blocks)
A3=(color television)
J=2

declare -n A="A$J"
printf '%q\n' "${A[@]}"
Run Code Online (Sandbox Code Playgroud)

...将正确发出:

building
blocks
Run Code Online (Sandbox Code Playgroud)

这也可nameref A="A$J"用于 ksh93。有关详细信息,请参阅BashFAQ #6