標籤:shell
20.16/20.17 shell中的函數
·函數就是把一段代碼整理到了一個小單元中,並給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字即可。
格式: function f_name() {
command
}
函數必須要放在最前面
·樣本1
#!/bin/bashinput() { ##定義f_name最好不要和shell裡面的關鍵詞衝突 echo $1 $2 $# $0}input 1 a b
$1 $2 第一個,第二個參數
$# 指令碼名稱
$0 參數數量
[[email protected] shell]# sh -x fun1.sh+ input 1 a b+ echo 1 a 3 fun1.sh1 a 3 fun1.sh
也可以把參數寫在指令碼外
[
[email protected] shell]# sh -x fun1.sh 1 a d ##參數寫在指令碼外,名稱後面,也行+ input 1 a d+ echo 1 a 3 fun1.sh1 a 3 fun1.sh
樣本2
#!/bin/bashsum() { s=$[$1+$2] echo $s}sum 1 2
[[email protected] shell]# sh -x fun2.sh+ sum 1 2+ s=3+ echo 33
可以像例1一樣,外部調用參數
[[email protected] shell]# sh -x fun2.sh 3 4+ sum 3 4+ s=7+ echo 77[[email protected] shell]# sh -x fun2.sh 3421 4352+ sum 3421 4352+ s=7773+ echo 77737773
想要調用哪個函數,就在調用語句之前定義這個函數
樣本3
#!/bin/baship() { ifconfig |grep -A1 "$1" |tail -1 |awk '{print $2}'|awk -F':' '{print $2}'}read -p "Please input the eth name: " emyip=`ip $e`echo "$e address is $myip"
下面這樣寫也可以得出ip:
ifconfig | grep -A1 "$1: " | awk '/inet/ {print $2}'
·課後作業:
輸入網卡名,判斷是不是空,是不是系統中的網卡
思路:首先解決輸入為空白的問題,如果輸入內容為空白,就提示要輸入內容並重新迴圈,
其次要是系統中存在的網卡,而網卡設定檔在/etc/sysconfig/network-scripts/下,並且都以ifcfg-為開頭,那麼久可以以此判斷輸入的網卡名為名稱的"ifcfg-網卡名”檔案是否存在,如果存在則允許下步操作,否則重新迴圈
20.18 shell中的數組
·定義數組 a=(1 2 3 4 5); echo ${a[@]} 數組不一定要是數字
[[email protected] shell]# a=(1 2 3 4 5)[[email protected] shell]# echo ${a[@]}1 2 3 4 5[[email protected] shell]# echo ${a[*]}1 2 3 4 5
·echo ${#a[@]} 擷取數組的元素個數
[[email protected] shell]# a=(1 2 3 4 5)[[email protected] shell]# echo ${a[*]}1 2 3 4 5[[email protected] shell]# echo ${#a[*]}5
·echo ${a[2]} 讀取第三個元素,數組從0開始
[[email protected] shell]# echo ${a[0]}1[[email protected] shell]# echo ${a[1]}2[[email protected] shell]# echo ${a[2]}3
·echo ${a[*]} 等同於 ${a[@]} 顯示整個數組
[[email protected] shell]# echo ${a[@]}1 2 3 4 5[[email protected] shell]# echo ${a[*]}1 2 3 4 5
·數組賦值
·添加元素
·a[5]=100; echo ${a[@]}
[[email protected] shell]# a[5]=100[[email protected] shell]# echo ${a[*]}1 2 3 4 5 100[[email protected] shell]# a[5]=aaa[[email protected] shell]# echo ${a[*]}1 2 3 4 5 aaa
·a[6]=bbb; echo ${a[@]} 如果下標不存在則會自動添加一個元素
[[email protected] shell]# a[6]=bbb[[email protected] shell]# echo ${a[*]}1 2 3 4 5 aaa bbb
·數組的刪除
·unset a; unset a[1]
[[email protected] shell]# unset a[5] ##刪除第6個值[[email protected] shell]# echo ${a[*]}1 2 3 4 5 bbb[[email protected] shell]# unset a[5] ##再次刪第6個元素,沒有變化,因此下標不會變化[[email protected] shell]# echo ${a[*]}1 2 3 4 5 bbb[[email protected] shell]# unset a[6] ##下標沒變,還是刪除的第7個元素[[email protected] shell]# echo ${a[*]}1 2 3 4 5[[email protected] shell]# unset a ##清空數組[[email protected] shell]# echo ${a[*]}
·數組分區
a=(`seq 1 10`)
echo ${a[@]:0:3} 從第一個元素開始,截取3個
[[email protected] shell]# a=(`seq 1 10`)[[email protected] shell]# echo ${a[*]}1 2 3 4 5 6 7 8 9 10[[email protected] shell]# echo ${a[*]:0:3}1 2 3
echo ${a[@]:1:4} 從第二個元素開始,截取4個
[[email protected] shell]# echo ${a[*]:1:4}2 3 4 5
echo ${a[@]:0-3:2} 從倒數第3個元素開始,截取2個
[[email protected] shell]# echo ${a[@]:0-3:2}8 9
·數組替換
echo ${a[@]/3/100}替換的是值
a=(${a[@]/3/100})
[[email protected] shell]# echo ${a[*]/3/100}1 2 100 4 5 6 7 8 9 10[[email protected] shell]# a=(${a[*]/3/100})[[email protected] shell]# echo ${a[*]}1 2 100 4 5 6 7 8 9 10
20.19 警示系統需求分析
·需求:使用shell定製各種個人化警示工具,但需要統一化管理、正常化管理。
·思路:指定一個指令碼包,包含主程式、子程式、設定檔、郵件引擎、輸出日誌等。
·主程式:作為整個指令碼的入口,是整個系統的命脈。
·設定檔:是一個控制中心,用它來開關各個子程式,指定各個相關聯的記錄檔。
·子程式:這個才是真正的監控指令碼,用來監控各個指標。
·郵件引擎:是由一個python程式來實現,它可以定義發郵件的伺服器、發郵件人以及寄件者密碼
·輸出日誌:整個監控系統要有日誌輸出。
要求:我們的機器角色多種多樣,但是所有機器上都要部署同樣的監控系統,也就說所有機器不管什麼角色,整個程式架構都是一致的,不同的地方在於根據不同的角色,定製不同的設定檔。
程式架構:
bin下是主程式
conf下是設定檔
shares下是各個監控指令碼
mail下是郵件引擎
log下是日誌
2018-4-20 17周3次課 shell函數、數組、警示需求分析