美文网首页
shell脚本map键key的限制

shell脚本map键key的限制

作者: 牙齿不帅 | 来源:发表于2020-02-29 18:47 被阅读0次

    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
    

    以上,如有知道怎么回事的朋友请告诉我哦~~

    相关文章

      网友评论

          本文标题:shell脚本map键key的限制

          本文链接:https://www.haomeiwen.com/subject/fykmhhtx.html