我可以像这样访问数组的所有元素:
echo ${myarray[@]}
和元素数量:
echo ${#myarray[@]}
我可以通过以下方式获取第n个元素:
echo ${myarray[@]:(-1)}
但是我尝试以下方法来获取第n-1个数组元素:
echo ${myarray[@]:(-2)}
但我最后得到了最后两个元素。我如何才获得最后一个元素?
答案 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)
答案 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[@]}
)。在某些情况下,可以安全地省略引号,但也可以省略它们,并且弄清楚什么时候离开它们是安全的更多的工作而不是它的价值。只要引用它们,除非有特殊原因不这样做。