脚本应用之七: 子网计算

作用: 计算子网ip范围和可用ip个数

实现: 使用bc工具进行计算,请预先安装,不做检查

不足: 没有对ip地址和掩码的格式做判断

使用: 提供两个参数,地址和掩码,输出格式:主机号 - 网络号 [ 可用ip个数 ]


演示:

脚本应用之七: 子网计算_第1张图片


代码专区:

#/bin/bash

#  LY
#  ------------------
#  Copyright 2016.04.14 LingYi ([email protected]) QQ: 1519952564
#  ------------------------------------------------------------
#  "subnet masks 'calculation"

#将ip地址转换为二进制,32个只包含0和1的字符
get_2s(){
	local i j s stay
	for ((i=1; i<=4; i++)); do 
		stay=$( echo "obase=2; ibase=10; `echo $1 | cut -d'.' -f$i`" | bc )
		#地址的每个段转换为二进制应为八位数,位数不足则在左侧加“0”补齐
		[[ ${#stay} -ne 8 ]] && { for ((j=1; j<=8-l; j++)); do stay="0${stay}"; done; }
		s=${s}$stay
	done
	echo $s
}
#将一个32个只包含0和1的字符转换为十进制,且为ip地址的格式
get_10s(){
	local n T
	#将字符串按每八位一个字段截断,并转换为十进制
	for n in 0 8 16 24; do 
		T=${T}.$( echo "obase=10; ibase=2;${1:n:8}"|bc )
	done
	echo $T | sed 's/^.//'
}

#将地址和掩码转换为二进制字符串
ip_2s=$( get_2s $1 )
mask_2s=$( get_2s $2 )
#将地址和掩码的二进制进行比对,取得主机号的二进制字符串
for((i=0; i<32; i++)); do
	a=${ip_2s:i:1}
	b=${mask_2s:i:1}
	#模拟二进制的与操作
	[[ ${b} -eq 1 ]] && comp_2s=${comp_2s}$a || comp_2s=${comp_2s}0
done

#计算掩码中“0”的个数N,则可用ip个数即为 2的N次方减2(主机号和网络号不可用)
sum_1=$( echo ${mask_2s} | grep -o '1' | wc -l )
useful_ip_sum=$(( $( echo "2^$((32-sum_1))" | bc ) -2 ))
#网络号即将主机号的主机位全置为1
broadcast_2s=${ip_2s:0:sum_1}$(for ((i=0; i<32-sum_1; i++)); do echo -n '1'; done)
#将二进制转换为十进制,并以地址格式输出
echo -e "\033[1;34m$(get_10s $comp_2s) - $(get_10s $broadcast_2s) [ $useful_ip_sum ]\033[0m"




源码下载链接




你可能感兴趣的:(IP,主机,地址)