2013-09-28 132 views
4

我想学习一些shell脚本,但我认为它将是一种很好的方式将它与我的ccna研究结合起来。所以我写了一个简单的脚本,它可以根据用户提供的IP地址和子网掩码扫描一些网络设备。要确定主机所属的网络,我使用以下几行代码,但它一直让我错误。从IP地址和子网掩码获取网络ID

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") 

这里有人能告诉我为什么吗?

回答

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

+0

Thx!像魅力一样工作! – Martijn