15

GNU bash 手册告诉我

如果使用语法分配了任何变量,则会自动创建索引数组

name[subscript]=value

下标被视为必须计算为数字的算术表达式。如果下标计算为小于零的数字,则将其用作大于数组最大索引的 1 的偏移量(因此 -1 的下标指的是数组的最后一个元素)。

所以我想我会尝试一下并得到以下结果:

$ muh=(1 4 'a' 'bleh' 2)
$ echo $muh
1
$ echo ${muh[*]}
1 4 a bleh 2    # so far so good so now I'll try a negative ...
$ echo ${muh[-1]}
-bash: muh: bad array subscript  # didn't go as planned!

是我做错了什么,还是网站错了,还是 gnu bash 与我在 CentOS 下运行的 bash 不同?谢谢!

4

5 回答 5

18

如果你只想要最后一个元素

$ echo ${muh[*]: -1}
2

如果你想在最后一个元素旁边

$ echo ${muh[*]: -2:1}
bleh
于 2013-04-19T16:54:40.220 回答
10

根据Greg Wooledge 的 wiki(链接到 bash 更改日志),负索引语法在 4.2 alpha 版本中被添加到 bash。

于 2013-04-19T17:13:09.417 回答
3

如果您执行man bash有关数组的部分,则不会列出此行为。它可能是 bash 中的新东西(gnu?)。

在 CentOS 6.3(bash 4.1.2)中对我来说失败了

于 2013-04-19T16:59:18.260 回答
2

Bash 4.2 之前的版本(就像现在 Mac 上的默认版本一样)不支持负下标。除了接受的答案中使用的“子字符串扩展”之外,一个可能更干净的解决方法是从括号内的数组开始计算所需的索引:

$ array=(one two three)
$ echo "${array[${#array[@]}-1]}"
three

使用这种方法,您可以将其他参数扩展操作打包到术语中,例如“删除匹配前缀模式” th

$ echo "${array[${#array[@]}-1]#th}"
ree
于 2020-04-21T13:49:14.770 回答
1

负下标在我的 Ubuntu 14.04 / GNU bash 版本 4.3.11(1) 的计算机上非常适合我,但是它返回:

line 46: [-1]: bad array subscript

当我尝试在 4.2.46(1) 上运行相同的脚本时。我

于 2016-10-19T12:34:36.680 回答