シェル関数で ip2long と long2ip 実装

久しぶりにシェル(bash)上で ip2long / long2ip を使いたくなって、関数 (function) として自己実装。

ロングIPアドレス - KuroNeko666’s blog

どっちもサニタイズがきちんとできてないし、ちょっと無駄があるけど、分かりやすさ優先で処理。
仕事に使う方は、正規表現で IP アドレスをチェックすること。

ip2long 関数
ip2long() {
    ## argument check.
    # Dot count
    # 数字以外(ドットと改行)で4文字と異なる場合に NG
    iNum=$(echo $1 | sed 's/[0-9]//g' | wc -c)
    [ "${iNum}" -eq "4" ] || return 1

    # Octet input
    iOct1=$(echo $1 | awk -F"." '{print $1}')
    iOct2=$(echo $1 | awk -F"." '{print $2}')
    iOct3=$(echo $1 | awk -F"." '{print $3}')
    iOct4=$(echo $1 | awk -F"." '{print $4}')

    # Octet caliculation
    nOct1=$(expr ${iOct1} \* 256 \* 256 \* 256)
    nOct2=$(expr ${iOct2} \* 256 \* 256)
    nOct3=$(expr ${iOct3} \* 256)
    nOct4=$(expr ${iOct4})
    nOct=$(expr ${nOct1} + ${nOct2} + ${nOct3} + ${nOct4})

    echo "${nOct}"
    return 0
}
long2ip 関数

ip2long 関数を利用するので、必ず ip2long の後に記述すること。

long2ip() {
    ## argument check.
    # Numeric count
    # 数字以外の場合はエラー終了
    expr $1 + 0 > /dev/null 2>&1 || return 1

    # 小数点は全て切り捨て
    iOct1=$(expr $1 \/ 256 \/ 256 \/ 256)
    nOct1=$(expr $1 - $(ip2long ${iOct1}.0.0.0))

    iOct2=$(expr ${nOct1} \/ 256 \/ 256)
    nOct2=$(expr $1 - $(ip2long ${iOct1}.${iOct2}.0.0))

    iOct3=$(expr ${nOct2} \/ 256)
    nOct3=$(expr $1 - $(ip2long ${iOct1}.${iOct2}.${iOct3}.0))

    iOct4=${nOct3}

    echo "${iOct1}.${iOct2}.${iOct3}.${iOct4}"
    return 0
}