Shell编程(shell中的函数、shell中的数组、 告警系统需求分析)

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程序来实现,它可以定义邮件的服务器、发件人以及发件人密码
  • 输出日志:整个监控系统要有日志输出

转载于:https://my.oschina.net/yolks/blog/2054662

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值