sh/bash/dash/ksh/zsh等Shell脚本
-
215317196
- 帖子: 49
- 注册时间: 2008-06-10 10:52
-
联系:
#1
帖子
由 215317196 » 2011-08-20 1:03
呵呵,脚本写得不是很好,希望有高手帮我完善,比如使用了外部命令,或语法规范,或更妙的技巧,或更加灵活性……
代码: 全选
#!/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
- 帖子: 49
- 注册时间: 2008-06-10 10:52
-
联系:
#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
-
联系:
#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}'`
另外你重复发贴了。
脚本有错误,求助改进和优化----???
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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++强悍,不过可以用。
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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
#9
帖子
由 gwssgc » 2011-08-23 14:37
作为一个只能用命令堆出个脚本的初学者,我无地自容!

-
cjxgm
- 帖子: 1952
- 注册时间: 2010-04-23 20:40
- 系统: Arch Linux
- 来自: 浙江·杭州
-
联系:
#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
为什么要这样

-
tusooa
- 帖子: 6548
- 注册时间: 2008-10-31 22:12
- 系统: 践兔
-
联系:
#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
为什么要这样

是啊,你定义这些变量,后边都没用到。
还有,别用//作注释
-
我就是我2
- 帖子: 1215
- 注册时间: 2008-12-13 10:55
- 来自: the Earth
-
联系:
#12
帖子
由 我就是我2 » 2011-08-23 20:41
是啊,你定义这些变量,后边都没用到。
还有,别用//作注释

-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#13
帖子
由 eexpress » 2011-08-23 20:44
一堆罗嗦的,支持lz直接转perl。省的他们罗嗦。

● 鸣学
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#14
帖子
由 fnan » 2011-08-24 2:04
发个perl看看,只见口水。

bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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++强悍,不过可以用。