前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux基础(day72)

Linux基础(day72)

作者头像
运维小白
发布2022-01-06 13:54:03
4360
发布2022-01-06 13:54:03
举报
文章被收录于专栏:运维小白运维小白

20.16/20.17 shell中的函数

shell中的函数

  • 把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。
  • 函数就是一个子shell,就是一个代码段,定义完函数就可以引用它
  • 格式:
    • function 后是函数的名字,并且 function 这个单词是可以省略掉的
      • 花括号{} 里面为具体的命令
代码语言:javascript
复制
格式: function f_name() {
                      command
             }
函数必须要放在最前面
  • 示例1
    • 这个函数是用来打印参数
代码语言:javascript
复制
#!/bin/bash
input() {
    echo $1 $2 $# $0
}

input 1 a b
代码语言:javascript
复制
[root@hf-01 shell]# cat !$
cat function.sh
#! /bim/bash
function input(){
  echo $1 $2 $# $0
}
input 1 a b
[root@hf-01 shell]# sh -x function.sh
+ input 1 a b
+ echo 1 a 3 function.sh
1 a 3 function.sh
[root@hf-01 shell]# sh function.sh
1 a 3 function.sh
[root@hf-01 shell]# 
  • 函数,可以直接写在脚本内,相当于直接调用
    • 內建变量
    • $1 第一个参数
    • $2 第二个参数
    • ...
    • ~
    • $# 参数名字
    • $0 总共有几个参数
代码语言:javascript
复制
[root@hf-01 shell]# cat function.sh
#! /bim/bash
function input(){
  echo $1 $2 $# $0
}
input $1 $2 
[root@hf-01 shell]# sh function.sh 1 4
1 4 2 function.sh
[root@hf-01 shell]# 

  • 示例2
    • 用于定义加法的函数,shell中定义的函数,必须放在上面
    • 在shell里面需要优先定义函数,比如在调用这个函数的时候,函数还没有定义,就会报错
      • 在想要调用哪一个函数,就必须在调用语句之前,先定义这个函数
代码语言:javascript
复制
#!/bin/bash
sum() {
    s=$[$1+$2]
#定义变量s = $1+$2 /其中 $1为第一个参数,$2为第二个参数
    echo $s
}
sum 1 2
#输出 第一个参数和第二个参数
代码语言:javascript
复制
[root@hf-01 shell]# cat !$
cat fun2.sh
#! /bin/bash
sum(){
   s=$[$1+$2]
   echo $s
}
sum 1 2
[root@hf-01 shell]# sh -x !$
sh -x fun2.sh
+ sum 1 2
+ s=3
+ echo 3
3
[root@hf-01 shell]# 

  • 示例3
    • 显示IP,输入网卡的名字,然后显示网卡的IP
代码语言:javascript
复制
#!/bin/bash
ip() {
    ifconfig |grep -A1 "eno16777736: " |awk '/inet/ {print $2}'
#查看网卡,过滤出ens33及下面的一行,匹配inet行并打印出第二段
}
read -p "Please input the eth name: " e
myip=`ip $e`
echo "$e address is $myip"
  • grep -A1 "ens33" 过滤显示出关键词及关键词下的一行
代码语言:javascript
复制
[root@hf-01 shell]# ifconfig |grep -A1 "eno16777736"
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.202.130  netmask 255.255.255.0  broadcast 192.168.202.255
--
eno16777736:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.202.150  netmask 255.255.255.0  broadcast 192.168.202.255
[root@hf-01 shell]# ifconfig |grep -A1 "eno16777736" |tail -1 
        inet 192.168.202.150  netmask 255.255.255.0  broadcast 192.168.202.255
  • 案例4
    • 判定是否为本机的网卡,判定输入的网卡是否有IP
代码语言:javascript
复制
#!/bin/bash
#coding:utf8
ip()
{
    a=`ifconfig |grep -A1 "$1 " |tail -1 |awk -F" " '{print $2}'`
    if [ -z "$a" ]
    then
        echo $1
        echo "没有这个网卡名"
        exit 1
    fi
    b=`echo $a |grep addr`
    if [ -z "$b" ]
    then
        echo $1
        echo "此网卡没有IP地址"
        exit 1
    fi
    echo $a
}
read -p "请输入你的网卡名字: " eth
ip $eth

20.18 shell中的数组

shell中的数组

  • {a[2]} 读取第三个元素,数组从0开始 echo {a[*]} 等同于 {a[@]} 显示整个数组 数组赋值 a[1]=100; echo
  • 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})

shell中的数组

  1. 数组,就是一串字符创或者一串数字,形成的一个变量,把这个变量叫做数组
  • echo {b[*]} 等同于 {b[@]} 显示整个数组 理解为 打印
代码语言:javascript
复制
[root@hf-01 shell]# b=(1 2 3)    定义数组
[root@hf-01 shell]# echo ${b[@]}        表示数组
1 2 3
[root@hf-01 shell]# echo ${b[*]}         表示数组
1 2 3
  1. 查看某一个元素的值
  • 特殊性:方括号里面的数字表示它的下标,意思就是说这个元素是第几个
    • 第0个就表示第一个,第一个就表示第二个.....(数组就是从0 开始的)
代码语言:javascript
复制
[root@hf-01 shell]# echo ${b[1]}
2
[root@hf-01 shell]# echo ${b[2]}
3
[root@hf-01 shell]# echo ${b[0]}
1
[root@hf-01 shell]# 
  1. 获取数组元素的个数
代码语言:javascript
复制
[root@hf-01 shell]# echo ${#b[@]}
3
[root@hf-01 shell]# 

数组赋值

  • 元素的赋值 或更改覆盖
代码语言:javascript
复制
[root@hf-01 shell]# b[3]=a
[root@hf-01 shell]# echo ${b[*]}
1 2 3 a
[root@hf-01 shell]# b[3]=100
[root@hf-01 shell]# echo ${b[*]}
1 2 3 100
[root@hf-01 shell]# 
  • echo ${b[@]}
    • 如果下标不存在则会自动添加一个元素

数组的删除

代码语言:javascript
复制
[root@hf-01 shell]# unset b[3]
[root@hf-01 shell]# echo ${b[*]}
1 2 3
[root@hf-01 shell]# unset b        把数组的值清空
[root@hf-01 shell]# echo ${b[*]}

[root@hf-01 shell]# 

数组的分片

代码语言:javascript
复制
[root@hf-01 shell]# 
[root@hf-01 shell]# a=(`seq 1 10`)
[root@hf-01 shell]# echo ${a[*]}
1 2 3 4 5 6 7 8 9 10
[root@hf-01 shell]# 
  • 截取数字4到数字7,这四个数字
代码语言:javascript
复制
3表示从3开始,4表示截取4个
[root@hf-01 shell]# echo ${a[*]:3:4}
4 5 6 7
[root@hf-01 shell]# 
  • 从倒数第三个开始,截取2个
    • 必须写成 0-3
代码语言:javascript
复制
[root@hf-01 shell]# echo ${a[*]:0-3:2}
8 9
[root@hf-01 shell]# 

数组的替换

  • 数组的替换和sed替换类似
  • 把数组的8替换成6
代码语言:javascript
复制
[root@hf-01 shell]# echo ${a[*]}
1 2 3 4 5 6 7 8 9 10
[root@hf-01 shell]# echo ${a[*]/8/6}
1 2 3 4 5 6 7 6 9 10
[root@hf-01 shell]# 
  • 直接赋值(需要用括号括起来)
代码语言:javascript
复制
[root@hf-01 shell]# a=(${a[*]/8/6})
[root@hf-01 shell]# echo ${a[*]}
1 2 3 4 5 6 7 6 9 10
[root@hf-01 shell]# 

20.19 告警系统需求分析

告警系统需求分析

  • 需求:使用shell定制各种个性化告警工具,但需要统一化管理、规范化管理。
  • 思路:指定一个脚本包,包含主程序、子程序、配置文件、邮件引擎、输出日志等。
  • 主程序:作为整个脚本的入口,是整个系统的命脉。
  • 配置文件:是一个控制中心,用它来开关各个子程序,指定各个相关联的日志文件。
  • 子程序:这个才是真正的监控脚本,用来监控各个指标。
  • 邮件引擎:是由一个python程序来实现,它可以定义发邮件的服务器、发邮件人以及发件人密码
  • 输出日志:整个监控系统要有日志输出。
  • 要求:我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件。
  • 程序架构:
输入图片说明
输入图片说明
  • bin下是主程序
  • conf下是配置文件
  • shares下是各个监控脚本
  • mail下是邮件引擎log下是日志。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/02/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 20.16/20.17 shell中的函数
    • shell中的函数
    • 20.18 shell中的数组
      • shell中的数组
        • shell中的数组
          • 数组赋值
          • 数组的删除
          • 数组的分片
          • 数组的替换
      • 20.19 告警系统需求分析
        • 告警系统需求分析
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档