Bash数组和负数下标,是或否?

时间:2013-04-19 16:47:50

标签: linux arrays bash unix gnu

GNU bash manual告诉我

  

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

name[subscript]=value
     

下标被视为必须的算术表达式   评估一个数字。如果下标的计算结果小于   零,它被用作一个大于数组的偏移量   最大索引(所以-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有什么不同?谢谢!

5 个答案:

答案 0 :(得分:11)

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

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

如果你想要最后一个元素

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

答案 1 :(得分:7)

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

答案 2 :(得分:3)

如果执行man bash数组部分未列出此行为。它可能是bash中的新东西(gnu?)。

在CentOS 6.3(bash 4.1.2)

中失败了

答案 3 :(得分:1)

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

line 46: [-1]: bad array subscript

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

答案 4 :(得分:0)

旧的取景框(如最近Mac上的默认取景框)不支持负下标。除了接受的答案中使用的“子字符串扩展”之外,一种可能的解决方法是从括号内的数组开始计算所需的索引:

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

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

$ echo "${array[${#array[@]}-1]#th}"
ree