什麼是函數(function)?
函數是被賦予名稱的腳本代碼塊,可以在代碼的任意位置重用。每當需要在腳本中使用這樣的代碼塊時,只需引用該代碼塊被賦予的函數名稱(稱爲調用函數);函數模塊化了編程,使得腳本更加簡潔。
在bash shell腳本中創建函數可以使用兩種格式:
1)使用關鍵字function,後跟代碼塊的函數名:
function f_name {
函數體
}
f_name屬性定義了該函數的唯一名稱,腳本中自定義的每個函數都必須賦予唯一的名稱。
函數體是組成函數的一條或者多條bash shell,命令。當調用函數時,bash shell會按照各條命令在函數中出現的順序依次執行。
2)f_name() {
函數體
}
函數名之後的空白括號表明在定義函數。格式的函數命名規則與前面的shell腳本函數格式相同。
函數調用:使用函數名;函數名出現的地方,會被自動替換爲函數代碼;
函數的返回值有三種生成方式:
a)函數的執行結果返回值:
b)函數中使用打印語句:echo, printf
c)函數體中OS命令執行結果的輸出
函數的退出狀態碼:
a)默認退出狀態:默認取決於函數體執行的最後一個命令的退出狀態碼;函數執行完畢後,可以使用標準變量$?來確定函數的退出狀態。
b)自定義退出狀態碼:在bash shell腳本中使用return命令以特定退出狀態退出函數。return命令可以使用單個整數值來定義函數退出狀態,有效取值範圍爲[0-255]。
#return [0-255]
注意:函數體運行時,一旦遇到return語句,函數即返回;
函數可接受參數:
函數可以使用標準參數環境變量來表示命令行傳遞給函數的參數。
傳遞參數給函數:調用函數時,在函數名後給出參數列表即可;例如“testfunc arg1 arg2 arg3”
在函數體中可使用$1, $2,...來調用傳遞過來的各參數;可使用類似腳本的特殊變量:$*, $@: 一次性獲取參數列表;$#: 參數的個數
變量的作用域:作用域是變量的可見區域,函數內定義的變量與普通變量有不同的作用域,前者能被腳本外部定義的變量所覆蓋。
函數使用兩種類型變量:
a)本地變量:整個腳本,在腳本的函數中也可調用,也可修改;
b)局部變量:函數調用的整個生命週期;
命令:local VAR=VALUE;局部變量聲明要使用關鍵字local,確保變量僅在函數內部使用。如果腳本在函數外部有不同的變量,那麼shell將能區分函數變量和腳本變量。
函數遞歸:函數直接或間接調用函數自身;自給是局部函數變量的一個特性,自給函數除了腳本通過命令行傳遞的變量,不適用函數之外的任何資源;這種特性使函數能夠以遞歸方式調用。
例如:階乘:9!=1*2*3*4*5*6*7*8*9
使用遞歸可以歸結爲:n(n-1)!
階乘函數:
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]; then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
例如:寫一個腳本,判定192.168.0.0網絡內有哪些主機在線,在線的用綠色顯示;不在線的用紅色顯示;(使用函數)
什麼是數組?
數組:連續的多個獨立內存空間,每個內存空間相當於一個變量;這些變量使用相同的數組名和索引來來表示這個數組集合中的不同組成元素。
-------------------------------------注:索引是從0開始編號
聲明數組:
declare -a ARRAR_NAME
關聯數組:
declare -A ARRAY_NAME
--------------------------------------注:支持稀疏格式:
數組元素的賦值:
(1) 一次只賦值一個元素
ARRAY[index]=VALUE
例如:a[0]="hello"
(2) 一次賦值全部元素
ARRAY=("mon" "tue" "wed")
(3) 指定索引進行賦值
ARRAY=([0]="sun" [1]="mon" [5]="fri")
(4) read -a ARRAY
將內容讀入到數值中
引用數組元素:${ARRAY[index]}
數組的長度:
${#ARRAY[*]}, ${#ARRAY[@]}
從數組中挑選某元素:
${ARRAY[@]:offset:number}
例如:week=(mon tue wed thu fri sat sun)
${week[@]:3:2}結果爲:thu fri
數組切片:
offset: 偏移過去的元素的個數;
number: 取出的元素的個數;
取出指定偏移量之後的所有元素;
${ARRAY[@]:offset}
取出所有元素;
${ARRAY[@]}, ${ARRAY[*]}
向數組中追加元素:非稀疏格式
例如:week,
week[${#week[@]}]
從數組中刪除元素:
unset ARRAY[index]
關聯數組:可自定義任意字符串當作索引
例如: declare -A week
week=([mon]="Monday" [tue]="Tuesday")
字符串操作:
字符串切片:${var:offset:lenth}
例如:a="world", ${a:2:2}, rl
取字符串最後的幾個字符:${var: -lenth}
---------------注意:冒號之後有空格;
基於模式取子串:
${var#*word}:其中word可以是指定的任意字符;自左而右,查找var變量所存儲字符中,第一次出現的word,刪除字符開頭直至第一次wrod出現處之間的所有字符;
例如:# mypath='sysconfig/network-scripts/ifcfg-eth0'
# echo ${mypath#*/}
network-scripts/ifcfg-eth0
${var##*word}: 其中word可以是指定的任意字符;自左而右,查找var變量所存儲字符中,最後一次出現的word,刪除字符開頭直至最後一次wrod出現處之間的所有字符;
# mypath='/sysconfig/network-scripts/ifcfg-eth0'
# echo ${mypath##*/}
ifcfg-eth0
${var%word*}: 自右而左,刪除第一次word出現處的字符開始直到尾部的所有字符;
${var%%word*}:自右而左,刪除最後一次word出現處的字符開始直到尾部的所有字符;
例如:url=http://www.magedu.com:80
取端口:${url##*:}
取協議:${url%%:*}
查找並替換:
${var/pattern/substi}:查找var所表示的字串中,第一次被Pattern匹配到的字串,並以substi替換之;
${var//patten/substi}:查找var所表示的字串中,所有被Pattern匹配到的字串,並以substi替換之;
${var/#pattern/substi}:以行首錨定的方式將pattern匹配至var所表示的字串上,如果能匹配,則以substi替換之;
${var/%pattern/substi}:以行尾錨定的方式將pattern匹配至var所表示的字串上,如果能匹配,則以substi替換之;
----------------注:可使用?, *元字符;
查找並刪除:
${var/pattern}:刪除pattern匹配到的第一次出現;
${var//pattern}: 刪除pattern匹配到的所有出現;
${var/#pattern}:刪除以行首錨定方式將pattern匹配至var所表示的字符串上
${var/%pattern}:刪除以行尾錨定方式將pattern匹配至var所表示的字符串上
字符串大小寫轉換:
${var^^}:小寫-->大寫
${var,,}:大寫-->小寫
變量賦值:
${var:-word}: 如果var爲空或未設置,那麼返回word;否則,則返回var中的值;
${var:=word}:如果var爲空或未設置,那麼返回word,並且將word賦值給var;否則,返回var中的值;
${var:?err_info}:如果var爲空或未設置,那麼返回錯誤信息;否則,則返回var自身的值;
${var:+word}:如果var自身有正常數據,則返回word;
trap命令:trap命令用於指定在接收到信號後將要採取的動作。常見的用途是在腳本程序被中斷時完成清理工作。
trap 'arg' SIGNAL
例如:trap 'echo "quit"; exit 1' SIGINT
mktemp命令:產生唯一的臨時文件名
mktemp [OPTIONS] filename.XXXXXXXX
-d: 創建臨時目錄
--tmpdir=/path/to/somewhere :指定臨時文件所在的目錄;
install命令:增強型複製命令
install [OPTIONS] SOURCE DEST
install [OPTIONS] SOURCE... DIR
install [OPTIONS] -t DIR SOURCE...
install -d DIR 所有參數都作爲目錄處理,而且會創建指定目錄的所有主目錄
-m MODE 自行設定權限模式 (像chmod),而不是rwxr-xr-x
-o OWNER 自行設定所有者 (只適用於超級用戶)
-g GROUP 自行設定所屬組,而不是進程目前的所屬組
---------------注:install命令的作用是安裝或升級軟件或備份數據,它的使用權限是所有用戶