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

sh/bash/dash/ksh/zsh等Shell脚本
215317196
帖子: 49
注册时间: 2008-06-10 10:52
联系:

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

#1

帖子 215317196 » 2011-08-20 1:03

呵呵,脚本写得不是很好,希望有高手帮我完善,比如使用了外部命令,或语法规范,或更妙的技巧,或更加灵活性…… :em11 :em11

代码: 全选

#!/bin/bash
#author:        InBi
#date:          2011-08-16
#website:       http://www.itwhy.org/2011/08-20/939.html
########################################################
awk=/bin/awk
cut=/bin/cut
echo=/bin/echo
grep=/bin/grep
ifconfig=/sbin/ifconfig
expr=/usr/bin/expr
bc=/usr/bin/bc
##################################################################
Ip=`ifconfig eth0|grep "inet addr"|awk -F " " '{printf $2}'|awk -F ":" '{print $2}'`
Mask=`ifconfig eth0|grep "inet addr"|awk -F ":" '{printf $4}'`                     //获取IP和netmask
##################################################################
for ((i=1;i< =4;i++));do                                                                                                  
	Tmp=`echo $Ip|awk -F "." '{printf $'$i'}'`
	Ip_Bin+=`echo "obase=2;$Tmp"|bc|awk '{printf "%08d\n",$0}'`
	Tmp1=`echo $Mask|awk -F "." '{printf $'$i'}'`
	Mask_Bin+=`echo "obase=2;$Tmp1"|bc|awk '{printf "%08d\n",$0}'`
done;                    //把IP和netmask每一段转换成二进制,然后连接起来
##################################################################
Mask_Lng=`echo $Mask_Bin|cut -f 1 -d "0"`    //---------总觉得这里不好-----
Mask_Lng=`expr length "$Mask_Lng"`                    //计算出netmask为“1”的部份有多少位
##################################################################
MyNet=`expr substr $Ip_Bin 1 $Mask_Lng`
MyBro=$MyNet
for ((i=$Mask_Lng;i<32;i++));do
	MyNet+="0"
	MyBro+="1"
done;                    //计算出本机的网络号与广播号  
##################################################################
MyNet=$((2#$MyNet))
MyBro=$((2#$MyBro))                    //把广播号与网络号转换为十进制,用于下面循环
##################################################################
for (( i=$(($MyNet+1)); i< $MyBro; i++ )); do
	Tmp=`echo "obase=2;$i"|bc`
	Ip1=`expr substr $Tmp 1 8`
	Ip1=$((2#$Ip1))
	Ip2=`expr substr $Tmp 9 8`
	Ip2=$((2#$Ip2))
	Ip3=`expr substr $Tmp 17 8`
	Ip3=$((2#$Ip3))
	Ip4=`expr substr $Tmp 25 8`
	Ip4=$((2#$Ip4))
	Ip=$Ip1"."$Ip2"."$Ip3"."$Ip4                    //每一次循环数转换成二进制,然后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
上次由 215317196 在 2011-08-20 8:38,总共编辑 1 次。
rediscover
帖子: 3173
注册时间: 2010-01-13 23:26

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

#2

帖子 rediscover » 2011-08-20 2:01

先介绍一下你的脚本目的是什么,大概的思路,这样别人看的时候也会直接一点。
Here I am.
Ubuntu 桌面培训 - 全中文官方文档,含汉化截图,提供PDF
215317196
帖子: 49
注册时间: 2008-06-10 10:52
联系:

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

#3

帖子 215317196 » 2011-08-20 8:39

代码: 全选

Mask_Lng=`echo $Mask_Bin|cut -f 1 -d "0"`
这里怎么用awk啊!!!
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#4

帖子 我就是我2 » 2011-08-20 10:42

Ip=`ifconfig eth0|grep "inet addr"|awk -F " " '{printf $2}'|awk -F ":" '{print $2}'`
Mask=`ifconfig eth0|grep "inet addr"|awk -F ":" '{printf $4}'` //获取IP和netmask
为什么非得要用grep,难道没看到我给你的回复么。
Ip=`ifconfig eth0|awk -F'[:B]' '/inet addr/{print $2}'`
Mask=`ifconfig eth0|awk -F'[:$]' '/inet addr/{print $4}'`

代码:
Mask_Lng=`echo $Mask_Bin|cut -f 1 -d "0"`


这里怎么用awk啊!!!

代码: 全选

Mask_Lng=`echo $Mask_Bin|awk -F0 '{print $1}'`
另外你重复发贴了。脚本有错误,求助改进和优化----???
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


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

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

#5

帖子 215317196 » 2011-08-20 15:57

谢谢,
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#6

帖子 fnan » 2011-08-21 5:35

215317196 写了:

代码: 全选

Mask_Lng=`echo $Mask_Bin|cut -f 1 -d "0"`
这里怎么用awk啊!!!
可以直接获得长度:
Mask_Lng=`printf ${Mask_Bin%%0*}|wc -c`
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
215317196
帖子: 49
注册时间: 2008-06-10 10:52
联系:

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

#7

帖子 215317196 » 2011-08-21 9:02

非常感谢啊
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#8

帖子 fnan » 2011-08-21 10:29

#!/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
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
gwssgc
帖子: 7
注册时间: 2008-04-10 15:25

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

#9

帖子 gwssgc » 2011-08-23 14:37

作为一个只能用命令堆出个脚本的初学者,我无地自容! :em68
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

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

#10

帖子 cjxgm » 2011-08-23 18:02

代码: 全选

awk=/bin/awk
cut=/bin/cut
echo=/bin/echo
grep=/bin/grep
ifconfig=/sbin/ifconfig
expr=/usr/bin/expr
bc=/usr/bin/bc
为什么要这样 :em06
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

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

#11

帖子 tusooa » 2011-08-23 18:54

cjxgm 写了:

代码: 全选

awk=/bin/awk
cut=/bin/cut
echo=/bin/echo
grep=/bin/grep
ifconfig=/sbin/ifconfig
expr=/usr/bin/expr
bc=/usr/bin/bc
为什么要这样 :em06
是啊,你定义这些变量,后边都没用到。
还有,别用//作注释

代码: 全选

] ls -ld //
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#12

帖子 我就是我2 » 2011-08-23 20:41

是啊,你定义这些变量,后边都没用到。
还有,别用//作注释
:em20
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

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

#13

帖子 eexpress » 2011-08-23 20:44

一堆罗嗦的,支持lz直接转perl。省的他们罗嗦。
:em04
● 鸣学
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#14

帖子 fnan » 2011-08-24 2:04

发个perl看看,只见口水。 :em05
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#15

帖子 fnan » 2011-08-24 8:52

#!/bin/bash

i=-1
Ip=''
tmp=`ifconfig eth0|sed -rn '/inet /{s/[^:]*:([^ ]*).*Mask:([^ ]*).*$/obase=2;\1.\2/;s/\./;/gp}'|bc|xargs printf "%08d"` #改回etho,自己用wlan0.
while ((i++<31));do n=${tmp:i:1};m=${tmp:i+32:1};set $1$((n&m)) $2$((n|!m));done
MyNet=$((2#$1)) #算法关系不需加一。
MyBro=$((2#$2))
while ((++MyNet<MyBro));do
tmp=`echo "obase=2;$MyNet"|bc`
Ip=''
for a in {0..3};do [ ${a#0} ] && Ip=$Ip'.';Ip=$Ip$((2#${tmp:$a*8:8}));done
ping -nc1 $Ip >/dev/null
if [ $? == 0 ];then
Mac=`arp -n $Ip|grep $Ip|awk -F " " '{print $3}'`
echo "ip=$Ip mac=$Mac"
fi
done
exit 0
(谁写个perl比较一下,真想看看)
上次由 fnan 在 2011-08-24 10:33,总共编辑 1 次。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复