【问题标题】:Bash arrays and negative subscripts, yes or no?Bash 数组和负下标,是还是不是?
【发布时间】:2013-04-13 03:27:13
【问题描述】:

GNU bash manual 告诉我

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

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 不同?谢谢!

【问题讨论】:

  • 它是特定于版本的。在 bash 4.2 下工作,但对我来说在 3.2 下失败
  • @ravoori:啊!我有3.2!谢谢。

标签: linux arrays bash unix gnu


【解决方案1】:

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

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

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

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

【讨论】:

  • @bob.sacamento 这是因为${parameter:-word} 是一个不同的扩展,这意味着如果parameter 未设置或为空,则替换word
  • 请注意,${muh[*]: -2} 为您提供最后 2 个元素,而不是倒数第二个元素。 (我还没有查看手册以查看该语法的 [deleted] 来自哪里。
  • ${muh[*]: -2} 是子字符串扩展的一个示例,它在数组上的作用类似于切片。
  • @kojiro 请允许我向互联网上的一个随机人表示衷心的随机感谢!我永远不会想到我需要一个空间来向后索引。
【解决方案2】:

如果您这样做man bash,有关数组的部分不会列出此行为。它可能是 bash 中的新事物(gnu?)。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      line 46: [-1]: bad array subscript
      

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-05
          • 1970-01-01
          • 1970-01-01
          • 2014-03-28
          • 2012-05-12
          • 1970-01-01
          相关资源
          最近更新 更多