Shell編程(shell中的函數、shell中的數組、 告警系統需求分析)

shell中的函數

函數就是把一段代碼整理到了一個小單元中,並給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字便可。python

語法:shell

function f_name() {
    command
}

ps : function(該關鍵詞可省略,直接寫函數名稱)後面跟的是函數的名字,函數名字後面有中括號和花括號,花括號裏面是具體的命令。須要注意的是一個腳本中,函數定義在前,調用函數在後;即函數必須寫在面前的位置;函數名稱建議按照簡單易懂,不建議使用關鍵詞來命名函數,容易引發誤會或其餘錯誤;數組

腳本演示1: 需求:編寫一個shell函數腳本,輸出參數 腳本實現:bash

#!/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程序來實現,它能夠定義郵件的服務器、發件人以及發件人密碼
  • 輸出日誌:整個監控系統要有日誌輸出
相關文章
相關標籤/搜索