您的位置:首页 > 运维架构 > Shell

Shell学习(shell中的函数,数组,告警系统需求分析,告警系统主脚本)-2018.12.27

2019-01-18 12:54 836 查看

16.shell中的函数(上)

  • 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接掉用这个小单元的名字即可。
  • [code]格式:function f_name() {
    command
    ......
    }

     

      函数必须要放在最前面

  •       示例1
[code]#!/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:

[code]
[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:

[code][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]
[code][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})
[code][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

[code]#!/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.告警系统监控项目

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: