2013-09-28 172 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