作用: 计算子网ip范围和可用ip个数
实现: 使用bc工具进行计算,请预先安装,不做检查
不足: 没有对ip地址和掩码的格式做判断
使用: 提供两个参数,地址和掩码,输出格式:主机号 - 网络号 [ 可用ip个数 ]
演示:
代码专区:
#/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"
时间: 2024-10-10 00:51:56