1. 程式人生 > >shell腳本中的函數,shell中的數組,shell項目-告警系統

shell腳本中的函數,shell中的數組,shell項目-告警系統

mail.sh 郵件引擎 multi 倒數 $2 echo 什麽 服務 mon

shell腳本中的函數
  • 函數就是把一段代碼整理到了一個小單元中,並給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字即可。
  • 格式:
    function f_name() {
    command

}
函數必須要放在最前面,function可以省略直接寫函數名

  • 示列1,打印shell的參數
    [root@akuilinux01 shell]# cat fun1.sh 
    #!/bin/bash
    function inp(){
    echo "the first par is $1"
    echo "the sedcond par is $2"
    echo "the third par is $3"
    echo "the scritp name is $0"
    echo "the number of par is $#"
    }
    inp b a 2 3 sjkdj
    [root@akuilinux01 shell]# sh fun1.sh 
    the first par is b
    the sedcond par is a
    the third par is 2
    the scritp name is fun1.sh
    the number of par is 5
    第一個參數是b,第二個是a,第三個是2,腳本名是fun1.sh,參數個數是5.
  • 也可以定義函數的參數
    [root@akuilinux01 shell]# cat fun1.sh 
    #!/bin/bash
    function inp(){
    echo "the first par is $1"
    echo "the sedcond par is $2"
    echo "the third par is $3"
    echo "the scritp name is $0"
    echo "the number of par is $#"
    }
    inp $1 $2 $3
    [root@akuilinux01 shell]# sh fun1.sh 1 2 3
    the first par is 1
    the sedcond par is 2
    the third par is 3
    the scritp name is fun1.sh
    the number of par is 3
  • 示列2,第一個參數和第二個參數相加並打印

    [root@akuilinux01 shell]# cat fun2.sh 
    #!/bin/bash
    sum(){
    s=$[$1+$2]
    echo $s
    }
    sum 1 10 
    [root@akuilinux01 shell]# sh fun2.sh 
    11
  • 示列3,輸入網卡名,得到ip
函數的核心命令推演
[root@akuilinux01 shell]# ifconfig |grep -A1 "ens33"
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.21.128  netmask 255.255.255.0  broadcast 192.168.21.255
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.21.133  netmask 255.255.255.0  broadcast 192.168.21.255
[root@akuilinux01 shell]# ifconfig |grep -A1 "ens33: "
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.21.128  netmask 255.255.255.0  broadcast 192.168.21.255
[root@akuilinux01 shell]# ifconfig |grep -A1 "ens33: "|awk ‘/inet/‘
        inet 192.168.21.128  netmask 255.255.255.0  broadcast 192.168.21.255
[root@akuilinux01 shell]# ifconfig |grep -A1 "ens33: "|awk ‘/inet/‘|awk -F ‘ ‘ ‘{print$2}‘
192.168.21.128

[root@akuilinux01 shell]# cat fun3.sh 
#!/bin/bash
ip()
{
 ifconfig |grep -A1 "$1: "|awk ‘/inet/‘|awk -F ‘ ‘ ‘{print$2}‘ 
}
while :
do
  read -p "Please input the eth name:" eth
  n=`ifconfig|grep "$eth"`
  if [ -z "$eth" ]
    then
      echo "你必須輸入一個網卡名"
    elif [ -z "$n" ]
      then
        echo "請你輸入正確的網卡名"
        continue
    else
      break
   fi
done
ip_=`ip $eth`
if [ -z "$ip_" ]
  then
    echo "$eth:這個網卡沒有配置ip"
  else
    echo "$eth:$ip_" 
fi
[root@akuilinux01 shell]# sh fun3.sh 
Please input the eth name:
你必須輸入一個網卡名
Please input the eth name:dada
請你輸入正確的網卡名
Please input the eth name:ens33
ens33:192.168.21.128
[root@akuilinux01 shell]# sh fun3.sh 
Please input the eth name:ens37
ens37:這個網卡沒有配置ip

shell中的數組

  • 定義數組,a=(1 2 3 4);echo ${a[@]}.這裏的數字也能寫為字符串
    [root@akuilinux01 shell]# a=(as b cd)
    [root@akuilinux01 shell]# echo ${a[@]}
    as b cd
    [root@akuilinux01 shell]# echo ${a[*]}
    as b cd
  • echo ${a[2]} 讀取第三個元素,數組從0開始
    [root@akuilinux01 shell]# echo ${a[2]}
    cd
    [root@akuilinux01 shell]# echo ${a[1]}
    b
    [root@akuilinux01 shell]# echo ${a[0]}
    as
  • echo ${#a[@]} 獲取數組的元素個數
    [root@akuilinux01 shell]# echo ${#a[*]}
    3
  • 數組賦值與更改,如果下標不存在則會自動添加一個元素
    [root@akuilinux01 shell]# a[5]=4
    [root@akuilinux01 shell]# echo ${#a[*]}
    4
    [root@akuilinux01 shell]# echo ${a[*]}
    as b cd 4
    [root@akuilinux01 shell]# a[1]=2
    [root@akuilinux01 shell]# echo ${a[*]}
    as 2 cd 4
  • 數組的刪除
    [root@akuilinux01 shell]# unset a[0]
    [root@akuilinux01 shell]# echo ${a[*]}
    2 cd 4
    [root@akuilinux01 shell]# unset a
    [root@akuilinux01 shell]# echo ${a[*]}
  • 數組分片
    • 從第一個開始截取3個

      [root@akuilinux01 shell]# a=(seq 1 10)
      [root@akuilinux01 shell]# echo ${a[*]}
      1 2 3 4 5 6 7 8 9 10
      1 2 3

    • 從倒數第三個開始截取2個
      8 9
  • 數組替換
    [root@akuilinux01 shell]# echo ${a[@]/7/5}
    1 2 3 4 5 6 5 8 9 10
    [root@akuilinux01 shell]# a=(${a[@]/8/3})
    [root@akuilinux01 shell]# echo ${a[@]}
    1 2 3 4 5 6 7 3 9 10

    shell項目-告警系統需求分析

  • 需求:使用shell定制各種個性化告警工具,但需要統一化管理、規範化管理。
  • 思路:指定一個腳本包,包含主程序、子程序、配置文件、郵件引擎、輸出日誌等。
  • 主程序:作為整個腳本的入口,是整個系統的命脈。
  • 配置文件:是一個控制中心,用它來開關各個子程序,指定各個相關聯的日誌文件。
  • 子程序:這個才是真正的監控腳本,用來監控各個指標。
  • 郵件引擎:是由一個python程序來實現,它可以定義發郵件的服務器、發郵件人以及發件人密碼
  • 輸出日誌:整個監控系統要有日誌輸出。
  • 要求:我們的機器角色多種多樣,但是所有機器上都要部署同樣的監控系統,也就說所有機器不管什麽角色,整個程序框架都是一致的,不同的地方在於根據不同的角色,定制不同的配置文件。
  • 程序架構:
                                       (主目錄 mon)
                                                   |
     --------------------------------------------------------------------------------------
     |                   |                         |                              |                       |
    bin             conf                  shares                      mail                  log
    [main.sh]  [mon.conf]  [load.sh 502.sh] [mail.py mail.sh]  [mon.log err.log ]
    bin下是主程序
    conf下是配置文件
    shares下是各個監控腳本
    mail下是郵件引擎
    log下是日誌。

shell腳本中的函數,shell中的數組,shell項目-告警系統