#!/bin/bash function IP2long(){ local IFS='.' read IP1 IP2 IP3 IP4 <<<"$1" echo $((IP1*(1<<24)+IP2*(1<<16)+IP3*(1<<8)+IP4)) } function long2IP(){ local IP=$1 local NET= NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}" (( IP >>= 8 )) NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}" (( IP >>= 8 )) NET=".$(( IP - (IP >> 8 << 8 ) ))${NET}" (( IP >>= 8 )) NET="${IP}${NET}" echo $NET } ip=${1%/*} mask=${1#*/} ip=$(IP2long $ip) mask=$((((1<<32)-1)<<(32-mask))) net=$(long2IP $((ip&mask))) echo $net
用法:
./ip.sh 192.168.5.220/24
根据一个IP/MASK的形式,来计算实际的网络地址
方法是用 mask个1与32-mask个0与IP相与,得到一个新的IP地址,那个地址就是网络地址
想法就是把IP转换成长整数,然后与mask相与后,再转换成点分的表示法