访问最后但bash数组的元素

时间:2015-03-27 16:54:57

标签: arrays bash

我可以像这样访问数组的所有元素:

echo ${myarray[@]}

和元素数量:

echo ${#myarray[@]}

我可以通过以下方式获取第n个元素:

echo ${myarray[@]:(-1)}

但是我尝试以下方法来获取第n-1个数组元素:

echo ${myarray[@]:(-2)}

但我最后得到了最后两个元素。我如何才获得最后一个元素?

3 个答案:

答案 0 :(得分:6)

您可以添加另一个冒号,并指定切片的长度:

echo "${myarray[@]: -2: 1}"

例如(虽然我很惭愧在这台机器上显示我的复古版bash ...):

$ echo "$BASH_VERSION"
3.1.20(4)-release
$ a=( 1 2 3 )
$ echo ${a[@]: -2: 1}
2

答案 1 :(得分:1)

我的bash版本似乎直接支持负面指数:

$ echo $BASH_VERSION
4.3.33(1)-release
$ x=( {0..100} )
$ echo "${x[-45]}"
56

该功能已添加到bash-4.3-alpha中。请参阅change log,4.3-alpha下的3x部分。

编辑:关于负指数的观察

我在Gordon Davisson's answer中评论说,如果减法器大于数组,你会收到错误。对于Bash 4.3中的负面指数而言似乎也是如此:

$ myarray=( {0..100} )
$ echo "${myarray[-104]}"
-bash: myarray: bad array subscript

这与普通的bash稀疏数组不一致,任何正索引都是有效的。它可能不是设置,但没有错误:

$ echo "${myarray[500]}"
(no output)

另一方面,负切片不会受此影响:

$ echo "${myarray[@]: -500:1}"
(no output; no error)

摘要

  • 旧的bash支持 slice 方法,不受溢出错误的影响,但读写起来很麻烦。
  • 否定索引方法可以直接读写,但仅在最近的bash版本中受支持,如果索引过于负,则可能会出错。
  • 计算索引方法仍然相当简单,可以在旧的bash版本中使用,但如果负值过大,可能会出错或给出意外答案。

答案 2 :(得分:1)

您还可以在标准数组引用的索引部分进行数学运算:

$ myarray=( {0..100} )
$ echo "${myarray[ ${#myarray[@]} - 2 ]}"
99

或者,更清楚一点:

$ myarray=( {0..100} )
$ myarray_len="${#myarray[@]}"
$ echo "${myarray[ myarray_len - 2 ]}"
99
顺便说一下,请养成对所有变量引用进行双引号的习惯(例如echo "${myarray[@]}"而不是echo ${myarray[@]})。在某些情况下,可以安全地省略引号,但也可以省略它们,并且弄清楚什么时候离开它们是安全的更多的工作而不是它的价值。只要引用它们,除非有特殊原因不这样做。