shell編程之函數(shù)與數(shù)組的使用詳解
shell函數(shù)
函數(shù)的用法
Shell函數(shù)可用于存放一系列的指令。
在Shell腳本執(zhí)行的過過程中,函數(shù)被置于內(nèi)存中,每次調(diào)用函數(shù)時不需要從硬盤讀取,因此運(yùn)行的速度比較快。
在Shell編程中函數(shù)并非是必須的元素,但使用函數(shù)可以對程序進(jìn)行更好的組織。
將一些相對獨(dú)立的代碼變成函數(shù)女,可以提高程序可讀性與重用性,避免編寫大量重復(fù)代碼。
Shell函數(shù)定義的方法如下所示:
[function]函數(shù)名() { 命令序列 [return x] }
- "function"關(guān)鍵字表示定義一個函數(shù),可以省略;
- "{"符號表示函數(shù)執(zhí)行命令的入口,該符號可以與函數(shù)名同行t也可以在函數(shù)名下一行的句首;
- "}"符號表示函數(shù)體結(jié)束,兩個大括號之間{}是函數(shù)體;
- "命令序列"部分可以是任意的Shell命令,也可以調(diào)用其他函數(shù)
- "return"表示退出函數(shù)返回一個退出值,通過返回值判斷執(zhí)行是否成功,也可以使用exit終止整個Shell腳本。
倆個數(shù)求和
使用Shell腳本實現(xiàn)兩個數(shù)相加求和,通過定義函數(shù)的方式來完成。
sum函數(shù)內(nèi)部通過read命接收用戶分別輸入的兩個數(shù),然后做加法運(yùn)算,最后通過調(diào)用函數(shù)的方式來輸出兩個數(shù)的和。
[root@localhost ~]# vim sum. sh #!/bin/bash sum() { echo"請輸入第一個數(shù):" read num1 if![[[$num1 =~ ^[0-9]+$ ]]; then echo"輸入的第一個數(shù)不是有效的整數(shù),請重新運(yùn)行腳本并輸入正確的數(shù)字。" return 1 fi echo"請輸入第二個數(shù):" read num2echo"輸入的第一個數(shù)不是有效的整數(shù),請重新運(yùn)行腳本并輸入正確的數(shù)字。" return 1 fi echo"請輸入第二個數(shù):" read num2 if![[[ $num2 =~ ^[0-9]+$ ]]; then echo"輸入的第二個數(shù)不是有效的整數(shù),請重新運(yùn)行腳本并輸入正確的數(shù)字。" return 1 fi result=$((num1 + num2)) echo"兩數(shù)之和為:$result" sum
[root@localhost ~]# chmod +x sum.sh [root@localhost ~]# ./sum.sh 請輸入第一個數(shù):2 請輸入第二個數(shù):3 "你輸入的兩個數(shù)為:2和3." "兩個數(shù)的和為:5"
系統(tǒng)資源監(jiān)控并報警函數(shù)
該函數(shù)會定期監(jiān)控系統(tǒng)的CPU和內(nèi)存使用率,當(dāng)使用率超過設(shè)定的閾直時,會發(fā)送報警信息,這里簡單模擬為輸出到控制臺,實際應(yīng)用中可擴(kuò)展為發(fā)送郵件、短信等。
[root@localhost ~]# vim jiankong.sh #!/bin/bash #發(fā)送報警信息的函數(shù) send alert() { local message=$1 echo "ALERT: $message" } monitor_system_resources() { local cpu_threshold=$1 local mem_threshold=$2 local interval=$3 while true; do cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print$2+$4}') mem_usage=$(free | awk '/Mem/ {printf("%.2f",$3/$2 * 1((00)}. if(( $(echo "$cpu_usage > $cpu_threshold" | bc -1) )); then send_alert "CPU usage ($cpu_usage%)." fi if(( $(echo "$mem_usage > $mem_threshold" | bc-1) )); then send_alert "Memory usage ($mem_usage%)." fi sleep "$interval" done } monitor_system_resources 5 1 5
- 參數(shù)說明:函數(shù)接收三個參數(shù),分別是CPU使用率閾值、內(nèi)存使用率閾值以及監(jiān)控間隔時間(秒)。
- 循環(huán)監(jiān)控:使用whiletrue循環(huán)不斷監(jiān)控系統(tǒng)資源。通過 top和free命令獲取CPU和內(nèi)存使用率,使用bc命令進(jìn)行浮點(diǎn)數(shù)比較。
- 報警處理:當(dāng)使用率超過閾值時,調(diào)用send_alert函數(shù)發(fā)送報警信息。
函數(shù)變量的作用范圍
在編寫腳本時,有時需要將變量的值限定在函數(shù)內(nèi)部,可以通過內(nèi)置命令local來實現(xiàn)。函數(shù)內(nèi)部變量的使用,可以避免函數(shù)內(nèi)外同時出現(xiàn)同名變量對腳本結(jié)果的影響。
[root@localhost ~]# vim fun_scope.sh myfun () { local i i=8 echo $i } i=9 myfun echo $i
[root@localhost ~]# chmod +x fun_scope.sh [root@localhost ~]# ./fun_scope.sh 8 9
函數(shù)的參數(shù)
函數(shù)的參數(shù)的用法如下。
函數(shù)名稱 參數(shù)1 參數(shù)2 參數(shù)3.
在使用函數(shù)參數(shù)時,函數(shù)名稱在前參數(shù)在后,函數(shù)名和參數(shù)之間用空格分隔,可以有多個參數(shù),參數(shù)使用$1,$2,$3....的方式表達(dá)。
[root@localhost ~]# vim write_log.sh #!/bin/bash mydir="/data" outfile="${mydir}/my.log" [ -e "${mydir}" ] | mkdir -p ${mydir} appendfile() { echo "$2" >> "$1" } appendfile ${outfile} "first line content." appendfile ${outfile} "second line content."
[root@localhost ~]# chmod +x write_log.sh [root@localhost ~]# ./write_log.sh [root@localhost ~]# cat /data/my.log firstline content. second line content.
遞歸函數(shù)
Shell也可以實現(xiàn)遞歸函數(shù),就是可以調(diào)用自己本身的函數(shù)。
在Linux系統(tǒng)上編寫Shell腳本的時候,經(jīng)常需要遞歸遍歷系統(tǒng)的目錄,列出目錄下的文件和和目錄,逐層遞歸列出,并對這些層級關(guān)系進(jìn)行展示。
[root@localhost ~]# vim fun_recursion.sh #!/bin/bash traverse_directory() { local dir=$1 for item in "$dir"/*; do if [ -d "$item" ]; then echo "Directory: $item" traverse_directory "$item" elif [ -f "$item" ]; then echo "File: $item" fi done } traverse_directory "."
[root@localhost ~]# chmod +x fun_recursion.sh [root@localhost ~]# ./fun_recursion.sh
shell數(shù)組
在Shell腳本中,數(shù)組是一種常見的數(shù)據(jù)結(jié)構(gòu),Shell中的數(shù)組與Java、C、Python不同,只有維數(shù)組,沒有二維數(shù)組。
數(shù)組元素的大小與限制,也不需要事先定義。
Shell數(shù)組用括號()來表示,元素用空格分隔,元素的下標(biāo)與大部分編程語言類似從0開始.
- 方法一:
數(shù)組名=(value0value1value2...
- 方法二:
數(shù)組名=([0]=value [1]=value [2]=value...)
- 方法三:
列表名="valueevalue1value2."數(shù)組名=($列表名)
- 方法四:
數(shù)組名[0]="value"數(shù)組名[1]="value"數(shù)組名[2]="value
獲取數(shù)組的長度
獲取普通數(shù)組長度可以使用${#數(shù)組名[@]}或${#數(shù)組名[*]}這兩種語法效果一樣。
[root@localhost ~]# arr_number=(1 2 3 4 5) [root@localhost ~]# arr_length=${#arr_number[*]} [root@localhost ~]# echo $arr_length 5 [root@localhost ~]# arr_length_1=${#arr_number[@] [root@localhost ~]# echo $arr_length_1 5
讀取某下的標(biāo)賦值
在Shell編程里,你可以讀取數(shù)組中指定下標(biāo)的元素,也可以給指定下標(biāo)的數(shù)組元素賦值。
[root@localhost ~]# arr_index2=${arr_number[2]} [root@localhost ~]# echo $arr_index2 з
數(shù)組遍歷
在Shell編程里,數(shù)組遍歷指的是按順序訪問數(shù)組中的每一個元素,并對這些元素執(zhí)行特定操作的過程。
[root@localhost ~]# vim array_traverse.sh #!/bin/bash arr_number=(1 2 3 4 5) for i in ${arr_number[@]} do echo $i done
[root@localhost ~]# chmod +x array_traverse.sh [root@localhost ~]# ./array_traverse.sh 1 2 3 4 5
數(shù)組切片
數(shù)組切片是一種操作,用于從數(shù)組中提取出一部分連續(xù)的元素,形成一個新的數(shù)組,此存操作在不同的版本種存在差異。
[root@localhost ~]# arr=(1 2 3 4 5) [root@localhost ~]# echo ${arr[@]} 12345 [root@localhost ~]# echo ${arr[@]:0:2} 1 2 [root@localhost ~]# echo ${arr[@]:2:3} 3 4 5
數(shù)組替換
[root@localhost ~]# arr=(1 2 3 4 5) [root@localhost ~]# echo ${arr[@]/4/66} 1 2 3 66 5 [root@localhost ~]# echo ${arr[@]} 1 2 3 4 5 [root@localhost ~]# arr=(${arr[@]/4/66}) [root@localhost ~]# echo ${arr[@]} 1 2 3 66 5
數(shù)組刪除
- 刪除數(shù)組
[root@localhost ~]# arr=(1 2 3 4 5) [root@localhost ~]# unset arr
- 刪除單個元素
[root@localhost ~]# echo ${arr[*]} [root@localhost ~]# arr=(1 2 3 4 5) [root@localhost ~]# unset arr[2] [root@localhost ~]# echo ${arr[*]} 1 2 4 5
shell腳步調(diào)試
在shell腳本開發(fā)中,要注意把復(fù)雜的腳本簡單化,思路要清晰,分段。
除echo外,bash shell亦有相應(yīng)的參數(shù)可以調(diào)試腳本。
使用bash參數(shù)調(diào)試,語法為:
sh [-nvx] 腳本名
- -n:不會執(zhí)行該腳本,僅查詢腳本語法是否有問題,如果沒有語法問題就不顯示任何內(nèi)容,如果有問題會提示報錯。
- -V:在執(zhí)行腳本時,先將腳本的內(nèi)容輸出到屏幕上然后執(zhí)行腳本,如果有錯誤,也會給出錯誤提
- -x:將執(zhí)行的腳本內(nèi)容輸出到屏幕上,這個是對調(diào)試很有用的參數(shù)。
[root@localhost ~ vim test.sh #!/bin/bash set-x/ read-p"請輸入您的分?jǐn)?shù)(0-100):"GRADE if[$GRADE -ge 85 ] && [ $GRADE -le 100 ] then echo"$GRADE分!優(yōu)秀" elif [ $GRADE -ge 70 ] & [ $GRADE -1e 84 ] then echo"$GRADE分,合格"else echo"$GRADE分?不合格" fi set +x
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux系統(tǒng)中配置靜態(tài)IP地址的詳細(xì)步驟
本文詳細(xì)介紹了在Linux系統(tǒng)中配置靜態(tài)IP地址的五個步驟,包括打開終端、編輯網(wǎng)絡(luò)配置文件、配置IP地址、保存并重啟網(wǎng)絡(luò)服務(wù),這對于系統(tǒng)管理員和新手都極具參考價值,需要的朋友可以參考下2025-03-03CentOS6.3添加nginx系統(tǒng)服務(wù)的實例詳解
這篇文章主要介紹了CentOS6.3添加nginx系統(tǒng)服務(wù)的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10Linux 命令行通配符及轉(zhuǎn)義符的實現(xiàn)
這篇文章主要介紹了Linux 命令行通配符及轉(zhuǎn)義符的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11Linux下Apache安裝/增加mod_rewrite模塊的方法
如果你的apache已經(jīng)安裝好了,現(xiàn)在只想編譯出mod_rewrite.so模塊,在apache中進(jìn)行加載,下面我們就介紹這個方法。2011-04-04Centos7 安裝達(dá)夢數(shù)據(jù)庫的教程
這篇文章主要介紹了Centos7 安裝達(dá)夢數(shù)據(jù)庫的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12