http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=7203&fromuid=4587
我通过一个简单的ping 脚本把知识点分享给大家。
先展示下这个脚本的效果
我先把我学linux之前的脚本发出来
在把之后的脚本发出来做比较
最后 解析 每个知识点
-----------------------------------------
#! /bin/bash
## look exist ip
for sum in `seq 0 255`
do
ipsum=192.168.1.${sum}
ping -c 1 -W 1 ${ipsum} &>/dev/null
if [ "$?" == "0" ]
then
echo "$ipsum exist"
else
continue
fi
done
这个脚本在我现在看来 十分的简陋不堪
1.只能查看192.168.1.0 网段ip
2.输出信息是否的难看 简直丑陋
3.ctrl+c 无法终止脚本 这很让人恼火
----------------------------------------------
这玩意 简直不堪入目
---------------------------------------
#! /bin/bash
cat << EOF
by jingwang at 2014,12,13
EOF
gate0=0
gate1=0
NET1="192.168.1.1"
NET0="192.168.0.1"
h=0
PING () {
if ping -c 1 -W 1 $PINGSUM &>/dev/null ;then
return 0
else
return 1
fi
}
PINGSUM () {
if [ $gate1 -eq 1 ] ;then
M="${NET1%.*}"
elif [ $gate0 -eq 1 ];then
M="${NET0%.*}"
fi
for I in `seq 1 255`;do
PINGSUM="$M.$I"
PING
if [ $? -eq 0 ] then
INFO
let h++
done
echo -e "\033[32m$h hosts online\033[0m"
}
INFO () {
length=`stty -F /dev/console size | awk -F " " ‘{print $2}‘`
newlen=$[$length-8]
space=$[$newlen-${#PINGSUM}]
echo -n "$PINGSUM"
for sum in `seq 1 $space`;do
echo -en " "
done
echo -e "\033[32m[up]\033[0m"
}
EXIT () {
echo -e "\033[31m \n\neixiting....\033[0m" && exit 7
}
trap ‘EXIT‘ INT
echo -en "\033[33mplease your GATEWAY:\033[0m"
read N
while :;do
case ${N:-noput} in
noput) echo -e "\033[35mplease putin your GATEWAY OR quit\033[0m"
;;
quit) echo -e "\033[31m exiting....\033[0m" && exit
;;
$NET1) gate1=1 && break
;;
$NET0) gate0=1 && break
;;
*) echo -e "\033[31mInvlid argurment,please try putin GATEWAY OR quit\033[0m"
esac
echo -en "\033[33mplease your GATEWAY:\033[0m"
read N
done
if [ $gate0 -eq 1 ] ;then
PINGSUM
elif
[ $gate1 -eq 1 ] ;then
PINGSUM
fi
----------------------------------------------------
1该脚本能指定网段 192.168.1.0 192.168.0.0 我只添加了两种常用的网段 可扩展性强
2能随时 终止脚本
3更美观
3能接收信号 实现ctrl+c 终止脚本
4统计在线主机
-------------------------------------------
随时终止 脚本
----------------------------------------
脚本知识点
一,脚本结构
二,脚本循环
三,函数
四,01开关思想
五,变量加减
六,特别的变量赋值
七,echo特殊用法
八,脚本返回值
九,信号捕捉
十,变量编辑
-----------------------------------------------------
一,脚本结构
if 。。。。;then
fi
如果怎样就怎么样。
这种结构的脚本我很少这样写,一般写成 。。。。。 && 。。。。。
if。。。。。;then
。。。。。。。
else
。。。。。
fi
如果怎样就怎么样,否则怎么样。
这个脚本和上面一的结构一样,比较简单。
我一般写成 。。。。。 && 。。。。 ||
if 。。。。。then
。。。。
elif
。。。。。
fi
case VARNAME in
*) ....
;;
*)......
;;
esac
这两种结构 适合多种条件的
if elif的适合多个不同的条件有不同的值
case 适合一个条件多种不同的值
我来罗列下 应用场景
---------------------------------------------------------------------
二,脚本循环
循环 不外乎 三种
for 。。。。。;do
。。。。
done
适合知道循环次数的场景
while 。。。。;do
。。。。。
done
条件为真循环 这种循环适合不知道循环次数的场景
需要有退出条件
until 。。。。。;do
。。。。。
done
和while类似 有点不同 条件为假时循环
while 的两个特殊用法
while :;do
.....
done 死循环
while read LINE ;do
cat $LINE
done < /etc/passwd
遍历文档
----------------------------------------------------------------------------
三 函数
函数的作用多次引用 让脚本更加明了
对于我来说 可以少打很多重复的内容 让脚本写起来更轻松
-----------------------------------------------------------
四 0,1 开关思想
这个思想对于脚本的控制流程十分有用
掌握了此技能让你对程序的控制更加得心应手
-----------------------------------------------------------
五,变量运算
脚本中可能会经常用到 注意下语法就够了
我知道的格式有四种 大家喜欢那种用那种
a=3 b=6
1,let c=$a=$b
2,c=$[$a+$b]
3,c=$(($a+$b))
4,c=`expr $a + $b` 不推荐此种方法 这个要注意每个字段间需要空格
-----------------------------------------------------------------
六,特变的变量赋值
有些时候变量没有值 或者值为空的时候脚本都会报错
这时候 就需要些特殊的变量赋值方法了
${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
--------------------------------------------------------------
七,脚本返回值
这个值对与我们十分重要 。编译源码时大家都经验,一次输入一大堆信息。
根本无法分源码是否编译成功
这时候用echo $? 就能判断了 0 为成功 其他为失败
这里定义脚本的返回值也是遵照如此的
---------------------------------------------------------------
八,echo的特殊用法
echo用好了 会让你的脚本看上去更加酷炫
echo -e ”\033[31m 。。。。。。\033[0m" 让脚本显示颜色更加醒目 更加酷炫
echo -n “ “ 不添加换行符,能让下面一行并存为一行
我用此方法定义变量 显示颜色 更加醒目
------------------------------------------------------------
九,信号捕捉
不知道 你有没有发现 你写的脚本貌似不能像系统的二进制程序
支持 bg ctrl+c 等信号 或者说你根就不知道信号
那么就kill -l 看看吧 kill 就是放送的命令控制程序
bash 自带命令 trap 就是补做信号的
trap ‘执行的命令‘ 信号 捕捉到该信号 执行单引号里的命令
--------------------------------------------------------------
10,变量编辑
好吧 很多时候都可能用到变量编辑
a="/etc/passwd"
1,判断变量字符长度 cat "${#a}
我在这里用来计算 变量长度
cat “${a#*/}" etc/passwd
cat "${a##*/} passwd
cat "${a%/*}" /etc
cat "${a%%/*}
我在 这里用来截取网段
---------------------------------------------------------
#! /bin/bash
cat << EOF
by jingwang at 2014,12,13
EOF
green="\\033[32;1m"
orange="\\033[31;1m"
orange1="\\033[35;1m"
red="\\033[31;1m"
end="\\033[0;39m"
gate0=0
gate1=0
NET1="192.168.32.1"
NET0="192.168.0.1"
null="/dev/null"
num=0
PING () {
if ping -c 1 -W 1 $1 &> $null ;then
return 0
else
return 1
fi
}
PINGSUM () {
M="${1%.*}"
for I in `seq 1 255`;do
PING_IP="$M.$I"
PING $PING_IP
if [ $? -eq 0 ];then
INFO $PING_IP
((num++))
fi
done
echo -e "${green}$num hosts online${end}"
}
INFO () {
# get null string
length=`stty -F /dev/console size | awk ‘{print $2}‘`
newlen=$[$length-8]
space=$[$newlen-${#1}]
echo -n "$1"
for sum in `seq 1 $space`;do
echo -en " "
done
echo -e "${green}[up]${end}"
}
EXIT () {
echo -e "${orange} \n\neixiting....${end}" && exit 7
}
trap ‘EXIT‘ INT
while :;do
echo -en "\033[33mplease your GATEWAY: \033[0m"
read GATEWAY
case ${GATEWAY:-noput} in
noput)
echo -e "${orange1}mplease putin your GATEWAY OR quit${end}"
;;
quit)
echo -e "${orange} exiting....${end}" && exit
;;
*)
if ! PING $GATEWAY ;then
echo -e "\033[31mInvlid argurment,please try putin GATEWAY OR quit\033[0m"
else
PINGSUM $GATEWAY
fi
;;
esac
done
稍稍改了一下
noreliang 发表于 2015-9-1 01:29
#! /bin/bash
cat $null ;then
return 0
这个 字体颜色 一直没有注意 有颜色重复
你这一改 倒是提醒我了 谢谢 指正
---------------------------------------------------------------------------
脚本后面应该加上exit 0
--------------------------------------------------------------