【问题标题】:Negative subscripts in Bash arraysBash 数组中的负下标
【发布时间】:2016-10-19 21:14:52
【问题描述】:

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

来自 Bash 手册:

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

name[subscript]=value

name[subscript]=value 下标被视为算术运算 必须计算为数字的表达式。如果下标计算为 小于零的数字,它被用作从大于一的偏移量 数组的最大索引(所以 -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

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

【问题讨论】:

    标签: arrays linux bash shell subscript


    【解决方案1】:

    猜猜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

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

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

    也许您可以参考数组的长度并对其进行一些数学运算:
    (阅读)${arr[${#arr[@]}-1]}
    (分配)arr[${#arr[@]}-1]=last
    (清算)unset arr[${#arr[@]}-1]

    【讨论】:

    • 感谢您对此事的澄清。我确实试图取消设置数组的最后一个元素。还有其他方法吗?任何解决方案,变通方法?
    • 我正在考虑创建类似:array[arrayLength - 1]
    • @Ludi 好的,我建议了分配和取消设置最后一个元素的替代方法。
    • 再次感谢您。不幸的是我仍然有这个错误。我想它与动态数组名称有关。 function stateMachine.pop() { : ${1? 'Missing attribute name'} local attribute="${1}"; local arrayName=STATE_MACHINE_${attribute}; # if [[ ! $( stateMachine.exist "${arrayName}" ) == 0 ]]; then unset "${arrayName}[-1]"; fi }
    • @Ludi 在您的 sn-p 中仍然有 [-1] 下标。相反,我认为它应该是这样的:function stateMachine.pop() { : ${1? 'Missing attribute name'} local attribute="${1}"; local arrayName=STATE_MACHINE_${attribute}; # if [[ ! $( stateMachine.exist "${arrayName}" ) == 0 ]]; then local arrayLength=${#"${arrayName}"[@]};unset "${arrayName}[$arrayLength-1]"; fi }
    猜你喜欢
    • 2013-04-13
    • 2014-02-19
    • 2020-12-29
    • 2013-07-30
    • 2014-04-03
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多