shell进行子网掩码(mask)和子网前缀(prefix)之间的转换

由于最近在利用shell编写一套自动化安装OpenStack的脚本,需要利用网络前缀计算子网掩码,因此在此记录一下它们之间的转换代码。

1. prefix---->mask

prefix_to_mask() {
    rpm -q --whatprovides bc >/dev/null 2>&1
    [ $? -ne 0 ] && yum install bc -y >/dev/null 2>&1

    bin_prefix=""
    prefix_cnt1=${1}
    for i in `seq 1 ${prefix_cnt1}`
    do
        bin_prefix="${bin_prefix}1"
    done
    prefix_cnt2=$((32 - ${prefix_cnt1}))
    for i in `seq 1 ${prefix_cnt2}`
    do
        bin_prefix="${bin_prefix}0"
    done

    INTERNAL_mask=""
    for i in `seq 0 8 31`
    do
        val=${bin_prefix:${i}:8}
        tmp_mask=$(echo "obase=10;ibase=2;${val}" | bc)
        if [ "${INTERNAL_mask}" = "" ];then
            INTERNAL_mask="${tmp_mask}"
        else
            INTERNAL_mask="${INTERNAL_mask}.${tmp_mask}"
        fi
    done
}
2. mask---->prefix

mask_to_prefix() {
    rpm -q --whatprovides bc >/dev/null 2>&1
    [ $? -ne 0 ] && yum install bc -y >/dev/null 2>&1

    mask=${1}
    prefix_cnt=0
    prefix=""
    local mask_list=($(echo ${mask} | awk -F. '{print $1,$2,$3,$4}'))
    local mask_cnt=${#mask_list[*]}
    mask_cnt=$((${mask_cnt} - 1))
    for i in `seq 0 ${mask_cnt}`
    do
        tmp=$(echo "obase=2;ibase=10;${mask_list[$i]}" | bc)
        prefix="${prefix}${tmp}"
    done
    prefix_cnt=$(echo ${prefix} | grep -o 1 | wc -l)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值