从IP地址和子网掩码获取网络ID

4

我正在尝试学习一些shell脚本,并且认为将其与我的ccna学习结合起来会是一个不错的方式。因此,我正在编写一个简单的脚本,根据用户提供的IP地址和子网掩码扫描一些网络设备。为了确定主机所属的网络,我使用以下代码行,但它一直给我错误。

read -p "Geef een IP-adres op "  i
read -p "Geef een subnetmask op "  s

IFS=. read -r i1 i2 i3 i4 <<< $i
IFS=. read -r m1 m2 m3 m4 <<< $s

ip=`printf "%d.%d.%d.%d\n" $i1 $i2 $i3 $i4`
mask=`printf "%d.%d.%d.%d\n" $m1 $m2 $m3 $m4`

#bepaal netwerk id
id=`printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"`

错误信息如下所示:
192 168 178 15 &  0xff 0xff 0xff 0x00: syntax error in expression (error token is "168 178 15 &  0xff 0xff 0xff 0x00")

有人能告诉我为什么吗?

1个回答

4
问题出在引用传递给read调用的变量上。如果你这样做(添加引号):
IFS=. read -r i1 i2 i3 i4 <<< "$i"
IFS=. read -r m1 m2 m3 m4 <<< "$s"

一切又恢复正常了,但仍不确定原因。


1
因为整个脚本的IFS是“.”,所以$i被读取为:“数字 数字 数字 数字”,但<<<只会获取第一个。如果将其括在引号中,则shell解析器会停止查找$IFS字符,直到引号结束...始终良好的做法是首先存储OLDIFS,然后尽快恢复IFS。 - technosaurus
谢谢!运行得非常好! - Martijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接