免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3376 | 回复: 7
打印 上一主题 下一主题

高手帮助找错: 转换255.255.255.240(掩码)到28(prefix)的shell [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-19 17:18 |只看该作者 |倒序浏览
高手帮助找错:这个转换255.255.255.240(掩码)到28(prefix)的shell那里错了? 谢谢

#!/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'|tr -d '0'|sed '/^$/d')
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

论坛徽章:
0
2 [报告]
发表于 2004-10-19 17:46 |只看该作者

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

因为你在转成二进制之前,
就把10进制数后面的0去掉了,
结果当然不对。
  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'|sed '/^$/d')
  9. echo $p
复制代码

论坛徽章:
0
3 [报告]
发表于 2004-10-19 20:29 |只看该作者

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

怎样修改呢? 谢谢

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-10-20 00:39 |只看该作者

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


  1. #!/bin/ksh
  2. ip=255.255.255.230
  3. echo -n "$ip/"
  4. IFS='.'
  5. for i in $ip;do
  6.         echo "obase=2;$i"|bc
  7.         done|\
  8. awk '{sub(/0.*/,"");print}'|\
  9. awk '{gsub(/./,"& ")}{for(i=1;i<=NF;i++)if($i~/1/){n++}}END{print n}'
复制代码

论坛徽章:
0
5 [报告]
发表于 2004-10-20 08:50 |只看该作者

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

[quote]原帖由 "jayson99999"]怎样修改呢? 谢谢[/quote 发表:

已经帮你改过了,没看出来?

论坛徽章:
0
6 [报告]
发表于 2004-10-20 17:19 |只看该作者

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

测试通过! 学到不少东西。
谢谢 寂寞烈火 飞灰橙 2位老大!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-10-20 22:15 |只看该作者

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

我也來一段好了:
  1. #!/bin/bash
  2. m=255.255.255.240
  3. for i in ${m//./ }
  4. do
  5.         if [ $i = 255 ]; then
  6.                 ((bit+=8))
  7.                 continue
  8.         else
  9.                 ((bit+=$(echo "obase=2;$i" | bc | tr -d '0\n' | wc -c)))
  10.                 break
  11.         fi
  12. done
  13. echo $bit
复制代码

不過, 碰到不規范的 mask, 如有"洞"的那種, 好像 255.255.123.0 這些,
可就不準了...

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-10-20 22:17 |只看该作者

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

呵呵,看来都没有避开bc这个厉害角色呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP