第十九章 Shell程式設計(二)
一、shell中的函式
二、shell中的陣列
三、告警系統需求分析
四、告警系統主指令碼
五、告警系統配置檔案
六、告警系統監控專案
七、告警系統郵件引擎
八、執行告警系統
一、shell中的函式
函式就是把一段程式碼整理到了一個小單元中,並給這個小單元起一個名字,當用到這段程式碼時直接呼叫這個小單元的名字即可。定義函式必須要放在最前面。定義好的函式相當於是命令。
語法格式:函式必須放在最前面
//name屬性定義了賦予函式的唯一名稱。指令碼中定義的每個函式都必須有一個唯一的名稱。
function name {
commands
}
或者 function可省略
//函式名稱後的括號表明正在定義的是一個函式。
name(){
commands
}
呼叫方式,函式必須在呼叫之前進行定義。直接像使用命令一樣使用函式即可。
案例①:列印函式引數
[[email protected] ~]# vim 11.sh
#!/bin/bash
function print_para(){
echo "The first pamameter is $1"
echo "The second pamameter is $2"
echo "The third pamameter is $3"
echo "The script name is $0"
echo "The num pamameter is $#"
}
print_para 1 2 3 #函式名(寫函式名就是呼叫這個函式),函式的第一個引數,第二個引數。。。;也可以跟$1 $2等,表示shell的第一個、第二個引數作為函式的引數
[
The first pamameter is 1
The second pamameter is 2
The third pamameter is 3
The script name is 11.sh //$0就是shell名稱
The num pamameter is 3 //$#就是函式引數個數
案例②:求兩個數之和的簡單指令碼
[
#!/bin/bash
function sum() {
sum=$(($1+$2))
echo $sum
}
sum $1 $2
[[email protected] ~]# sh 11.sh 1 3 //這裡後面跟的兩個引數就是shell的引數,由函式呼叫,然後求和
4
案例③:輸入網絡卡名,然後顯示該網絡卡的ip
[[email protected] ~]# vim 11.sh
#!/bin/bash
getip() {
ifconfig $1 | awk -F " " '$1=="inet" {print $2}'
}
read -p "Please enter the eth name: " interface
getip $interface
[[email protected] ~]# sh -x 11.sh
+ read -p 'Please enter the eth name: ' interface
Please enter the eth name: ens33
+ getip ens33
+ ifconfig ens33
+ awk -F ' ' '$1 == "inet" {print $2}'
192.168.239.128
更嚴謹的規範使用者輸入資訊並檢查系統中是否存在這個網絡卡或這個網絡卡是否存在ip:
參考資料: https://github.com/aminglinux/shell/blob/master/if_ip.txt
二、shell中的陣列
陣列是一個能儲存多個元素的變數,一個元素就是一個值。
1. 定義陣列的格式: arr_name=(value1 value2 value3 ...)
呼叫陣列,格式為:${arr_name[@]}
方括號中的 @ 表示所有的元素,也可以用 * 代替 ;呼叫某一個元素需要使用元素的下標, 下標從0開始,第一個元素下標為0,第二個元素下標為1,依次類推 ; 比如呼叫第一個元素:${arr_name[0]}
[[email protected] ~]# a=(1 2 3 4 5) #定義陣列
[[email protected] ~]# echo ${a[@]} #遍歷陣列中所有元素
1 2 3 4 5
[[email protected] ~]# echo ${#a[@]} #檢視陣列中元素個數
5
[[email protected] ~]# echo ${a[2]} #獲取陣列中的某一個元素
3
[[email protected] ~]# a[2]=6 #修改元素值
[[email protected] ~]# echo ${a[@]}
1 2 6 4 5
[[email protected] ~]# a[5]=10 #修改元素值,但指定的下標不存在時,則會將這個值自動新增到陣列的最後
[[email protected] ~]# echo ${a[@]}
1 2 6 4 5 10
[[email protected] ~]# unset a[5] #刪除陣列的某一個元素
[[email protected] ~]# echo ${a[@]}
1 2 6 4 5
[[email protected] ~]# unset a[@] #刪除整個陣列。unset刪除陣列其實是重新賦值一個空,陣列沒有刪除
[[email protected] ~]# echo ${a[@]}
2. 陣列的分片
[[email protected] ~]# b=(`seq 1 5`) #定義一個數組
[[email protected] ~]# echo ${b[@]}
1 2 3 4 5
[[email protected] ~]# echo ${b[@]:1:3} #從2個元素開始,向後擷取3個
2 3 4
[[email protected] ~]# echo ${b[@]:0:3} #從1個元素開始,向後擷取3個
1 2 3
[[email protected] ~]# echo ${b[@]:0-3:3} #從倒數第三個開始,向後擷取3個
3 4 5
3. 數字替換
[[email protected] ~]# echo ${b[@]/4/helloworld} #把陣列中的4改為helloworld,這只是在輸出的時候替換,實際的元素沒有改變
1 2 3 helloworld 5
[[email protected] ~]# echo ${b[@]}
1 2 3 4 5
[[email protected] ~]# b=(${b[@]/4/helloworld}) #真實替換陣列中的元素,()不能忘了加
[[email protected]x01 ~]# echo ${b[@]}
1 2 3 helloworld 5
三、告警系統需求分析
需求:使用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下是日誌。
四、告警系統主指令碼