Answers:
您可以只使用一个负索引 ${myarray[-1]}
来获取最后一个元素。您可以为倒数第二个做同样的事情,依此类推。在Bash中:
如果用于引用索引数组元素的下标的值小于零,则将其解释为相对于大于数组最大索引的下标,因此负索引从数组末尾算起,并且索引-1表示最后一个元素。
分配也一样。当说“表达”时,它实际上意味着表达。您可以在其中编写任何算术表达式来计算索引,包括一个使用数组长度${#myarray[@]}
显式计算的索引。
ksh
和zsh
也。
zsh
虽然,默认数组是1索引,不同于bash
和ksh
他们在哪里0索引。
您可以阅读index的最后一个元素-1
:
$ a=(a b c d e f)
$ echo ${a[-1]}
f
从bash版本4.1-alpha开始,支持使用负索引从最后访问数字索引数组。
您必须从中获取数组长度${#a[@]}
,然后减去一个以获取最后一个元素:
$ echo ${a[${#a[@]}-1]}
f
由于bash将数组下标视为算术表达式,因此不需要其他符号(例如$((...))
)来强制进行算术评估。
modern
使用某个版本,答案会更好。
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]
使用负偏移量时,您需要将与分开:
,-
以免与:-
扩展混淆。
"${a[@]: -1}"
,它将在中也起作用(除了bash
和zsh
)ksh
。
zsh
or 的文档,bash
但我在所有三个shell中都对其进行了测试。)
bash(自bash 3.0+起)中最古老的替代方法是:
$ a=(aa bb cc dd ee)
$ echo "${a[@]:(-1)} ${a[@]: -1} ${a[@]:(~0)} ${a[@]:~0}"
ee ee ee ee
需要使用空格,以避免对(Use Default Values)(使用默认值)的扩展名:
加上减号。-
"${var:-abc}"
该~
是一个算术位求反(相当于一补或翻转所有位)。来自man bash:
算术评估
! ~ logical and bitwise negation
由于bash-4.2 +也:
$ echo "${a[-1]} ${a[(~0)]}"
ee ee
由于bash 5.0+也:
$ echo "${a[~0]}"
ee
对于所有bash版本(旧bash):
$ echo "${a[ ${#a[@]}-1 ]}" # spaces added **only** for readability
ee
对于位置参数(自bash 2.01起):
$ set aa bb cc dd ee
$ echo "${@:(-1)} ${@:~0} ${@: -1} ${@:$#} ${!#}"
ee ee ee ee
所有外壳的便携式解决方案是使用eval:
eval printf '"%s\n"' \"\${$#}\"
$@
?bash: ${@[@]:(-1)}: bad substitution
man bash
参考(请检查@标题处的扩展答案)。@TomHale
@
是不阵列(当然,不是完全的阵列在bash),它不接受指数([]
个别参数)下标。您需要使用${@:(-1)}
或同等学历。检查@
标题的扩展条目。@TomHale
您也可以这样做:
$ a=(a b c d e f)
$ echo ${a[$(expr ${#a[@]} - 1)]}
结果:
$ f
您正在执行的操作是获取数组中所有元素的数量,并减去-1,因为要获取所有元素,而不是从数组索引0开始。
$@
不是一个数组(不能下标)。为此,请参阅获取传递给shell脚本的最后一个参数。