Chinaunix

标题: [原創] 用 shell 來計算 network 跟 broadcast [打印本页]

作者: 網中人    时间: 2003-11-06 12:03
标题: [原創] 用 shell 來計算 network 跟 broadcast
學過網路基礎的朋友,應該都用 IP/MASK 計算過 network address 跟 broadcast address 吧...  ^_^
有沒想過用 shell 來幫你算呢?

  1. #!/bin/bash

  2. all=(${@//[!0-9]/ })
  3. [ "${#all[@]}" != "8" ] && {
  4.         echo "Usage: "
  5.         echo "${0##*/} ip.ip.ip.ip/mask.mask.mask.mask"
  6.         exit 1
  7. }

  8. get_addr () {
  9.         if [ "$1" = "-b" ]; then
  10.                 op='|'; op1='^'; arg='255'
  11.                 shift
  12.         else
  13.                 op='&'
  14.         fi
  15.         unset address
  16.         while [ "$5" ]; do
  17.                 num=$(( $1 $op ($5 $op1 $arg) ))
  18.                 shift
  19.                 address="$address.$num"
  20.         done
  21. }

  22. get_addr ${all[@]}
  23. echo -e "network:\t${address#.}"
  24. get_addr -b ${all[@]}
  25. echo -e "broadcast:\t${address#.}"
复制代码

作者: admirer    时间: 2003-11-06 12:15
标题: [原創] 用 shell 來計算 network 跟 broadcast
up!
作者: BabyBlue    时间: 2003-11-06 14:32
标题: [原創] 用 shell 來計算 network 跟 broadcast
  1. all=(${@//[!0-9]/ })
复制代码

干吗的??
我刚学,麻烦老大讲一下那个关于“@”的用法,可以吗?
作者: config t    时间: 2003-11-06 14:40
标题: [原創] 用 shell 來計算 network 跟 broadcast
高啊
楼主能不能加上注释
谢谢
作者: cloudxx    时间: 2003-11-06 21:15
标题: [原創] 用 shell 來計算 network 跟 broadcast
楼主能否详细注释下?
真看不明白····
作者: ohwww    时间: 2003-11-07 09:16
标题: [原創] 用 shell 來計算 network 跟 broadcast
楼主,我运行时报错,如下:
bash: ./network.sh: cannot execute binary file
作者: 網中人    时间: 2003-11-07 13:40
标题: [原創] 用 shell 來計算 network 跟 broadcast
原帖由 "BabyBlue" 发表:
干吗的??
我刚学,麻烦老大讲一下那个关于“@”的用法,可以吗?

嗯... 先說一下 all=(${@//[!0-9]/ }) 好了。

首先,$@ 的值是全部參數(請參考 positional parameter)。
${var//old/new} 是變量值將全部的 old 換為 new ,那:
${@//[!0-9]/ } 是將 $@ 中所有非數字換為空白 (別漏看了 / } 之間的空白﹗)
var=(v1 v2 v3) 是要將 var 定義為 array (組數),
然後 ${#var[@]} 就可得知 array 裡有多少個數值了。
要是不以 array 來定義, var="v1 v2 v3" 之後的 ${#var} 則是整串變量值的長度(多少個字)...

這樣可理解嗎?
作者: labrun    时间: 2003-11-07 13:49
标题: [原創] 用 shell 來計算 network 跟 broadcast
昨天北京下雪了,而且不小,看到了网中人的签名里用到的毛主席的诗词,顿有感悟“已是寒崖百丈冰,尤有花枝俏”。花枝当然是cu论坛里啦。哈哈……
作者: 網中人    时间: 2003-11-07 14:03
标题: [原創] 用 shell 來計算 network 跟 broadcast
我來加一下注解好了:

  1. #!/bin/bash

  2. # 將參數值裡的非數字全部換成空白鑑
  3. all=(${@//[!0-9]/ })

  4. # 要是處理過的參數量不是 8 個的話... 送出錯誤信息,告知命令可接受的參數格式。並退出。
  5. [ "${#all[@]}" != "8" ] && {
  6.         echo "Usage: "
  7.         echo "${0##*/} ip.ip.ip.ip/mask.mask.mask.mask"
  8.         exit 1
  9. }

  10. # 定義一個 get_add 的 function
  11. get_addr () {

  12. # 要是讀進的第一個 function 參數為 -b ,則設定 op, op1, 與 arg 的變量,以供後面的 $(( $1 $op ($5 $op1 $arg) )) 計算用。
  13.         if [ "$1" = "-b" ]; then
  14. # 其結則為 $(( $1 | ($5 ^ 255) )),也就是逐個算出 broadcast address 。
  15.                 op='|'; op1='^'; arg='255'
  16. # 然後用 shift 拿掉這個 -b 。
  17.                 shift

  18. # 若沒有 -b 參數,則只定義 op 變量。然則,$(( $1 $op ($5 $op1 $arg) )) 的實際算式就變成 $(( $1 & $5)),這會逐個算出 network address 。
  19.         else
  20.                 op='&'
  21.         fi

  22. # 取消變量 address ,以免影嚮其後於 while loop 的運算。
  23.         unset address

  24. # 假如能讀到第 5 個參數,才進入 while loop,否則離開。
  25.         while [ "$5" ]; do

  26. # 跟據前面的 -b 參數,來決定要算出 broadcast 還是 network 。因為前 4 個參數是 ip 後 4 個是 mask ,因此第一個參數跟第五個參數來算就能得出第一組 ip/mask 的計算結果。
  27.                 num=$(( $1 $op ($5 $op1 $arg) ))
  28. # 再拿掉第一個參數,這可讓下一次 looping 計算下一組 ip/mask 。當 shift 4 次之後,while loop 就可結束。
  29.                 shift
  30. # 將每次的計算結果擴充在 address 變量中。(注意:如此的話,最後結果前面會有一個小數點,我們後面再處理)
  31.                 address="$address.$num"
  32.         done
  33. }

  34. # 跑 function 來計算 network address :
  35. get_addr ${all[@]}
  36. # echo -e 可以用 \t 送出一個 <tab> 鍵。${address#.} 則是拿掉最前面的小點。
  37. echo -e "network:\t${address#.}"

  38. # 跑 function 來計算 broadcast address :
  39. get_addr -b ${all[@]}
  40. echo -e "broadcast:\t${address#.}"
复制代码


-----------
補充,若不用 while loop + shift 來逐次計算 $1 與 $5 的話,我們也可以一次過將 4 組 ip/mask 計算出來:
num1=$(( $1 $op ($5 $op1 $arg) ))
num2=$(( $2 $op ($6 $op1 $arg) ))
num3=$(( $3 $op ($7 $op1 $arg) ))
num4=$(( $4 $op ($8 $op1 $arg) ))
address=$num1.$num2.$num3.$num4

還有,我的一個朋友,用 awk 來寫也行哦:
  1. #!/bin/bash

  2. G_network () {
  3. echo $@ | awk 'BEGIN{FS="[./]";OFS="."}
  4.     END{
  5.         print and($1,$5),and($2,$6),and($3,$7),and($4,$8)
  6.     }'
  7. }

  8. G_broadcast () {
  9. echo $@ | awk 'BEGIN{FS="[./]";OFS="."}
  10.     END{
  11.         print or($1,xor($5,255)),or($2,xor($6,255)),or($3,xor($7,255)),or($4,xor($8,255))
  12.     }'
  13. }

  14. ###
  15. # main
  16. ###
  17. ALL_IP=192.168.23.32/255.255.252.0
  18. G_network $ALL_IP
  19. G_broadcast $ALL_IP
复制代码

作者: sunkey    时间: 2003-11-07 14:15
标题: [原創] 用 shell 來計算 network 跟 broadcast
print or($1,xor($5,255)),or($2,xor($6,255)),or($3,xor($7,255)),or($4,xor($8,255))
   

   awk 有这样的函数么? and/or/xor , 还是自己写的??
我印象中好像没有阿。
作者: 網中人    时间: 2003-11-07 14:29
标题: [原創] 用 shell 來計算 network 跟 broadcast
原帖由 "sunkey" 发表:
print or($1,xor($5,255)),or($2,xor($6,255)),or($3,xor($7,255)),or($4,xor($8,255))
   

   awk 有这样的函数么? and/or/xor , 还是自己写的??
我印象中好像没有阿。

這個我不確定,不過... 不是自己跑一遍就有答案了嗎?  ^_^
作者: cloudxx    时间: 2003-11-07 20:15
标题: [原創] 用 shell 來計算 network 跟 broadcast
[ "${#all[@]}" != "8" ]


老大 这里如何理解呢  不太明白
老大你的程序写的很少见2··
作者: 網中人    时间: 2003-11-08 00:50
标题: [原創] 用 shell 來計算 network 跟 broadcast
原帖由 "cloudxx"]"8"  发表:



老大 这里如何理解呢  不太明白
老大你的程序写的很少见2··


在 bash 中,當你定義了一個 array 之後:
array=(v1 v2 v3)
你可以用 ${array[0]} 得到第一各值,其餘類推:
${array[0]} 得 v1
${array[1]} 得 v2
${array[2]} 得 v3
然後 ${array[@]} 得到全部:
${array[@]} 得 v1 v2 v3
再,${#array[@]} 可得到裡面有多少個值,本例為 3 。
然而,${#array} (少了其中的 [@] ),則得到最第一個組數的長讀 (也就是${#array[0]})。
作者: ohwww    时间: 2003-11-08 12:27
标题: [原創] 用 shell 來計算 network 跟 broadcast
很学东西阿
作者: zhangr    时间: 2004-03-24 17:03
标题: [原創] 用 shell 來計算 network 跟 broadcast
老大真是利害呀!
看来真是要好好学习一下了! 8-)
强烈支持中!
作者: 惠繪洋    时间: 2004-10-29 16:06
标题: [原創] 用 shell 來計算 network 跟 broadcast
很強的呢... 我要加倍學習啦....
多謝各位指教....
作者: yangkundai    时间: 2004-10-29 16:35
标题: [原創] 用 shell 來計算 network 跟 broadcast
我也要顶一下哈.
作者: james_dlc    时间: 2004-10-30 00:38
标题: [原創] 用 shell 來計算 network 跟 broadcast
[quote]原帖由 "網中人"][/quote 发表:


我记得书上说过bash是不支持数组的来着
所以对bash没研究,
CSH中数组下标是从1开始的,是LINIUX和SOLARIS不同吗?
作者: 寂寞烈火    时间: 2004-10-30 12:34
标题: [原創] 用 shell 來計算 network 跟 broadcast
原帖由 "james_dlc" 发表:


我记得书上说过bash是不支持数组的来着
所以对bash没研究,
CSH中数组下标是从1开始的,是LINIUX和SOLARIS不同吗?

bash支持数组!他的下标从0开始
作者: agaonet    时间: 2007-03-14 04:42
只要是好东东就需要天天顶。
收下了,正在消化中。。。。
作者: beauty2003    时间: 2008-03-21 14:35
太牛了!
作者: sieur    时间: 2008-03-23 05:40
原帖由 BabyBlue 于 2003-11-6 14:32 发表
all=(${@//[!0-9]/ })
干吗的??
我刚学,麻烦老大讲一下那个关于“@”的用法,可以吗?


all=(${@//[!0-9]/ })
如果没说错的话,all是一个数组。
@表示作用于位置参数
//表示所有匹配的
[!0-9]非数字
/ 删除

意思就是把命令行参数中的每一个参数的非数字部分全部X掉。并且把modified后的参数存储在数组a中。
作者: fuleru    时间: 2008-04-22 23:33
太强了,特别是加上注释了,谢谢网中人啊!
作者: 一刀砍死    时间: 2008-08-20 10:21
不错不错,学习ing.
作者: andrewqin    时间: 2008-08-20 15:59
我也刚学
对第一句不能理解
all=(${@//[!0-9]/ })
还没见到过。。。
作者: andrewqin    时间: 2008-08-20 16:02
呵呵,看到了surie的解释。。。
作者: wstar    时间: 2008-08-20 22:23
学习了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2