脚本有错误,求助改进和优化----???

sh/bash/dash/ksh/zsh等Shell脚本
回复
215317196
帖子: 49
注册时间: 2008-06-10 10:52
联系:

脚本有错误,求助改进和优化----???

#1

帖子 215317196 » 2011-08-19 17:26

代码: 全选

#!/bin/bash
bc=/usr/bin/bc
awk=/bin/awk
cut=/bin/cut
echo=/bin/echo
grep=/bin/grep
ifconfig=/sbin/ifconfig
//获取IP和netmask
MyIp=`ifconfig eth0|grep "inet addr"| cut -f 2 -d ":"|cut -f 1 -d " "`
MyMask=`ifconfig eth0|grep "inet addr"| cut -f 4 -d ":"`
//转换成二进制
for ((i=1;i<=4;i++));do
        Tmp=`echo $MyIp|cut -f $i -d .`
        MyIp_Bin+=`echo "obase=2;$Tmp"|bc|awk '{printf("%08d\n",$0);}'`
        Tmp1=`echo $MyMask|cut -f $i -d .`
        MyMask_Bin+=`echo "obase=2;$Tmp1"|bc|awk '{printf("%08d\n",$0);}'`
done;
//取得广播地址和网络地址
MyMask_Lng=`echo $MyMask_Bin|cut -f 1 -d 0`
MyMask_Lng=`expr length "$MyMask_Lng"`
Tmp=`expr substr $MyIp_Bin 1 $MyMask_Lng`
MyNet=$Tmp
MyBro=$Tmp
for ((i=$MyMask_Lng;i<=32;i++));do
        MyNet+="0"
        MyBro+="1"
done;
//转换为十进制
MyNet=$((2#$MyNet))
MyBro=$((2#$MyBro))
//打印IP地址
for ((i=$(($MyNet+1));i<$MyBro;i++));do
        Tmp=`echo "obase=2;$i"|bc`
        IP1=`expr substr $Tmp 1 8`
        IP1=$((2#$IP1))
        IP2=`expr substr $Tmp 9 8`
        IP2=$((2#$IP2))
        IP3=`expr substr $Tmp 17 8`
        IP3=$((2#$IP3))
        IP4=`expr substr $Tmp 25 8`
        IP4=$((2#$IP4))
        IP="$IP1"."$IP2"."$IP3"."$IP4"
echo $IP"          "$Tmp
done;
脚本的工作是打印出所有广播域内的IP地址。可是会出现如下问题,十进制重复,二进制的却替增。

代码: 全选

192.168.0.81          110000001010100000000000010100011
192.168.0.82          110000001010100000000000010100100
192.168.0.82          110000001010100000000000010100101
192.168.0.83          110000001010100000000000010100110
192.168.0.83          110000001010100000000000010100111
192.168.0.84          110000001010100000000000010101000
192.168.0.84          110000001010100000000000010101001
192.168.0.85          110000001010100000000000010101010
192.168.0.85          110000001010100000000000010101011
192.168.0.86          110000001010100000000000010101100
192.168.0.86          110000001010100000000000010101101
192.168.0.87          110000001010100000000000010101110
192.168.0.87          110000001010100000000000010101111
192.168.0.88          110000001010100000000000010110000
192.168.0.88          110000001010100000000000010110001
192.168.0.89          110000001010100000000000010110010
192.168.0.89          110000001010100000000000010110011
192.168.0.90          110000001010100000000000010110100
192.168.0.90          110000001010100000000000010110101
215317196
帖子: 49
注册时间: 2008-06-10 10:52
联系:

Re: 脚本有错误,求助改进和优化----???

#2

帖子 215317196 » 2011-08-19 17:26

有更好的方法也可以指教下啊
215317196
帖子: 49
注册时间: 2008-06-10 10:52
联系:

Re: 脚本有错误,求助改进和优化----???

#3

帖子 215317196 » 2011-08-19 18:03

代码: 全选

for ((i=$MyMask_Lng;i<=32;i++));do
        MyNet+="0"
        MyBro+="1"
done;
明白了,因为使用了 <= 号 ,导制二进制出现了 33 位数字, :em20 :em20
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 脚本有错误,求助改进和优化----???

#4

帖子 我就是我2 » 2011-08-19 21:35

MyIp=`ifconfig eth0|grep "inet addr"| cut -f 2 -d ":"|cut -f 1 -d " "`
MyMask=`ifconfig eth0|grep "inet addr"| cut -f 4 -d ":"`
也许可以这样来。

代码: 全选

MyIp=`ifconfig eth0|awk -F'[:B]' '/inet addr/{print $2}'`
MyMask=`ifconfig eth0|awk -F'[:$]' '/inet addr/{print $4}'`
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 脚本有错误,求助改进和优化----???

#5

帖子 fnan » 2011-08-19 22:40

MyIp_Bin=$(echo "obase=2;${MyIp//./;}"|bc|xargs printf "%08d")
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复