Bash数组中的否定下标

时间:2016-10-19 12:51:53

标签: arrays linux bash shell subscript

创建一个简单的bash堆栈脚本后,我遇到了与bash数组相关的错误。

来自Bash手册:

  

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

     

NullPointerException

     

name [subscript] = value下标被视为算术   必须评估为数字的表达式。如果下标评估为a   数字小于零,它用作一个大于的偏移量   数组的最大索引(所以-1的子标点指的是最后一个   数组元素。)

在本地计算机上一切都运行得很好,遗憾的是我的服务器环境略有不同。

负面的下标适用于Ubuntu 14.04 / GNU bash版本4.3.11(1)。但是,当我尝试使用GNU bash版本4.2.46(1)在我的服务器上运行相同的脚本时,我遇到了以下错误:

name[subscript]=value

我尝试创建一个数组并直接从终端调用最后一个元素(不在脚本中)并且它有效:

line 46: [-1]: bad array subscript 

我有点困惑。这有什么解决方案或解决方法吗?

1 个答案:

答案 0 :(得分:2)

猜猜Bash changelog中的内容:

对于:此版本之间的更改,bash-4.3-beta和 以前的版本,bash-4.3-alpha

  

X。 shell现在允许分配,引用和取消设置元素       索引数组使用负下标(a [-1] = 2,echo $ {a [-1]})       从数组的最后一个元素开始计数。

对于:此版本之间的更改,bash-4.2-alpha, 和之前的版本,bash-4.1-release

  

页。现在可以处理索引数组的否定下标,以前的错误       作为最大指定指数+ 1的偏移量。

所以你的测试只能读取负偏移(好在~4.2及以上),但你的错误源于试图分配或取消设置负偏移(好在~4.3及以上)。

也许您可以参考数组的长度并使用以下方法进行数学计算:
(阅读)${arr[${#arr[@]}-1]}
(分配)arr[${#arr[@]}-1]=last
(清除)unset arr[${#arr[@]}-1]