脚本应用之七: 子网计算

作用: 计算子网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

脚本应用之七: 子网计算的相关文章

子网计算实例

划分子网方法: 1.你所选择的子网掩码将会产生多少个子网?:2 的x 次方(x 代表掩码位数) 2.每个子网能有多少主机?: 2 的y 次方-2(y 代表主机位数) 3.有效子网是?:有效子网号=256-10 进制的子网掩码(结果叫做block size 或base number) 4.每个子网的广播地址是?:广播地址=下个子网号-1 5.每个子网的有效主机分别是?:忽略子网内全为0 和全为1 的地址剩下的就是有效主机地址. 最后有效1 个主机地址=下个子网号-2(即广播地址-1) C类地址例子

《网络管理》子网掩码计算和子网计算

子网掩码计算--IPSubnetter 网络管理员不单要为网络分配IP地址,而且还应该清楚所使用的网络地址段IP地址分配是否合理.IP地址的使用情况等.IPSubnetter是一款免费软件,可以计算出同一网段的IP地址和子网掩码,可运行于所有Windows 9.x以上的操作系统.该软件根据子网内某一个IP地址和子网掩码,不仅可以计算出该子网内可用IP地址,还可以计算出IP地址的二进制数值,并判断该IP地址所属的地址类别,以及其子网位.主机位.符合条件的子网数目.每个子网所包含的有效主机数目.掩码

shell脚本中的浮点数计算

bash数字计算--数字处理能力对任何一种编程语言都至关重要,可是对于bash shell脚本来说,这种能力很差,即使expr命令和$[ ]的形式也只能进行整数运算,无法完成对浮点数的运算.为了突破这种限制,引进了一种bash的浮点解决方案,就是内置bash计算器(bc) 一.bc介绍 bc实际上是一种编程语言,该语言允许在命令行输入浮点表达式,然后执行. bc可以识别(浮点)数字,变量,表达式,编程语句,函数. 可以使用bc命令从shell提示符访问bc,quit退出bc: [[email p

《懒人Shell脚本》之七——格式化处理数据存入数据库实现

0.引言 实际应用开发中遇到:将非格式化的文件数据存储到数据库中.对于传统的格式化的数据:ini/json/xml我们都有现成的类库去实现.而对于如下非格式化的数据呢?以下是我的思考与实现. 数据截取片段如下所示: [[email protected] 2017]# head -n 10 input.txt [url]http://epaper.tianjinwe.com/mrxb/mrxb/2013-02/21/content_7566593.htm 新报讯[记者王晶通讯员赵子强]对31.66

STL系列之七 快速计算x的n次幂 power 的实现

计算x的n次幂最简单直接的方法就是相乘n次,很容易写出程序: //计算x^n 直接乘n次 by MoreWindows( http://blog.csdn.net/MoreWindows ) int power1(int x, unsigned int n) { int result = 1; while (n--) result *= x; return result; } 这种计算的效率显然不高,我们可以用二分法来加速计算x^n=x^(n/2)* x^(n/2)即x^10=x^5*x^5,这

shell脚本学习总结--数学计算

在bash中可利用let,(())和[]执行基本的操作,高级操作将会使用expr和bc let# let result=x+y自加操作# let x++自减操作# let x--简写形式 # let x+=6     --> let x=x+6#let x-=6      --> let x=x-6 []# y=$[ 2 + 1]# y=$[ $x + 1] (())#y=$((1+1))#y=$(($x+1)) expr[[email protected] ~]$ expr 3 + 47y=

对于脚本语言的执行时间计算

class runtime { var $StartTime = 0; var $StopTime = 0; function get_microtime() { list($usec, $sec) = explode(' ', microtime()); return ((float)$usec + (float)$sec); } function start() { $this->StartTime = $this->get_microtime(); } function stop() {

第八课-第二讲 08_02_bash脚本编程之七 case语句及脚本选项进阶

一. 面向过程控制结构顺序结构选择结构循环结构选择结构if语句 单分支,双分支,多分支case 语句 case语句:选择结构 case SWITCH invalue1)---此处的value是当做字符来比较的statement.....;;value2)statement.....;;value3)statement.....;;*)statement.....;;esac 原文地址:http://blog.51cto.com/13788421/2147914

四则运算脚本解析计算

四则运算脚本解析计算 1.个位数的加减法运算 记住前一位的加号或减号运算符,使用加号或减号用运算符后面的数字改变累加值. package yuki.arithmetic.script; public class SingleDigitTest { public static void main(String[] args) { String s1 = "1+2+3+4+5+6+7+8+9"; System.out.println(s1 + "=" + calcula