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

one*_*ion 1 arrays bash

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

尝试

empty_key=

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

echo ${h[$empty_key]}
Run Code Online (Sandbox Code Playgroud)

结果

0
Run Code Online (Sandbox Code Playgroud)

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

以我的理解,它应该与

not_existing_key=5 
echo ${h[$not_existing_key]}
Run Code Online (Sandbox Code Playgroud)

结果是空的。

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

for element in ${h[$key]};do
  ...
done
Run Code Online (Sandbox Code Playgroud)

其中empty_key导致一个循环,但不是not_existing_key。

为了避免这种行为,显然不要以索引0开始数组

要么

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

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

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

Ben*_* W. 6

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


手动报价:

  • 数组

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

  • 壳算术

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