有没有办法用 bash 读取数组的最后一个元素?

有没有办法用 bash 读取数组的最后一个元素?

例如,如果我有一个包含 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 开始。

相关内容