例如,如果我有一个包含 5 个元素的数组:
[a][b][c][d][e]
使用 echo${myarray[4]}
我可以看到它包含什么。
但是如果我不知道给定数组中的元素数量怎么办?有没有办法读取未知长度数组的最后一个元素?即任何数组从右到左读取的第一个元素?
我想知道如何在 bash 中执行此操作。
答案1
从 bash 4.2 开始,你可以只使用负索引 ${myarray[-1]}
获取最后一个元素。你可以对倒数第二个做同样的事情,依此类推;在重击中:
如果用于引用索引数组元素的下标计算结果为小于零的数字,则它将被解释为相对于大于数组最大索引的 1,因此负索引从数组末尾开始倒数,并且索引 -1 指的是最后一个元素。
这同样适用于分配。当它说“表达”时,它的真正意思是表达;您可以在那里编写任何算术表达式来计算索引,包括像早期版本${#myarray[@]}
一样显式使用数组长度进行计算的算术表达式。${myarray[${#myarray[@]} - 1]}
答案2
现代 bash(v4.1 或更高版本)
您可以读取索引处的最后一个元素-1
:
$ a=(a b c d e f)
$ echo ${a[-1]}
f
支持使用负索引从末尾访问数字索引数组从 bash 版本 4.1-alpha 开始。
较旧的 bash(v4.0 或更早版本)
您必须获取数组长度${#a[@]}
,然后减一以获得最后一个元素:
$ echo ${a[${#a[@]}-1]}
f
由于 bash 将数组下标视为算术表达式,因此不需要额外的符号(例如$((...))
)来强制算术求值。
答案3
bash
数组赋值、引用、负索引取消设置仅bash 4.3 中添加。使用旧版本的bash
,您可以在索引中使用表达式array[${#array[@]-1}]
另一种方法,也可以使用旧版本bash
(bash 3.0 或更好):
$ a=('[a]' '[b]' '[c]' '[d]' '[e]')
$ printf %s\\n "${a[@]:(-1)}"
[e]
或者:
$ printf %s\\n "${a[@]: -1}"
[e]
使用负偏移量时,需要将:
with分开-
,以免与:-
扩展混淆。
答案4
您也可以这样做:
$ a=(a b c d e f)
$ echo ${a[$(expr ${#a[@]} - 1)]}
结果:
$ f
您正在做的是获取数组中的所有元素计数并减去 -1,因为您获取的是所有元素,而不是从数组索引 0 开始。