1、可以利用bc,关键在于补全8位,这个只能用在C类,局限性大
vim ip_switch_bin.sh
#!/bin/sh
ip=${1}
ip_switch_bin(){
ipaddrs=$(echo $ip| awk -F '/' '{print $1}'|awk 'BEGIN{RS="."} {print}')
for i in ${ipaddrs[@]}
do
echo "obase=2;$i"|bc
byte () { printf "%08d" $1; }
done
}
resbin=$(ip_switch_bin $1)
echo "$resbin"|xargs echo|tr ' ' '.'
测试:
sh ip_switch_bin.sh 192.168.199.200
11000000.10101000.11000111.11001000
#################################
sh ip_switch_bin.sh 192
11000000
2、高级一点的写法,使用全类地址
来源: https://stackoverflow.com/questions/4042601/unixhow-to-convert-ip-address-to-binary-code
vim ip_switch_bin.sh
#!/bin/sh
tobin ()
{
local val bits b c d;
val=$1;
bits="";
(( val < 2 )) && bits=$val;
b="";
while (( val > 1 )); do
bits=$b$bits;
(( b = val % 2 ));
(( c = ( val / 2 ) * ( val % 2 ) ));
(( val = val / 2 ));
(( d = val ));
done;
echo "$d$c$bits"
}
# 补足八位
byte () { printf "%08d" $1; }
# unset为shell内建指令,可删除变量或函数
unset dot binary
# IFS 是一种 set 变量,默认是 space, tab, newline
# 保存原始值
saveIFS=$IFS
# 改变IFS的值
IFS=.
ip=($1)
# 还原IFS的原始值
IFS=saveIFS
for octet in ${ip[@]}
do
binary=$binary$dot$(byte $(tobin $octet))
dot=.
done
echo $binary
测试:
[root@node3 ~]# sh ip_switch_bin.sh 10.10.10.10
00001010.00001010.00001010.00001010
[root@node3 ~]# sh ip_switch_bin.sh 10
00001010