初学者写脚本,高手指点下啊!!!

sh/bash/dash/ksh/zsh等Shell脚本
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 初学者写脚本,高手指点下啊!!!

#16

帖子 我就是我2 » 2011-08-24 9:02

fnan 写了:发个perl看看,只见口水。 :em05
坐等perl :em06
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
215317196
帖子: 49
注册时间: 2008-06-10 10:52
联系:

Re: 初学者写脚本,高手指点下啊!!!

#17

帖子 215317196 » 2011-08-25 13:51

学到很多东西啊,看来学习还是要交流,要到论坛来看看啊,一直看书是没有用的。
215317196
帖子: 49
注册时间: 2008-06-10 10:52
联系:

Re: 初学者写脚本,高手指点下啊!!!

#18

帖子 215317196 » 2011-08-25 15:00

fnan 写了:#!/bin/bash
########################################################
awk=/bin/awk
echo=/bin/echo
ifconfig=/sbin/ifconfig
bc=/usr/bin/bc
##################################################################
Ip_Bin=$(ifconfig eth0|sed -rn '/inet /{s/[^:]*:([^ ]*).*/obase=2;\1/;s/\./;/gp}'|bc|xargs printf "%08d")
Mask_Bin=$(ifconfig eth0|sed -rn '/inet /{s/.*Mask:([^ ]*).*/obase=2;\1/;s/\./;/gp}'|bc|xargs printf "%08d")
#把IP和netmask每一段转换成二进制,然后连接起来
##################################################################
Mask_Lng=`printf ${Mask_Bin%%0*}|wc -c` #计算出netmask为“1”的部份有多少位
##################################################################
MyNet=${Ip_Bin:1:$Mask_Lng}$(printf "%0$((32-$Mask_Lng))d")
MyBro=${Ip_Bin:1:$Mask_Lng}$(printf "%0$((32-$Mask_Lng))d"|tr 0 1)

#计算出本机的网络号与广播号,用于下面循环
##################################################################
for (( i=$((2#$MyNet+1)); i< $((2#$MyBro)); i++ )); do
tmp=$(echo "obase=2;$i"|bc)
Ip=$(for a in {0..3};do [ ${a#0} ] && printf "."; printf $((2#${tmp:$a*8:8}));done) #每一次循环数8位分一段换成十制制,再连接起来。
##################################################################
ping -n -c 1 $Ip > /dev/null 2>&1
if [ $? == 0 ];then
Mac=`arp -n $Ip|grep $Ip|awk -F " " '{print $3}'`
echo $Ip" "$Mac
fi #Ping每次计算出的IP,成功即提取MAC地址
##################################################################
done
exit 0
正确应该是:

代码: 全选

MyNet=${Ip_Bin:0:$Mask_Lng}$(printf "%0$((32-$Mask_Lng))d")
MyBro=${Ip_Bin:0:$Mask_Lng}$(printf "%0$((32-$Mask_Lng))d"|tr 0 1)
这集成太高了我看不懂,讲解下咯

代码: 全选

Ip_Bin=$(ifconfig eth0|sed -rn '/inet /{s/[^:]*:([^ ]*).*/obase=2;\1/;s/\./;/gp}'|bc|xargs printf "%08d")
Mask_Bin=$(ifconfig eth0|sed -rn '/inet /{s/.*Mask:([^ ]*).*/obase=2;\1/;s/\./;/gp}'|bc|xargs printf "%08d")
这个我机器运行不了,我改成这样就可以了

代码: 全选

Ip=$(for i in {0..3};do test $i != 0 && printf '.'; printf $((2#${Tmp:$i*8:8}));done)
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 初学者写脚本,高手指点下啊!!!

#19

帖子 fnan » 2011-08-25 18:18

分片有的是0开始有的是1开始,搞混了,不同机器确会有不同,还要调整的。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复