16.shell中的函数(上)
- 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接掉用这个小单元的名字即可。
-
格式:function f_name() { command ...... }
函数必须要放在最前面
- 示例1
#!/bin/bash
function inp(){
echo $1 $2 $3 $0 $#
}
inp 1 a 2
[root@Chauncey ~]#
#!/bin/bash
function inp(){
echo "The first par is $1"
echo "The second par is $2"
echo "The third par is $3"
echo "Then scritp name is $0"
echo "Then number of par is $#"
}
inp b a 2 3 adf
[root@Chauncey ~]# sh function.sh
The first par is b
The second par is a
The third par is 2
Then scritp name is function.sh
Then number of par is 5
示例2:
[root@Chauncey ~]# sh -x function1.sh
+ sum 1 10
+ s=11
+ echo 11
11
[root@Chauncey ~]#
[root@Chauncey ~]# cat function1.sh
#!/bin/bash
sum () { #要想吊用函数,要在函数吊用之前先定义函数
s=$[$1+$2]
echo $s
}
sum 1 10
示例3:
[root@Chauncey ~]# cat function2.sh
#!/bin/bash
ip() {
ifconfig|grep -A1 "$1" | tail -1 | awk '{print $2}' | awk -F ':''{print $2}
'
}
read -p "Please input the eth name:" e
myip=`ip`
echo "$e address is $myip"
[root@Chauncey ~]# ifconfig| grep -A1 "eth0"
eth0 Link encap:Ethernet HWaddr 00:16:3E:08:7F:9C
inet addr:172.31.146.106 Bcast:172.31.159.255 Mask:255.255.240.0
[root@Chauncey ~]# ifconfig| grep -A1 "eth0"|tail -1
inet addr:172.31.146.106 Bcast:172.31.159.255 Mask:255.255.240.0
[root@Chauncey ~]# ifconfig| grep -A1 "eth0"|tail -1|awk '{print $2}'
addr:172.31.146.106
[root@Chauncey ~]# ifconfig| grep -A1 "eth0"|tail -1|awk '{print $2}'|awk -F ':' '{print $2}'
172.31.146.106
[root@Chauncey ~]#
18.shell中的数组
定义数组:a=(1 2 3 4 5);echo ${a[@]} #数组的内容可以是数字,也可以是字符串
- echo ${#a[@] #获取数组的元素个数
- echo ${a[2]} #读取第三个元素,数组的从0开始
- echo ${a[*]} #等同于${a[@]},显示整个数组
数组赋值
- a[1]=100; echo ${a[@]}
- a[5]=2; echo ${a[@]} #如果下表不存在则会自动添加一个元素
数组的删除
- uset a; unset a[1]
[root@Chauncey ~]# a=(1 2 3 4 5)
[root@Chauncey ~]# echo ${a[@]}
1 2 3 4 5
[root@Chauncey ~]# echo ${a[*]}
1 2 3 4 5
[root@Chauncey ~]# echo ${a[1]} #显示数组中的某一个元素
2
[root@Chauncey ~]# echo ${#a[@]}
5
[root@Chauncey ~]# a[5]=b #对数组中的某一元素进行赋值
[root@Chauncey ~]# echo ${a[*]}
1 2 3 4 5 b
[root@Chauncey ~]# a[5]=aaaa #元素的值可以被覆盖,更改
[root@Chauncey ~]# echo ${a[*]}
1 2 3 4 5 aaaa
[root@Chauncey ~]#
[root@Chauncey ~]# unset a[5] #删除数组中的某一个元素
[root@Chauncey ~]# echo ${a[*]}
1 2 3 4 5
[root@Chauncey ~]# unset a #删除一个数组
[root@Chauncey ~]# echo ${a[*]}
[root@Chauncey ~]#
数组分片
- a=(`seq 1 5`)
- echo ${a[@]:0:3}从第一个元素开始,截取3个
- echo ${a[@]:1:4}从第二个元素开始,截取四个
- echo ${a[@]:0-3:2}从倒数第3个元素开始,截取2个
数组替换
- echo ${a[@]/3/100}
- a=(${a[@]/3/100})
[root@Chauncey ~]# b=(`seq 1 10`)
[root@Chauncey ~]# echo ${b[*]}
1 2 3 4 5 6 7 8 9 10
[root@Chauncey ~]# echo ${b[@]:3:4} #从第3位开始,截取4个
4 5 6 7
[root@Chauncey ~]# echo ${b[@]:0-3:2} #从倒数第3位开始,截取2个
8 9
[root@Chauncey ~]# echo ${b[@]/8/eight} #将b数组中的值,8替换位eight
1 2 3 4 5 6 7 eight 9 10
[root@Chauncey ~]# b=(${b[@]/9/nine}) #第二种替换方式
[root@Chauncey ~]# echo ${b[*]}
1 2 3 4 5 6 7 8 nine 10
[root@Chauncey ~]#
19.告警系统需求分析
- 需求:使用shell定制各种个性化告警工具,但需要统一化管理、规范化管理。
- 思路:指定一个脚本包,包含主程序,子程序,配置文件,邮件引擎,输出日志等。
- 主程序:作为整个脚本的入口,是整个系统的命脉。
- 配置文件:是一个控制中心,用它来开关各个子程序,指定哥哥相关联的日志文件。
- 子程序:这个才是真正的监控脚本,用来监控各个指标。
- 邮件引擎:是由一个python程序来实现,他可以定义发邮件的服务器、发邮件人以及发件人密码。
- 输出日志:整个监控系统有日志输出。
- 要求:我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件。
- 程序架构:
-
主目录 mon
bin(该目录下是主程序) conf(该目录下是配置文件) shares(该目录下是各个监控脚本) mail(该目录下是邮件迎请) log(该目录下是日志) main.sh mon.conf load.sh 502.sh mail.py mail.sh mon.long err.long
-
#!/bin/bash
#Written by aming.
# 是否发送邮件的开关
export send=1 #export宣告send变量,会宣告到左右的子脚本中。只要send=1所有的设备都可以发送邮件,维护状态下要把告警关闭,相当于总开关
# 过滤ip地址
export addr=`/sbin/ifconfig |grep -A1 "eth0 "|awk '{print $2}'|awk -F ':' '{print $2}'` #告诉我们发送信息的是哪一台主机,因而需要上报自己的IP,根据自己机器的端口进行修改
dir=`pwd` #找一下当前主脚本的目录,目录不是固定死的,有可能再其目录
# 只需要最后一级目录名
last_dir=`echo $dir|awk -F'/' '{print $NF}'` #仅需要最后的一个层路径
# 下面的判断目的是,保证执行脚本的时候,我们在bin目录里,不然监控脚本、邮件和日志很有可能找不到
if [ $last_dir == "bin" ] || [ $last_dir == "bin/" ]; then
conf_file="../conf/mon.conf" #之所以使用../是因为当前在bin下,conf是在../conf下
else
echo "you shoud cd bin dir"
exit
fi
exec 1>>../log/mon.log 2>>../log/err.log
echo "`date +"%F %T"` load average" #打上时间标记,打出系统负载
/bin/bash ../shares/load.sh #主脚本中吊用子脚本
#先检查配置文件中是否需要监控502 #502是zibbx常见的状态码
if grep -q 'to_mon_502=1' $conf_file; then #查看是否需要监控502
export log=`grep 'logfile=' $conf_file |awk -F '=' '{print $2}' |sed 's/ //g'`
/bin/bash ../shares/502.sh
fi
22.告警系统监控项目