LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 840|回复: 5

高手帮助找错: 转换255.255.255.240(掩码)到28(prefix)的shell

[复制链接]
发表于 2004-10-19 17:16:50 | 显示全部楼层 |阅读模式
高手帮助找错:这个转换255.255.255.240(掩码)到28(prefix)的shell那里错了? 谢谢

  1. #!/bin/bash
  2. q=255.255.255.240
  3. p=0
  4. while read i
  5.         do a=$(echo "obase=2;$i" | bc -l)
  6.           b=$(($(echo ${a%%0*}|wc -c)-1))
  7.           p=$(($p+$b))
  8. done< <(echo $q|tr '.' '\n'|tr -d '0'|sed '/^$/d')
  9. echo $p
复制代码

结果却是26

其他的计算基本上是对的,这个shell错在哪里?  

q=255.255.255.0   p=24
q=255.255.255.128   p=25
q=255.255.255.192   p=26
q=255.255.255.224   p=27
q=255.255.255.240   p=26 ???
q=255.255.255.248   p=28
发表于 2004-10-20 08:08:55 | 显示全部楼层
顶一下
发表于 2004-10-20 13:03:47 | 显示全部楼层

  1. #!/bin/sh
  2. count_mask()
  3. {
  4.     MASK=$1
  5.     count=0
  6.     for num in `echo -e $MASK|tr '.' '\n'`; do
  7.         while [ ! $num -eq 0 ] ; do
  8.             rem=$[$num%2]
  9.             [ $rem -eq 1 ] && let count+=1
  10.             num=$[$num/2]
  11.         done
  12.     done
  13.     echo "Mask $MASK ---> /$count"
  14. }

  15. for i in 0 128 192 224 240 248 252 254 ; do
  16.     count_mask 255.$i.0.0
  17. done

  18. for i in 0 128 192 224 240 248 252 254; do
  19.     count_mask 255.255.$i.0
  20. done

  21. for i in 0 128 192 224 240 248 252 254 255 ; do
  22.     count_mask 255.255.255.$i
  23. done
复制代码
 楼主| 发表于 2004-10-20 17:34:20 | 显示全部楼层

thanks coolend

THAT'S OK!!!


#!/bin/bash
q=255.255.255.240
p=0
while read i
do a=$(echo "obase=2;$i" | bc -l)
b=$(($(echo ${a%%0*}|wc -c)-1))
p=$(($p+$b))
done< <(echo $q|tr '.' '\n'|sed '/^$/d')
echo $p
发表于 2004-10-21 09:16:59 | 显示全部楼层
嗯, 不错, 我的script还真是有点问题.
发表于 2004-10-21 21:29:12 | 显示全部楼层
不错,今天又学会点,多谢。

搂主要是再加点容错处理,贴到顶上就更好了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表