標籤:shell、基礎
七、shell中的case判斷
格式: case 變數名 in
value1)
command
;;
value2)
command
;;
*)
commond
;;
esac
在case程式中,可以在條件中使用|,表示或的意思, 比如:
2|3)
command
;;
當變數為2或者3時,執行該部分命令。
應用舉例:
[[email protected] shell]# cat test7.sh #!/bin/bashread -p "請輸入學生的成績: " numn1=`echo $num | sed ‘s/[0-9]//g‘` //判斷是否為數字if [ ! -z $n1 ]then echo "這不是一個數字請從新輸入!!"exit 1 fiif [[ $num -gt 100 || $num -lt 0 ]]then echo "學生的成績為0-100,請從新輸入!"exit 1elif [ $num -ge 90 ] && [ $num -le 100 ]then tag=1elif [ $num -ge 80 ] && [ $num -le 90 ]then tag=2elif [ $num -ge 70 ] && [ $num -le 80 ]then tag=3elif [ $num -ge 60 ] && [ $num -le 70 ]then tag=4else tag=5ficase $tag in 1) echo "優秀!";; 2) echo "良好!";; 3)echo "中等!";; 4)echo "萬歲!及格啦!";; 5)echo "抱歉!你不及格!還需要補考!";;esac[[email protected] shell]# sh test7.sh 請輸入學生的成績: 111學生的成績為0-100,請從新輸入![[email protected] shell]# sh test7.sh 請輸入學生的成績: dagfag這不是一個數字請從新輸入!![[email protected] shell]# sh test7.sh 請輸入學生的成績: 89良好!
通過上例可以看到case判斷的使用,雖然例子不是很好,但是比較全面的練習了if和case語句,在編寫時由於自己的馬虎在判斷句if [ ! -z $n1 ]中-z少寫了- 導致出現了錯誤,請大家引以為戒!
八、shell指令碼中的迴圈
1、for迴圈
文法結構: for 變數名 in 條件; do … done ;
應用舉例:
[[email protected] shell]# cat test8.sh #!/bin/bashread -p "請輸入一個數字:" nn1=`echo $n | sed ‘s/[0-9]//g‘`if [ ! -z $n1 ]then echo "請輸入數字!" exit 1fisum=0for i in `seq 1 $n`do sum=$(($i+$sum))done echo $sum
[[email protected] shell]# sh test8.sh -x請輸入一個數字:1055[[email protected] shell]# sh test8.sh -x請輸入一個數字:999499500[[email protected] shell]# sh test8.sh -x請輸入一個數字:999994999950000[[email protected] shell]# sh test8.sh -x請輸入一個數字:564575715937288874403
上例為手動輸入一個數計算其從0加到本身所得的總和並輸出,在加最後一個數時CPU運算了二十多秒,所以沒事還是不要這樣玩。
2、while 迴圈
文法結構: while 條件; do … done 死迴圈用 : 表示 ;
break直接結束本層迴圈; continue忽略continue之下的代碼,直接進行下一次迴圈 ;
exit 直接退出shell ;
應用舉例:
[[email protected] shell]# cat test9.sh #/bin/bashwhile :do load=`w|awk -F ‘load average: ‘ ‘{print$2}‘|cut -d. -f1` processor=`cat /proc/cpuinfo | grep ‘processor‘ | wc -l` if [ $load -lt $processor ] //注意為了能收到郵件我寫成小於,在長使用是用大於的 then top -bn1|mail -s " load is high: $load" XXXX@126.com else exit 0 fisleep 30done
上例是一個簡單的判斷伺服器是否過載,若過載則將資訊發送給126郵箱,並且是30秒一封,這個例子是簡單的通過指令碼監控系統的負載,若要更好的監控還是建議使用專業的監視軟體cacti/nagios/zabbix等工具。
[[email protected] shell]# cat test9.sh #/bin/bashwhile :do load=`w|awk -F ‘load average: ‘ ‘{print$2}‘|cut -d. -f1` processor=`cat /proc/cpuinfo | grep ‘processor‘ | wc -l` if [ $load -lt $processor ] //注意為了能收到郵件我寫成小於,在長使用是用大於的 then top -bn1|mail -s " load is high: $load" XXXX@126.com else exit 0 fisleep 30done
上例是簡單的介紹使用在while語句中用同continue和break跳出迴圈的區別,簡單的講:
break :結束並退出迴圈 。
continue :在迴圈中不執行continue下面的代碼,轉而進入下一輪迴圈
exit :退出指令碼, 常帶一個整數給系統,如 exit 0
return :在函數中將資料返回,或返回一個結果給調用函數的指令碼
九、shell函數
1、shell函數簡介
shell一個非常重要的特性是它可作為一種程式設計語言來使用。因為shell是一個解譯器,所以它不能對為它編寫的程式進行編譯,而是在每次從磁碟載入這些程式時對它們進行解釋。而程式的載入和解釋都是非常耗時的。針對此問題,許多shell(如BourneAgainShell)都包含shell函數,shell把這些函數放在記憶體中,這樣每次需要執行它們時就不必再從磁碟讀入。shell還以一種內部格式來存放這些函數,這樣就不必耗費大量的時間來解釋它們。
2、shell函數文法
函數由兩部分組成:函數標題、函數體。
標題是函數名。函數體是函數內的命令集合。標題名應該唯一;如果不是,將會混淆結果,因為指令碼在查看呼叫指令碼前將首先搜尋函數調用相應的s h e l l。
定義函數的格式為:
函數名()
{
命令1
. . .
}
或者
函數名(){
命令1
. . .
}
兩者方式都可行。如果願意,可在函數名前加上關鍵字f u n c t i o n,這取決於使用者。
f u n c t i o n 函數名()
{ ...
}
可以將函數看作是指令碼中的一段代碼,但是有一個主要區別。執行函數時,它保留當前s h e l l和記憶體資訊。此外如果執行或調用一個指令檔中的另一段代碼,將建立一個單獨的 s h e l l,因而去除所有原指令碼中定義的存在變數。 函數可以放在同一個檔案中作為一段代碼,也可以放在只包含函數的單獨檔案中。函數不必包含很多語句或命令,甚至可以只包含一個e c h o語句,這取決於使用者。參數返回,可以顯示加:return 返回,如果不加,將以最後一條命令運行結果,作為傳回值。 return後跟數值n(0-255)
3、shell函數應用舉例
查看ip地址的函數;輸入一個網卡名,輸出網卡對應的ip地址;
[[email protected] shell]# cat fun1.sh #/bin/bashread -p "請輸入網卡:" networkip () { ifconfig $network|head -2|tail -1|awk -F ‘:‘ ‘{print$2}‘|awk ‘{print$1}‘}case $network in eth*) echo "這是Ethernet網卡," ipaddr=`ip $network` echo "$network的IP是:$ipaddr" ;; lo) echo "這是迴環網卡" ipaddr=`ip $network` echo "$network的IP是:$ipaddr" ;; *) echo "你輸入的不正確,請從新輸入!" ;;esac
擴充學習:
select也是迴圈的一種,它比較適合用在使用者選擇的情況下。
比如,我們有一個這樣的需求,運行指令碼後,讓使用者去選擇數字,選擇1,會運行w命令,選擇2運行top命令,選擇3運行free命令,選擇4退出。
#!/bin/bashPS3="Please select a number: "echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"echoselect command in w top free quitdo case $command in w) w ;; top) top ;; free) free ;; quit) exit ;; *) echo "Please input a number:(1-4)." esacdone
[[email protected] shell]# sh select1.sh Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit1) w2) top3) free4) quitPlease select a number: 1 09:34:03 up 9:39, 2 users, load average: 0.00, 0.00, 0.00USER TTY FROM [email protected] IDLE JCPU PCPU WHATroot pts/0 192.168.1.104 00:22 0.00s 0.25s 0.00s sh select1.shroot pts/1 192.168.1.104 01:24 14:18 0.36s 0.36s -bashPlease select a number: 4
本文出自 “粗茶淡飯” 部落格,請務必保留此出處http://9950284.blog.51cto.com/9940284/1666054
shell指令碼基礎知識(下)