シェル関数で 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 }