+ -
当前位置:首页 → 问答吧 → 请问这样的Shell脚本如何写?

请问这样的Shell脚本如何写?

时间:2011-08-19

来源:互联网

代码:
#!/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   发布时间: 2011-08-19

有更好的方法也可以指教下啊

作者: 215317196   发布时间: 2011-08-19

代码:
for ((i=$MyMask_Lng;i<=32;i++));do
        MyNet+="0"
        MyBro+="1"
done;


明白了,因为使用了 <= 号 ,导制二进制出现了 33 位数字,

作者: 215317196   发布时间: 2011-08-19

热门下载

更多