經過shell例子來學習循環結構的語法

心得: 所謂有用就是學會了一直在使用,不常常用叫沒多大用,忘記了就叫沒用。反過來想一想常常挨領導批的頗有多是領導對你有很大的指望。因此咱們學會的東西要常常用到實際中去纔是本身的東西。
其實學習的最好方法就是先接觸實際的東西,用實踐來驗證理論
寫腳本編寫要求證,能夠一邊測試一邊寫(中間最好有個輸出標記看到哪兒錯了)。
shell

下面的例子在林夕昱老師的視頻裏看到的,本身爲了練習在centos的系統下默寫下來了,多是剛學吧,老是寫下來執行後獲得好多提示(固然了這些提示是錯誤信息的了,不過對我這個初學者挺有幫助的,但願初學者看過林老師的視頻知道思路後必定要本身試着寫下來練習纔是)。在這裏想經過本身看過視頻後作個筆記吧,也是幫助本身更快進步。廢話不說了,看例子吧centos

example 1:該腳本是讓用戶輸入目錄,而後腳本會先判斷是否是目錄或爲空否,如是目錄會先列出目錄下的文件,而後一個一個判斷文件的類型,在判斷文件的權限。最後列出用戶輸入目錄下的文件的類型和權限。bash

  
  
  
  
  1. #!/bin/bash  
  2. #program:use for to display a directory's filetype and permission  
  3. #history:2013-02-20   ASK       first release  
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin  
  5. export PATH  
  6.  
  7. read -p "please you input a directory:" dir  
  8. if [ -z "$dir" -o ! -d "$dir" ]; then  
  9.         echo "you have input nothing or $dir is NOT a directory"  
  10.         exit 0  
  11. fi  
  12.         filen=`ls $dir`  
  13. for filename in $filen  
  14. do  
  15.         [ -c $dir/$filename ] &&  filetype="is character file" 
  16.         [ -p $dir/$filename ] &&  filetype="is PIPE file" 
  17.         [ -f $dir/$filename ] &&  filetype="is regular file" 
  18.         [ -L $dir/$filename ] &&  filetype="is link file" 
  19.         [ -S $dir/$filename ] &&  filetype="is sokkt file" 
  20.         [ -d $dir/$filename ] &&  filetype="is directory" 
  21.         [ -b $dir/$filename ] &&  filetype="is block file" 
  22.  
  23.         [ -r $dir/$filename ] &&  per="$per readable" 
  24.         [ -w $dir/$filename ] &&  per="$per writeable" 
  25.         [ -o $dir/$filename ] &&  per="$per executable" 
  26.         [ -u $dir/$filename ] &&  per="$per set UID" 
  27.         [ -g $dir/$filename ] &&  per="$per set GID" 
  28.         [ -k $dir/$filename ] &&  per="$per set Sticky bit" 
  29.  
  30. echo "this file $dir/$filename is  $filetype ,and permission is $per "  
  31.  
  32. filetype="" 
  33. per="" 
  34. done 

註釋:
第一行是該shell腳本運行的環境,能夠不用寫。運行環境不少,有/bin/awk -f的還有其餘的。
第二行是該腳本的信息說明幹什麼用的。通常shell腳本中以#開頭的都是註釋行,shell不會去執行的。
第三行也是腳本的一些信息,寫明日期和做者,還有版本信息。
第四行就是指該腳本運行的路徑了。好比腳本中的echo命令,這些命令通常要註明絕對路徑的。路經有好多寫明最主要的那個。
第五行就是使用export命令讓路徑在全局環境中生效了,而不只是當前用戶的當前shell環境。
**************以上的這幾行都是一些準備工做,不過最好養成好的習慣**************
第七行是使用read定義一個交互的變量。等待用戶輸入後read函數讀取屏幕的值,並付給dir變量。雙引號中的信息是出如今屏幕的提示信息。這個常常用到哦
*********************第八行到第十一行是一種簡單的if結構語句,當中括號中的條件爲真時執行第九行和第十行的程序段。該結構以if開頭和fi結尾。**************************
第八行是test的一個測試用例。test和中括號的做用同樣。能夠寫成test -z $dir形式。中括號中有兩個test命令模式,這兩個是或的關係用-o來表示。如能夠寫成 test -z $dir  || test -d $dir這樣的形式。-z是測試是否爲空,若是是空返回真,-d是測試是否爲目錄。若是不知道這個命令是否會獲得本身的答案是能夠在命令狀態下先試試好比我想獲得爲真能夠這樣測試 test -d  /root  && echo "this /root is a directory" || echo "this /root is NOT a directory"。若是屏幕輸出this /root is a directroy表示test爲真,由於兩個之間的關係是與的關係。相反屏幕輸出this /root is NOT a directory 說明||前面的爲假。由於||前面和||後面的關係是或的關係
第八行的意思是當輸入的目錄爲空或者不是目錄時執行第九和第十程序段。
第九行是當第八行爲真時執行的輸出雙引號裏的內容
第十行是退出腳本執行。
第十一行是if結構的結束標誌。
第十二行是賦值。把ls獲得的數據賦值給filen。這裏有個反引號(就是ESC鍵下方的波浪號的那個鍵)的做用是執行裏面的命令。須要記住的是和雙引號、單引號的區別。
***第十三行到第三十四行是for循環結構。第15到第21是判斷什麼文件類型的,第23到第28是判斷是權限的。這是一種for循環的結構。for中間都是以do開始的程序段以done結尾的。**
中間的就不說了,講講主要的一、第23到第28中per=$per……是說明權限不只僅是一種,所以要寫成這樣的格式進行累加。二、filetype和per最後又屢次一舉賦值爲空,是由於這些權限和類型再循環時是會累加的。

example 2:該腳本經過不一樣的循環來講明1-100的累加。好比for、while、until等。
先使用while。while是當條件爲真時執行do到done的程序段。爲假時退出程序段循環less

  
  
  
  
  1. #!/bin/bash  
  2. #program:use while to add 1 to 100  
  3. #history:2013-02-20   ASK       first release  
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin  
  5. export PATH  
  6.  
  7. i=0 
  8. s=0 
  9. while [ $i -lt 100 ]  
  10. do  
  11.         i=$(($i+1))  
  12.         s=$(($s+$i))  
  13. done  
  14. echo "1+2+3...+$i=$s" 

或者使用until。和while的區別是until當遇到條件爲真時退出當前循環。必定要和while分清
ide

  
  
  
  
  1. #!/bin/bash  
  2. #program:use until to add 1 to 100  
  3. #history:2013-02-20   ASK       first release  
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin  
  5. export PATH  
  6.  
  7. i=0 
  8. s=0 
  9. until [ $i -eq 100 ]  
  10. do  
  11.         i=$(($i+1))  
  12.         s=$(($s+$i))  
  13. done  
  14. echo "1+2+3...+$i=$s" 

或者使用for循環來執行 。
 函數

  
  
  
  
  1. #!/bin/bash  
  2. #program:use for to add 1 to 100  
  3. #history:2013-02-20   ASK       first release  
  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin  
  5. export PATH  
  6.  
  7. s=0 
  8. for((i=0;i<=100;i++))  
  9. do  
  10.         s=$(($s+$i))  
  11. done  
  12. echo "1+2+3...+$i=$s"  ######這行執行後會輸出1+2+3...+101=5050。這個101是和i++






 

註釋:
第一:先說說運算。運算的結構是$((  ))。好比a=$(($b+$c))意思就是把b和c的值相加賦給a。再如((num=2#11111111))這個是把8個1的二進制轉換爲十進制。也就是說雙左小括號((和雙又小括號))組成運算的格式。相乘的話就是a=$(($b*$c))。
第二:再說說這個eq、lt、gt等。記住e是等於、l是小於、g是大於就是了很好記住的。equal(等於)greater than(比..大於)less than (比 小於)。
第三:最後說說for的第二種格式也就是最後一個例子中說起的for((初始值;限制值;步長))格式。至於i++和++i的倒是有不一樣的本身能夠去網上看看。
回顧:
一、結構:if、for、while、until等以及各自的區別
二、測試和關係語句:test和[]、關係的處理 &&、||、!、-a、-o等等
三、賦值:read -p、直接賦值的、重複賦值的。
四、引號:單引號、雙引號、反引號等區別
 學習

相關文章
相關標籤/搜索