函數就是把一段代碼整理到了一個小單元中,並給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字便可。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
關鍵代碼解釋:運維
腳本演示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
關鍵參數解釋:
數組是在程序設計中,爲了處理方便, 把具備相同類型的若干元素按無序的形式組織起來的一種形式。這些無序排列的同類數據元素的集合稱爲數組。
語法:
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
小結 :
[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定製各類個性化告警工具,但須要統一化管理、規範化管理. 思路:指定一個腳本包,包含主程序、子程序、配置文件、郵件引擎、輸出日誌等