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

bob*_*nto 12 unix linux arrays bash gnu

GNU bash的手册告诉我

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

name[subscript]=value
Run Code Online (Sandbox Code Playgroud)

下标被视为必须求值为数字的算术表达式.如果下标求值为小于零的数字,则将其用作大于数组最大索引的偏移量的偏移量(因此-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!
Run Code Online (Sandbox Code Playgroud)

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

小智 13

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

$ echo ${muh[*]: -1}
2
Run Code Online (Sandbox Code Playgroud)

如果你想要最后一个元素

$ echo ${muh[*]: -2:1}
bleh
Run Code Online (Sandbox Code Playgroud)

  • @bob.sacamento 那是因为`${parameter:-word}` 是一个不同的扩展,这意味着如果`parameter` 未设置或为空,则*替换`word`。* (2认同)
  • 请注意,`$ {muh [*]: - 2}`为您提供最后2个元素,而不是倒数第二个元素.(我还没有查看手册,看看[删除]语法的来源. (2认同)
  • `${muh[*]: -2}` 是子字符串扩展的一个示例,它在数组上的作用类似于切片。 (2认同)

koj*_*iro 9

根据Greg Wooledge的wiki(链接到bash changelog),负面索引语法被添加到版本4.2 alpha中的bash中.


tlw*_*tec 7

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

$ array=(one two three)
$ echo "${array[${#array[@]}-1]}"
three
Run Code Online (Sandbox Code Playgroud)

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

$ echo "${array[${#array[@]}-1]#th}"
ree
Run Code Online (Sandbox Code Playgroud)