Sinds je om Bash vroeg:
INET_NTOA() {
local IFS=. num quad ip e
num=$1
for e in 3 2 1
do
(( quad = 256 ** e))
(( ip[3-e] = num / quad ))
(( num = num % quad ))
done
ip[3]=$num
echo "${ip[*]}"
}
INET_ATON ()
{
local IFS=. ip num e
ip=($1)
for e in 3 2 1
do
(( num += ip[3-e] * 256 ** e ))
done
(( num += ip[3] ))
echo "$num"
}
Voorbeelden:
$ INET_ATON 10.2.1.255
167903743
$ INET_NTOA 167903743
10.2.1.255
Hier is een versie die zal werken in alle van Bourne afgeleide shells die ik heb geprobeerd, inclusief dash, ksh, verschillende versies van Bash, BusyBox ash, zsh (met -y
) en zelfs de Heirloom Bourne Shell
.
INET_NTOA() {
num=$1
ip=
for e in 3 2 1
do
quad=`echo "256 ^ $e" | bc`
if [ -n "$ip" ]
then
ip=$ip.
fi
ip=$ip`echo "$num / $quad" | bc`
num=`echo "$num % $quad" | bc`
done
ip=$ip.$num
echo "$ip"
}
INET_ATON ()
{
num=0
e=3
saveIFS=$IFS
IFS=.
set -- $1
IFS=$saveIFS
for ip in "[email protected]"
do
num=`echo "$num + $ip * 256 ^ $e" | bc`
e=`echo "$e - 1" | bc`
done
echo "$num"
}