Vì bạn đã yêu cầu Bash:
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"
}
Ví dụ:
$ INET_ATON 10.2.1.255
167903743
$ INET_NTOA 167903743
10.2.1.255
Đây là phiên bản sẽ hoạt động trong bất kỳ shell nào có nguồn gốc từ Bourne mà tôi đã thử bao gồm dash, ksh, một số phiên bản của Bash, BusyBox ash, zsh (với -y
) và thậm chí cả Vỏ Bourne Gia truyền
.
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"
}