字体:  

Shell下扩展IPv6地址的代码

ELM 发表于: 2009-2-11 22:30 来源: 榆树社区

代码主要目的是将简写(缩写)的IPv6地址扩充成完整的IPv6地址。

CODE:

#!/bin/sh

expend_ipv6_addr()
{
        local ADDR=${1%%/*}

        # get number of :
        local NEW_STR=$(echo $ADDR | sed 's/:://g' | sed 's/[a-f0-9]//ig')
        local PAD_STR=`str_pad $((7 - ${#NEW_STR})) :`
        local TMP_STR=`echo $ADDR | sed 's/::/'$PAD_STR'/g'`
        local ADDR1=`str_pad 4 0 $(echo $TMP_STR | cut -d ':' -f 1)`
        local ADDR2=`str_pad 4 0 $(echo $TMP_STR | cut -d ':' -f 2)`
        local ADDR3=`str_pad 4 0 $(echo $TMP_STR | cut -d ':' -f 3)`
        local ADDR4=`str_pad 4 0 $(echo $TMP_STR | cut -d ':' -f 4)`
        local ADDR5=`str_pad 4 0 $(echo $TMP_STR | cut -d ':' -f 5)`
        local ADDR6=`str_pad 4 0 $(echo $TMP_STR | cut -d ':' -f 6)`
        local ADDR7=`str_pad 4 0 $(echo $TMP_STR | cut -d ':' -f 7)`
        local ADDR8=`str_pad 4 0 $(echo $TMP_STR | cut -d ':' -f 8)`

        local NEW_ADDR=`echo "$ADDR1:$ADDR2:$ADDR3:$ADDR4:$ADDR5:$ADDR6:$ADDR7:$ADDR8" | tr 'a-z' 'A-Z'`
        echo $NEW_ADDR
}

str_pad()
# str_pad len PAD_C str
{
        local I=0
        local PAD_STR=""
        for ((I=0; I<$(($1 - ${#3})); I++)) {
                PAD_STR="${2}$PAD_STR"
        }
        echo "${PAD_STR}${3}"
}

PREFIX_LEN=`echo $1 | awk -F/ '{print $2}'`

if [ -z "$PREFIX_LEN" ]
then
        PREFIX_LEN=128
fi

echo "Org Address: $1"
echo "New Address: $(expend_ipv6_addr $1)/$PREFIX_LEN"
运行结果:
$ ./test.sh 10::1
Org Address: 10::1
New Address: 0010:0000:0000:0000:0000:0000:0000:0001/128