问题:现在又一id分配器,这个id分配器的上限是uint64,也就是 18446744073709551615。如果这个id分配器分配了一个id,你需要判断这个id是否是0到18446744073709551615 之间,这个时候,你会发现,使用shell本身的(())来计算就会出问题,if判断的时候也会有问题的,其实这个就超出了shell本身所能计算的范围,需要借助于专门的工具进行。
解决:其实使用bc进行计算就可以了。解决计算的问题之后,又出现了一个新的问题,如何进行判断,比如我要判断a是否在uint64范围之内,假如a的取值是1,那么a与18446744073709551615做差之后的数据还不在if的判断范围之内,所以继续使用bc进行判断就可以了。
实例:从./data目录下去读取所有的文件,然后从文件中读取分配的id,得到id之后,拿去判断是否在范围之内,如果在,那么将这个文件的名字写到RESULT这个变量中,最后打印出来。
解决:其实使用bc进行计算就可以了。解决计算的问题之后,又出现了一个新的问题,如何进行判断,比如我要判断a是否在uint64范围之内,假如a的取值是1,那么a与18446744073709551615做差之后的数据还不在if的判断范围之内,所以继续使用bc进行判断就可以了。
实例:从./data目录下去读取所有的文件,然后从文件中读取分配的id,得到id之后,拿去判断是否在范围之内,如果在,那么将这个文件的名字写到RESULT这个变量中,最后打印出来。
点击(此处)折叠或打开
- #!/bin/bash
- #这些数据计算有问题
- INT32_MAX=2147483647
- UINT32_MAX=4294967295
- INT64_MAX=9223372036854775807
- UINT64_MAX=18446744073709551615
- MID=100000000
- ID_DIR="./data"
- RESULT=""
- find_min_num()
- {
- min=$UINT64_MAX
- argc=$#
- for (( i=1;i<=$argc;i++ ))
- do
- x=`echo $1 | cut -c1`
- if [ "$x" != "-" ]; then
- xx=`echo "($1)-($min)" | bc | cut -c1`
- fi
- if [ "$xx" = "-" ]; then
- min=$1
- fi
- shift
- done
- echo $min
- }
- cd $ID_DIR 1>/dev/null 2>&1
- FILE=`ls idalloc.* 2>/dev/null`
- for file in $FILE
- do
- line=`wc -l $file | cut -d" " -f1`
- for(( i=2;i<=$line;i++ ))
- do
- num=`sed -n ${i}p $file | cut -d" " -f4`
- int32_ret=`echo $INT32_MAX-$num | bc`
- uint32_ret=`echo $UINT32_MAX-$num | bc`
- int64_ret=`echo $INT64_MAX-$num | bc`
- uint64_ret=`echo $UINT64_MAX-$num | bc`
- min=`find_min_num $int32_ret $uint32_ret $int64_ret $uint64_ret`
- xxx=`echo "($min)-($MID)" | bc | cut -c1`
- if [ "$xxx" = "-" ]; then
- RESULT="$RESULT|$file"
- break
- fi
- done
- done
- cd - 1>/dev/null 2>&1
- if [ "$RESULT" = "" ];then
- RESULT="SUCC"
- fi
- echo "out_file:$RESULT"
- exit 0
相关热门文章
给主人留下些什么吧!~~
评论热议