linux 学习笔记-071-Shell 编程-函数,数组,搭建告警系统(需求分析)

发布于 2018-04-20  159 次阅读


shell 中的函数

函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。

格式:

function f_name() {

command

}

函数必须要放在最前面

01:

定义函数 inp,$1 表示第一个参数,$2 表示第二个参数,以此类推,其中$0 表示脚本名称,$#表示共有多少个参数

[root@am-01:~/shell#] vim fun1.sh

#!/bin/bash

function inp(){

    echo "first par:$1"

    echo "second par:$2"

    echo "scritp name:$0"

    echo "number of par:$#"

}

inp 2 3 4 5 6

[root@am-01:~/shell#] sh -x fun1.sh

+ inp 2 3 4 5 6

+ echo 'first par:2'

first par:2

+ echo 'second par:3'

second par:3

+ echo 'scritp name:fun1.sh'

scritp name:fun1.sh

+ echo 'number of par:5'

number of par:5

02:

另一种函数用法

[root@am-01:~/shell#] vim fun1.sh

#!/bin/bash

function inp(){

    echo "first par:$1"

    echo "second par:$2"

    echo "scritp name:$0"

    echo "number of par:$#"

}

inp $1 $2

[root@am-01:~/shell#] sh -x fun1.sh 3 47

+ inp 3 47

+ echo 'first par:3'

first par:3

+ echo 'second par:47'

second par:47

+ echo 'scritp name:fun1.sh'

scritp name:fun1.sh

+ echo 'number of par:2'

number of par:2

03:

继续举例子,利用函数求值的和

[root@am-01:~/shell#] vim fun2.sh

#!/bin/bash

sum(){

    s=$[$1+$2]

    echo $s

}

sum 50 20

[root@am-01:~/shell#] sh -x fun2.sh

+ sum 50 20

+ s=70

+ echo 70

70

04:

输入网卡名字,返回网卡的 IP 地址给你

首先说下这个脚本会用到的关键命令

[root@am-01:~/shell#] ifconfig |grep -A1 "eno16777736: "

eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 172.17.1.240  netmask 255.255.255.0  broadcast 172.17.1.255

#使用 grep 的-A 参数,截取网卡名称为 eno16777736 的信息及其下一行的信息,网卡名称后面加个冒号和空格是为了更精准的匹配
[root@am-01:~/shell#] ifconfig |grep -A1 "eno16777736: " |awk '/inet/ {print $2}'

172.17.1.240

#最后使用 awk,把 inet 这一行提取出来,并取第二列的 IP 地址
#!/bin/bash

ip(){

    a=`ifconfig |grep -A1 "$1: " |awk '/inet/ {print $2}'`

}

while :

do

    read -p "Input eth name:" eth

    n=`ifconfig | grep "$eth: "|awk -F ': ' '{print $1}'`

    if [ -z $eth ]

    then

        echo "Input eth name!"

    elif [ -z $n ]

    then

        echo "Check eth name!"

        continue

    else

        break

    fi

done

ip $eth

if [ -z $a ]

then

    echo "No IP!"

    exit 1

else

    echo $a

    exit 0

fi

#输入网卡名称,再判断有没有输入内容,没输入的话提示输入,输入了内容的话检查有没有这个网卡地址,没有的话返回提示输入网卡名称的地方,名称输入正确的话,再判断能否得到 IP 地址,不能得到 IP 地址的话提示没有 IP 地址,能得到的 IP 地址话返回 IP 地址

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]

数组分片

a=(`seq 1 5`)

echo ${a[@]:0:3} 从第一个元素开始,截取 3 个

echo ${a[@]:1:4} 从第二个元素开始,截取 4 个

echo ${a[@]:0-3:2} 从倒数第 3 个元素开始,截取 2 个

数组替换

echo ${a[@]/3/100}

a=(${a[@]/3/100})

01:

定义数组,显示整个数组,读取第三个元素(从 0 开始),获取数组元素的个数

[root@am-01:~/shell#] b=(1 2 3)

[root@am-01:~/shell#] echo ${b[@]}

1 2 3

[root@am-01:~/shell#] echo ${b[*]}

1 2 3

[root@am-01:~/shell#] echo ${b[2]}

3

[root@am-01:~/shell#] echo ${#b[@]}

3

02:

数组赋值,如果下标不存在则会自动添加一个元素

[root@am-01:~/shell#] b[3]=a

[root@am-01:~/shell#] echo ${b[@]}

1 2 3 a

[root@am-01:~/shell#] b[3]=564

[root@am-01:~/shell#] echo ${b[@]}

1 2 3 564

03:

数组的删除

[root@am-01:~/shell#] unset b[3]

[root@am-01:~/shell#] echo ${b[@]}

1 2 3

[root@am-01:~/shell#] unset b

[root@am-01:~/shell#] echo ${b[@]}

04:

数组分片,从第三个元素开始,截取 4 个;从倒数第三个元素开始,截取 2 个

[root@am-01:~/shell#] b=(`seq 1 10`)

[root@am-01:~/shell#] echo ${b[*]}

1 2 3 4 5 6 7 8 9 10

[root@am-01:~/shell#] echo ${b[*]:3:4}

4 5 6 7

[root@am-01:~/shell#] echo ${b[*]:0-3:2}

8 9

05:

数组替换

[root@am-01:~/shell#] echo ${b[*]/3/10}

1 2 10 4 5 6 7 8 9 10

[root@am-01:~/shell#] echo ${b[*]/3/50}

1 2 50 4 5 6 7 8 9 10

[root@am-01:~/shell#] b=(${b[*]/3/60})

[root@am-01:~/shell#] echo ${b[*]}

1 2 60 4 5 6 7 8 9 10

告警系统需求分析

需求:使用 shell 定制各种个性化告警工具,但需要统一化管理、规范化管理

思路:指定一个脚本包,包含主程序、子程序、配置文件、邮件引擎、输出日志等

主程序:作为整个脚本的入口,是整个系统的命脉,用来调用子程序

配置文件:是一个控制中心,用它来开关各个子程序,指定各个相关联的日志文件

子程序:这个才是真正的监控脚本,用来监控各个指标

邮件引擎:是由一个 python 程序来实现,它可以定义发邮件的服务器、发邮件人以及发件人密码

输出日志:整个监控系统要有日志输出

 

要求:我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件

程序架构:bin 下是主程序,conf 下是配置文件,shares 下是各个监控脚本,mail 下是邮件引擎,log 下是日志。

linux 学习笔记-071-Shell 编程-函数,数组,搭建告警系统(需求分析)