shell中的函数
函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。
语法:
function f_name() {
command
}
ps : function(该关键词可省略,直接写函数名称)后面跟的是函数的名字,函数名字后面有中括号和花括号,花括号里面是具体的命令。需要注意的是一个脚本中,函数定义在前,调用函数在后;即函数必须写在面前的位置;函数名称建议按照简单易懂,不建议使用关键词来命名函数,容易引起误会或其他错误;
脚本演示1: 需求:编写一个shell函数脚本,输出参数 脚本实现:
#!/bin/bash
function inp(){
echo $1 $2 $3 $0 $#
}
inp 1 a 2
执行结果:
[root@superyolks shell]# sh function.sh
1 a 2 function.sh 3
关键代码解释:
- $0 : 表示脚本本身,即当前脚本名称
- $1 : 表示第1个参数
- $2 : 表示第2个参数
- $3 : 表示第3个参数
- $# : 表示当前函数总参数个数
脚本演示1.1:
需求:针对上面脚本1作补充,细化分解上面脚本,方便理解
脚本实现:
#!/bin/bash
function inp(){
#echo $1 $2 $3 $0 $#
echo "The first parameter is $1"
echo "The second parameter is $2"
echo "The third parameter is $3"
echo "The four parameter is $4"
echo "The script name is $0"
echo "The parameter sum is $#"
}
inp a b 1 2
执行结果:
[root@superyolks shell]# sh function1.sh
The first parameter is a
The second parameter is b
The third parameter is 1
The four parameter is 2
The script name is function1.sh
The parameter sum is 4
脚本演示1.2:
需求:做实验测试函数参数定义外部,即执行脚本的时候指定参数,参数之间使用空格区分即可
脚本实现:
#!/bin/bash
function inp(){
#echo $1 $2 $3 $0 $#
echo "The first parameter is $1"
echo "The second parameter is $2"
echo "The third parameter is $3"
echo "The four parameter is $4"
echo "The script name is $0"
echo "The parameter sum is $#"
}
执行结果:此步很关键,需要指定参数
[root@superyolks shell]# sh function2.sh a b c d //指定的a、b、c、d依次为参数$1 $2 $3 $4
The first parameter is a
The second parameter is b
The third parameter is c
The four parameter is d
The script name is function2.sh
The parameter sum is 4
脚本演示2: 需求:获取两个参数相加的值 脚本实现:
#!/bin/bash
sumnumber(){
s=$[$1+$2] //参数相加
echo "参数1是$1"
echo "参数2是$2"
echo "参数1和2的和是:$s"
}
sumnumber 10 5 //调用参数时指定参数1 参数2
执行结果:
[root@superyolks shell]# sh function3.sh
参数1是10
参数2是5
参数1和2的和是:15
脚本演示3: 需求:根据传入的网卡名称查询ip 脚本实现:
#!/bin/bash
getIp(){
ifconfig |grep -A1 "$1"|grep 'inet'|awk '{print $2}'
}
read -p "please input the eth name:" eth
getIp $eth
执行结果:
[root@superyolks shell]# sh function4.sh
Please input the eth name: eth0 //输入网卡名称
172.21.0.6
[root@superyolks shell]# sh function4.sh
Please input the eth name: lo
127.0.0.1
关键参数解释:
- ifconfig |grep -A1 "网卡名称":获取指定网卡第1行及下面一行
shell中的数组
数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。这些无序排列的同类数据元素的集合称为数组。
语法:
a=(1 2 3 4 5 );
echo ${a[*]}
ps : a后面紧跟的括号里面类型可以是数字、字母等类型
示例:
定义数组
[root@superyolks shell]# a=(a b c d 1 2 3 4) 命令行定义数组
读取数组
[root@superyolks shell]# echo ${a[*]} //打印数组所有元素
a b c d 1 2 3 4
[root@superyolks shell]# echo ${a[@]} //打印数组所有元素
a b c d 1 2 3 4
[root@superyolks shell]# echo ${a[0]} //获取数组指定元素的值
a
[root@superyolks shell]# echo ${a[1]} //获取数组指定元素的值
b
[root@superyolks shell]# echo ${#a[*]} //查看数组长度
8
小结 :
- 此处实测*号作用和@没有区别
- 方括号里面的数字表示是下标,下标从0开始,下标为0表示第1个元素值
数组赋值
[root@superyolks shell]# a[8]=eight //数组赋值
[root@superyolks shell]# echo ${a[8]}
eight
[root@superyolks shell]# echo ${a[*]}
a b c d 1 2 3 4 eight
数组删除
[root@superyolks shell]# unset a[8] //数组元素删除
[root@superyolks shell]# echo ${a[8]}
[root@superyolks shell]# echo ${a[*]}
a b c d 1 2 3 4
[root@superyolks shell]# unset a //删除整个数组
[root@superyolks shell]# echo ${a[*]}
[root@superyolks shell]# echo ${#a[*]}
0
数组分片
截取数组中某几个元素
示例:
[root@superyolks shell]# a=(1 2 3 4 5 6 7 8)
[root@superyolks shell]# echo ${a[@]:0:3}
1 2 3
[root@superyolks shell]# echo ${a[@]:1:2}
2 3
参数分析花括号里面的从左到右以":"作为分割:
- 第一部分 : 要分片的数组对象
- 第二部分 : 分片起始位置
- 第三部分 : 分片个数
反着截取
[root@superyolks shell]# echo ${a[@]:0-5:2} //从尾部截取,从下标0开始数
4 5
[root@superyolks shell]# echo ${a[@]:1-2:1} //从尾部截取,从下标1开始数
8
数组替换
[root@superyolks shell]# echo ${a[*]/8/7} //临时将8替换为7
1 2 3 4 5 6 7 7
[root@superyolks shell]# echo ${a[*]/7/6} //临时将7替换为6
1 2 3 4 5 6 6 8
可以把整个数组赋值
a数组赋值给b数组
[root@superyolks shell]# b=(${a[*]}) //a数组赋值给b数组
[root@superyolks shell]# echo ${b[*]} //打印b数组
1 2 3 4 5 6 7 8
告警系统需求分析
需求背景:在Linux运维工作中,大部分工作都是围绕监控,虽然可以使用Zabbix监控,但是有时候Zabbix也不能完全满足所有的需求:
比如有时候需要做一个比较冷门的一些监控,那Zabbix需要去写自定义脚本、传输数据等.
例如有时候服务器之间通信有点问题,没有办法从客服端到服务端通信,那没有办法把数据上报到服务端去,怎么做好呢? 可以使用shell脚本监控一下,这样的话非常自由. 实际上告警系统是一个分布式的,也就是说需要在每一台机器上放shell脚本,每一台机器都可以独立监控,不需要依赖其他的机器.
前面使用while 循环,写了一个监控系统负载的脚本,接下来写的脚本都是类似于while ,for, 或是crontab 执行任务,每分钟监控一次,可以让我们清楚的知道服务器是否正常.
很关键的地方是需要弄一个邮件系统,什么时候需要告警,总不能一分钟监测一次, 每一分钟监测到有问题都发邮件告警的话,那样很繁琐,所以要做一个告警收敛
需求:使用shell定制各种个性化告警工具,但需要统一化管理、规范化管理. 思路:指定一个脚本包,包含主程序、子程序、配置文件、邮件引擎、输出日志等
- 主程序:作为整个脚本的入口,是整个系统的命脉
- 配置文件:是一个控制中心,用它来开关各个子程序,指定各个相关联的日志文件
- 子程序:这个才是真正的监控脚本,用来监控各个指标
- 邮件引擎:是由一个python程序来实现,它可以定义邮件的服务器、发件人以及发件人密码
- 输出日志:整个监控系统要有日志输出