shell中自定义ip2long函数

关于ip地址的转换,看到CU上一个帖子,自己定义了ip2long和long2ip两个函数,如下:

#!/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相与后,再转换成点分的表示法

猜你喜欢

转载自logo32.iteye.com/blog/1329215