Arrays Bash数组中的负下标

Arrays Bash数组中的负下标,arrays,linux,bash,shell,subscript,Arrays,Linux,Bash,Shell,Subscript,在创建一个简单的bash堆栈脚本之后,我遇到了一个与bash数组相关的错误 从Bash手册: 如果分配了任何变量,则会自动创建索引数组 要使用语法,请执行以下操作: 名称[下标]=值 名称[下标]=值下标被视为算术 必须计算为数字的表达式。如果下标的计算结果为 小于零的数字,用作大于1的偏移量 数组的最大索引(因此-1的子脚本表示最后一个 数组的元素) 在我的本地机器上,一切都很好。不幸的是,我的服务器环境略有不同 负下标在Ubuntu 14.04/GNU bash版本4.3.11(1)上起作用

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

从Bash手册:

如果分配了任何变量,则会自动创建索引数组 要使用语法,请执行以下操作:

名称[下标]=值

名称[下标]=值下标被视为算术 必须计算为数字的表达式。如果下标的计算结果为 小于零的数字,用作大于1的偏移量 数组的最大索引(因此-1的子脚本表示最后一个 数组的元素)

在我的本地机器上,一切都很好。不幸的是,我的服务器环境略有不同

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

line 46: [-1]: bad array subscript 
我尝试创建一个数组,并直接从终端调用最后一个元素(不在脚本中),结果成功了:

user@local:~$ arr=( 1 2 3 4 5 )
user@local:~$ echo ${arr[-1]}
5
我有点困惑。有什么解决方案或解决办法吗?

猜猜下面的内容:

For:此版本bash-4.3-beta和 早期版本,bash-4.3-alpha

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

For:此版本之间的更改,bash-4.2-alpha, 以及之前的版本bash-4.1-release

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

因此,您的测试只读取负偏移量(在~4.2和更高版本中可以),但您的错误源于尝试分配或取消设置负偏移量(在~4.3和更高版本中可以)

也许您可以参考数组的长度,并使用:
(阅读)
${arr[${arr[@]}-1]}

(分配)
arr[${#arr[@]}-1]=last


(清算)
unset arr[${#arr[@]}-1]

感谢您对此事的澄清。我确实试图取消数组的最后一个元素。还有别的办法吗?有什么解决办法吗?我在考虑创建类似这样的东西:
array[arrayLength-1]
@Ludi好的,我建议了分配和取消设置最后一个元素的替代方法。再次感谢你。不幸的是,我仍然有这个错误。我认为它与动态数组名有某种关联<代码>函数stateMachine.pop(){:${1?'缺少属性名'}本地属性=“${1}”;本地arrayName=STATE\u MACHINE\u${attribute};#如果[[!$(stateMachine.exist“${arrayName}”)==0];则取消设置“${arrayName}[-1]“fi}@Ludi在您的代码片段中仍然有[-1]下标。相反,我认为它应该是这样读的:
函数stateMachine.pop(){:${1?'缺少属性名'}本地属性=“${1}”;本地arrayName=STATE_MACHINE${attribute};#如果[!$(stateMachine.exist”${arrayName}==0]];然后本地arrayLength=${#“${arrayName}”[@]};取消设置“${arrayName}[$arrayLength-1]”;fi}