为什么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世界中是首选的,而不是没有键值的空结果?
当访问数组元素时,[]构成算术上下文。这会带来一些后果:
无需$取消引用变量:
$ arr=(a b c)
$ idx=1
$ echo ${arr[idx]}
b
Run Code Online (Sandbox Code Playgroud)计算算术运算:
$ echo ${arr[idx+idx]}
c
Run Code Online (Sandbox Code Playgroud)变量名在“链”中被取消引用(在手册中作为算术表达式求值):
$ idx=2
$ idxref=idx
$ echo ${arr[idxref]}
c
Run Code Online (Sandbox Code Playgroud)0在不使用参数扩展语法的情况下,使用null或未设置的变量的名称的求值结果为:
$ notset=
$ echo ${arr[notset]}
a
Run Code Online (Sandbox Code Playgroud)最后(您的问题),空值的计算结果为0:
$ notset=
$ echo {$arr[$notset]}
a
Run Code Online (Sandbox Code Playgroud)手动报价:
数组:
索引数组使用整数(包括算术表达式(请参见Shell Arithmetic))进行引用[...]
壳算术:
允许使用Shell变量作为操作数;在对表达式求值之前执行参数扩展。在表达式中,也可以使用名称来引用外壳变量,而无需使用参数扩展语法。如果使用名称引用而不使用参数扩展语法,则null或未设置的shell变量的值为0。[...] 空值的值为0。