ipv4格式解析 shell

#!/bin/bash


pwd_dir=$(pwd)
aa=$0
if [[ $aa == .* ]];then
bb=${pwd_dir}${aa#.*}
elif [[ $aa == /* ]];then
bb=$aa
fi
path=${bb%/*}


netmask=''
PREFIX='11111111'
SUFFIX='00000000'
binary_netmask=''
decimal_netmask=''
num_netmask=''

#len=`echo ${#netmask}`
# 用长度匹配

binary_num_compute(){
  num_netmask=`echo ${binary_netmask}|awk '{print gsub(/1/,"x")}'`
}

binary_decimal_compute(){
	
  for num in `echo $binary_netmask|tr '.' ' '`;do
    mask=$[2#${num}]
    if [ -z "$decimal_netmask" ];then
      decimal_netmask="${mask}"
    else
      decimal_netmask="${decimal_netmask}.${mask}"
    fi
  done
}

decimal_binary_compute(){
  for mask in `echo $netmask|tr '.' ' '`;do
    num=$mask
    result=''
    while [ $num -gt 0 ]; do
      remainder=$[num%2]
      result="${remainder}${result}"
      num=$[$num/2]
    done
    if [ -z "${binary_netmask}" ]; then
      binary_netmask="${result}"
    elif [ -z "${result}" ]; then
      binary_netmask="${binary_netmask}.${SUFFIX}"
    else
      binary_netmask="${binary_netmask}.${result}"
    fi
  done
}

num_binary_compute(){
  for idx in {1..32};do
    if [ $idx -le $netmask ];then
      binary_netmask+='1'
    else
      binary_netmask+='0'
    fi
    flag=$[idx%8]
    [ $flag -eq 0 -a $idx -ne 32 ] && binary_netmask+='.'
  done
}

compute(){
  if [[ -z "${netmask}" || "${netmask}" == "0" ]];then
    echo "netmask format error!"
    exit 1
  fi
  # 网络位
  if [ ${len} -le 2 ]; then
    num_netmask=${netmask}
    num_binary_compute
    binary_decimal_compute
  # 十进制
  elif [ ${len} -le 15 ]; then
    
	B0=`echo ${netmask} | awk -F. '{print $4}'`
	B1=`echo ${netmask} | awk -F. '{print $3}'`
	B2=`echo ${netmask} | awk -F. '{print $2}'`
	B3=`echo ${netmask} | awk -F. '{print $1}'`
	nn=`echo ${netmask} | awk -F. '{print(NF)}'`
	if [ $nn -ne 4 ];then
		echo "[x] netmask format error!"
		exit 1
	fi
	
	if [ $B0 -gt 255 ] || [ $B1 -gt 255 ]|| [ $B2 -gt 255 ]|| [ $B3 -gt 255 ];then
		echo "[x] netmask format error!"
		exit 1
	fi
	
    decimal_netmask=${netmask}
    decimal_binary_compute
    binary_num_compute
  # 二进制
  elif [ ${len} -eq 35 ]; then
    binary_netmask=${netmask}
    binary_decimal_compute
    binary_num_compute
  else
    echo "[x] netmask format error!"
    exit 1
  fi
}

parse_file()
{

	 #input="/root/.wasion/container/list.conf"
	input=$1
	port=""
	ip_str=""
	netmask=""
	dhcp=""
	netmask=''
	PREFIX='11111111'
	SUFFIX='00000000'
	binary_netmask=''
	decimal_netmask=''
	num_netmask=''

	while IFS= read -r line
	do
			[[ $line =~ ^#.*  ]] && continue
			[ -z "$line" ] && continue


			tmp=`echo $line | grep iface | awk '{print $2}'`
			[ ! -z $tmp ] && port=$tmp
			
			tmp=`echo $line | grep iface | awk '{print $4}'`
			[ ! -z $tmp ] && dhcp=$tmp
			
			tmp=`echo $line | grep address | awk '{print $2}'`
			[ ! -z $tmp ] && ip_str=$tmp
			
			tmp=`echo $line | grep netmask | awk '{print $2}'`
			[ ! -z $tmp ] && netmask=$tmp
			
	done < "$input"
	
	if [ -z "$port" ] ;then
		return 0
	fi
	if [ x$dhcp == "xdhcp" ];then
		/usr/sbin/dhclient $port
		return 0
	fi

	if [ -z "$ip_str" ] || [ -z "$netmask" ] ;then 
		return 0
	fi
	
	len=`echo ${#netmask}`
	compute
		
	ip_str+="/$num_netmask"
	
	echo "ip link set $port down"
	echo "ip addr flush dev $port"
	echo "ip addr add $ip_str dev $port"
	echo "ip link set $port up"
	
	ip link set $port down
	ip addr flush dev $port
	ip addr add $ip_str dev $port
	ip link set $port up
}


for file in `ls $path/*_interfaces`
do
        if [ -f $file ];then
                parse_file $file
        fi
done



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值