网络地址计算(Linux版)

#!/bin/bash
#History: 
#     2012-02-20      DanielW|Kernel  First release 
# 
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH

#二进制转十进制
function multiply_2(){
        declare -i n
        n=$1

        multiply_result=1
        while [ $n -gt 0 ]
        do 
                multiply_result=$(( $multiply_result*2 ))
                n=$n-1
        done
                export multiply_result
}

##十进制转二进制,得出ip和mask的某一段的二进制
function cal(){
declare -i a
declare -i b
declare -i len
a=$1
b=$2
m=""
n=""

m=$(( a%2 ))
while [ $(( a/2 )) -gt 0 ] 
do
        a=$(( a/2 ))
        m=$((a%2))$m
done   
len=8-$( expr length $m )
while [ $len -gt 0 ] 
do
        m=0$m   
        len=$(( len-1 ))
done
n=$(( b%2 ))
while [ $(( b/2 )) -gt 0 ] 
do
        b=$(( b/2 ))
        n=$((b%2))$n
done   
len=8-$(expr length $n)
while [ $len -gt 0 ] 
do
        n=0$n   
        len=$(( len-1 ))
done
export m
export n        
}

#做与运算,并输出十进制
function ip_and_mask(){
declare -i int
ten=""
ip="0"
int=8
a=""
b=""
result=""
while [ $int -gt 0 ] 
do
        a=$( expr substr $1 $int 1 )
        b=$( expr substr $2 $int 1 )
        if [ "$a" == "1" -a "$b" == "1" ];then
                result=1${result}
        else result=0${result}
        fi      
        int=$int-1
done

if [ "$( expr substr $result 8 1 )" == "1" ];then
        ip=1
else ip=0
fi
int=7
while [ $int -ge 0 ]
do
        if [ "$( expr substr $result $int 1 )" == "1" ];then
                tmp_n=$(( 8-int )) 
                ip=$(( ip+$( multiply_2 $tmp_n ) )) 
        fi 
        int=$int-1
done
export ip
}

read -p "Enter the IP Address:" ip_input
read -p "Enter the NETMASK Address:" mask
declare -i M1=$( echo $mask | awk 'BEGIN{FS="."}{print $1}' )
declare -i M2=$( echo $mask | awk 'BEGIN{FS="."}{print $2}' )
declare -i M3=$( echo $mask | awk 'BEGIN{FS="."}{print $3}' )
declare -i M4=$( echo $mask | awk 'BEGIN{FS="."}{print $4}' )
declare -i P1=$( echo $ip_input | awk 'BEGIN{FS="."}{print $1}' )
declare -i P2=$( echo $ip_input | awk 'BEGIN{FS="."}{print $2}' )
declare -i P3=$( echo $ip_input | awk 'BEGIN{FS="."}{print $3}' )
declare -i P4=$( echo $ip_input | awk 'BEGIN{FS="."}{print $4}' )
if [ $M1 -ne 255 ];then
        cal $M1 $P1
        ip_and_mask $m $n
        echo -e "Net Address:"$ip.0.0.0
elif [ $M2 -ne 255 ];then
        cal $M2 $P2
        ip_and_mask $m $n
        echo "Net Address:"$P1.$ip.0.0
elif [ $M3 -ne 255 ];then
        cal $M3 $P3
        ip_and_mask $m $n
        echo "Net Address:"$P1.$P2.$ip.0
else [ $M4 -ne 255 ]
        cal $M4 $P4
        ip_and_mask $m $n
        echo "Net Address:"$P1.$P2.$P3.$ip
fi
echo "END"

这个版本还没有对输入的数据进行判断,而且没有使用位运算(原来不会啊),导致了代码过长过复杂,等待下个版本更新。

这里还有一个可以自动获取主机网络地址判断的脚本

http://blog.csdn.net/gzas1989/article/details/7287746


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值