Arrays Bash数组中的负下标
在创建一个简单的bash堆栈脚本之后,我遇到了一个与bash数组相关的错误 从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)上起作用
名称[下标]=值
名称[下标]=值下标被视为算术
必须计算为数字的表达式。如果下标的计算结果为
小于零的数字,用作大于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}