到目前为止,我的代码将从iOS系统获得IP地址,并以十六进制形式(ffffff00
)获取子网掩码,但我需要位表格(24、23等)的子网地址)或二进制。我该怎么做?我尝试使用16#${subnet}
转换它,但数字似乎是错误的。
有点愚蠢的问题 - 如果删除了LINE echo "hello"
,则代码不会运行,我不确定为什么?那条线扮演什么角色?
if [ $# -ne 0 ]
echo "hello"
then
ip="$(ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d -f2)"
subnet="$(ifconfig | grep "netmask " | grep -v 0xff0 | sed -e 's/.*0x(.*)broadcast.*/1/')"
consub="$((16#${subnet}))"
echo "$ip $subnet $consub"
exit 0
fi
怎么样:
echo "ffffff00" | perl -pe '$_ = join(".", map(hex, /.{2}/g))'
=> 255.255.255.0
echo "ffffff00" | perl -pe '$_ = unpack("B32", pack("H*", $_)); s/0+$//g; $_ = length'
=> 24
没有一种可靠的方法来预测运行bash的系统中您将拥有的计算器(您可能有BC或DC或其他内容),但是您不知道真的需要那些。考虑以下功能:
binary () {
local n bit=""
printf -v n '%d' "$1"
for (( ; n>0 ; n >>= 1 )); do bit="$(( n&1 ))$bit"; done
printf '%sn' "$bit"
}
这使用 >>=
将位置转移到输入号码,然后使用n&1
在数字中评估位置并在该位置上,并将结果插入$bit
中以进行最终输出。
您可以将任何数字放入其中:
$ binary 123
1111011
$ binary 0xffffff00
11111111111111111111111100000000
从那里,您应该能够简单地计算自己的内容:
$ netmask="0xffffff00"
$ bitmask=$( s=$(binary "$netmask"); s="${s%%0*}"; printf '%d' "${#s}" )
$ echo "$bitmask"
24
您可以使用现代iproute2
工具获取CIDR而不是解析ifconfig
。例如:
ip -f inet -o a s scope global |
grep -Po 'inet S+' |
sed 's#.*/(.*)#1#'