shell的map存key是有限制的。
1.不能含有特殊的字符。
2.存字母的时候会按照0处理,所有后一个会把前一个覆盖。
3.只能是数字,shell的数字类型应该是long类型【不信的可以自己验证一下,没有验证是否跟操作系统相关】,所以最大值:9223372036854775807,当你存9223372036854775808的时候就会报错。
如:
#!/bin/sh
declare -a map
map["9223372036854775808"]=9223372036854775808
for key in ${!map[*]}
do
echo $key "-" ${map[$key]}
done
输出:
./map.sh: line 4: map["9223372036854775808"]: bad array subscript
但是你存一个远远超过其长度的数却可以:
#!/bin/sh
declare -a map
map["206430424820643042482127182718271827127182718271872182781728172"]=9223372036854775808
for key in ${!map[*]}
do
echo $key "-" ${map[$key]}
done
输出:
6051852071688983980 - 9223372036854775808
map["9223372036854775808111111"]=9223372036854775807
输出:
111111 - 9223372036854775807
map["9223372036854775807111111"]=9223372036854775807
输出:
./map.sh: line 9: map["9223372036854775807111111"]: bad array subscript
总结:
我没有确切找到key生成的规律,我只知道9223372036854775808和9223372036854775807是一个敏感的数字,9223372036854775807以内的不散列key,9223372036854775808111111的会去掉9223372036854775808直接用111111,至于怎么散列的不得而知。
注意:
大于19位数字可能会报错,如下,但报不报错不是确定的,跟前19位的数有关系。为啥报错,只能看源码了。
map["11111111111111111111"]=7 //20个1
map["12345678901234567890"]=7 //20个
输出:
bad array subscript
以上,如有知道怎么回事的朋友请告诉我哦~~
网友评论