20.17 shell中的函数
函数:就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。 格式: function f_name() { command } 函数必须要放在最前面;
示例1:
#!/bin/bashinputt() { echo $1 $2 $# $0}input 1 a b
注意:函数里面function可以省略,但f_name不要和系统env变量相同,如"for""input"一定要区分开来;
函数本事不会自动执行,只有你调用之后 才会生效; $1:第一个参数; $2:第二个参数; $0:脚本名称; $#:参数的数量(计算有多少参数);
脚本解析:
这个脚本并没有交互,预先脚本里面设定了参数;[root@DasonCheng sbin]# cat funca.sh #!/bin/bashfunction inputt() { echo "The first par is $1" echo "The second par is $2" echo "The third par is $3" echo "The script name is $0" echo "The number of par is $#"}inputt 1 2 3 a b cde ##这里就会调用上面的inputt函数;后面接的是参数![root@DasonCheng sbin]# sh funca.sh The first par is 1The second par is 2The third par is 3The script name is funca.shThe number of par is 6 ##总共有6个参数;
示例2:
#!/bin/bashsum() { s=$[$1+$2] echo $s}sum 1 2
脚本解析:
[root@DasonCheng sbin]# cat funca2.sh #!/bin/bashfunction sum () { s=$[$1+$2] echo "$1+$2=$s"}sum 1 10[root@DasonCheng sbin]# sh funca2.sh 1+10=11
示例3:
#!/bin/baship() { ifconfig |grep -A1 "$1 " |tail -1 |awk '{print $2}''}read -p "Please input the eth name: " emyip=`ip $e`echo "$e address is $myip"
提示:ip函数里面的命令不清楚的话,那就管道一个一个执行;可以换为以下命令:
[root sbin]# ifconfig |grep -w -A1 "ens33:" |awk '/inet/ {print $2}' [root sbin]# ifconfig |grep -A1 "ens33: " |awk '/inet/ {print $2}'
脚本解析:
[root@DasonCheng sbin]# cat funca3.sh #!/bin/bashfunction ip() { ifconfig |grep -A1 "$e: " |awk '/inet/ {print $2}'}read -p "Please input the eth name:" emyip=`ip $e`echo "$e address is $myip"[root@DasonCheng sbin]# sh funca3.sh Please input the eth name:ens33ens33 address is 192.168.60.11[root@DasonCheng sbin]# sh funca3.sh Please input the eth name:ens37ens37 address is 192.168.80.128
脚本拓展:
需求:求出 当用户输入的不是系统内的网卡时或者没有输入时,应该怎样输出?(判断)
[root@DasonCheng sbin]# cat funct3.sh#!/bin/bashfunction ip() { ifconfig |grep -A1 "$e: " |awk '/inet/ {print $2}'}while : ##这个while循环,我是用来判断输入值为的空或者网卡系统里面没有的!doread -p "Please input the eth name:" e if [ -z $e ] then echo "Warnng: please input the eth name!" continue fisure=`ifconfig |grep "$e: " |wc -m` if [ $sure -le 0 ] then echo "The $e is out of your system,please input again!" else break fidonemyip=`ip $e`echo "$e address is $myip"[root@DasonCheng sbin]# sh funct3.shPlease input the eth name:Warnng: please input the eth name!Please input the eth name:asdfThe asdf is out of your system,please input again!Please input the eth name:ens33ens33 address is 192.168.60.11[root@DasonCheng sbin]# sh funct3.shPlease input the eth name:ens37ens37 address is 192.168.80.128
20.18 shell中的数组
shell中的数组1:
定义数组 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[@]} 如果下标不存在则会自动添加一个元素
数组的删除
- unset a; unset a[1]
[root@DasonCheng sbin]# a=(1 2 3 4 5) ##定义一个数组;[root@DasonCheng sbin]# echo ${a[@]} ##显示所有数组 @和*效果一样;1 2 3 4 5[root@DasonCheng sbin]# echo ${a[*]}1 2 3 4 5[root@DasonCheng sbin]# echo ${#a[*]} ##显示数组元素个数;5[root@DasonCheng sbin]# echo ${a[2]} ##显示数组第2个元素值,数组是按0开始算的;3
shell中的数组2:
数组分片:
- 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})
[root@DasonCheng sbin]# a=(`seq 1 10`)[root@DasonCheng sbin]# echo ${a[*]}1 2 3 4 5 6 7 8 9 10[root@DasonCheng ~]# echo ${a[*]:0:3} ##从第一个元素开始,截取3个元素;1 2 3[root@DasonCheng ~]# echo ${a[*]:2:4}3 4 5 6[root@DasonCheng ~]# echo ${a[*]:0-3:2} ##从倒数第三个元素开始,截取2个元素;8 9[root@DasonCheng ~]# a=(${a[*]/3/100}) ##数组替换:将元素3替换为100(并不是将第3个替换为100,需要区分开来)[root@DasonCheng ~]# echo ${a[*]}1 2 100 4 5 6 7 8 9 10[root@DasonCheng ~]# echo ${a[*]/4/200} ##将元素4替换为200,仅仅显示在屏幕上!1 2 100 200 5 6 7 8 9 10[root@DasonCheng ~]# echo ${a[*]}1 2 100 4 5 6 7 8 9 10
20.19 告警系统需求分析
Shell项目-告警系统:
- 需求:使用shell定制各种个性化告警工具,但需要统一化管理、规范化管理。
- 思路:指定一个脚本包,包含主程序、子程序、配置文件、邮件引擎、输出日志等。
- 主程序:作为整个脚本的入口,是整个系统的命脉。
- 配置文件:是一个控制中心,用它来开关各个子程序,指定各个相关联的日志文件。
- 子程序:这个才是真正的监控脚本,用来监控各个指标。
- 邮件引擎:是由一个python程序来实现,它可以定义发邮件的服务器、发邮件人以及发件人密码
- 输出日志:整个监控系统要有日志输出。
要求:我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件。