shell指令碼基礎知識(下)

來源:互聯網
上載者:User

標籤: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指令碼基礎知識(下)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.