为什么在Bash中使用未设置的变量作为数组索引返回元素0?

时间:2019-11-28 15:16:53

标签: arrays bash

为什么bash数组中的空键始终是零键元素?

尝试

empty_key=

h[0]=0
h[1]=1
h[2]=2

echo ${h[$empty_key]}

结果

0

您能否解释一下,为什么这种行为是正确的?

在我看来,它应该与

没有什么不同
not_existing_key=5 
echo ${h[$not_existing_key]}

结果为空。

了解这一点很重要,如果有人将结果用于循环,例如

for element in ${h[$key]};do
  ...
done

empty_key导致循环,而不是not_existing_key。

要避免这种情况,显然不要启动索引为0的数组

OR

用任何未分配的键值替换空键(看起来很无聊)。

再次提出我的问题:这种行为为什么正确?

编辑:我的问题应该理解为,为什么这种行为在bash世界中是首选的,而不是没有键值的空结果?

1 个答案:

答案 0 :(得分:7)

访问数组元素时,[]构成算术上下文。这会带来一些后果:

  • 不需要$来取消引用变量:

    $ arr=(a b c)
    $ idx=1
    $ echo ${arr[idx]}
    b
    
  • 算术运算被评估:

    $ echo ${arr[idx+idx]}
    c
    
  • 变量名在“链”中被取消引用(以算术表达式求值在手册中):

    $ idx=2
    $ idxref=idx
    $ echo ${arr[idxref]}
    c
    
  • 在没有参数扩展语法的情况下,
  • 空或未设置变量的名称将被评估为0

    $ notset=
    $ echo ${arr[notset]}
    a
    
  • 最后(您的问题),空值的值为0

    $ notset=
    $ echo {$arr[$notset]}
    a
    

手动报价:

  • Arrays

      

    使用整数(包括算术表达式(请参阅Shell Arithmetic)引用索引数组[...]

  • Shell Arithmetic

      

    允许将Shell变量用作操作数;在对表达式求值之前执行参数扩展。在表达式中,也可以使用名称来引用shell变量,而无需使用参数扩展语法。如果使用名称引用而不使用参数扩展语法,则null或未设置的shell变量的值为0。 [...] 空值的值为0。