通過shell例子來學習循環結構的語法
心得: 所謂有用就是學會了一直在使用,不經常用叫沒多大用,忘記了就叫沒用。反過來想想經常挨領導批的很有可能是領導對你有很大的期望。所以我們學會的東西要經常用到實際中去才是自己的東西。
其實學習的最好方法就是先接觸實際的東西,用實踐來驗證理論。
寫腳本編寫要求證,可以一邊測試一邊寫(中間最好有個輸出標記看到哪兒錯了)。
下麵的例子在林夕昱老師的視頻裏看到的,自己為了練習在centos的係統下默寫下來了,可能是剛學吧,總是寫下來執行後得到好多提示(當然了這些提示是錯誤信息的了,不過對我這個初學者挺有幫助的,希望初學者看過林老師的視頻知道思路後一定要自己試著寫下來練習才是)。在這裏想通過自己看過視頻後做個筆記吧,也是幫助自己更快進步。廢話不說了,看例子吧
example 1:該腳本是讓用戶輸入目錄,然後腳本會先判斷是不是目錄或為空否,如是目錄會先列出目錄下的文件,然後一個一個判斷文件的類型,在判斷文件的權限。最後列出用戶輸入目錄下的文件的類型和權限。
- #!/bin/bash
- #program:use for to display a directory's filetype and permission
- #history:2013-02-20 ASK first release
- PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
- export PATH
- read -p "please you input a directory:" dir
- if [ -z "$dir" -o ! -d "$dir" ]; then
- echo "you have input nothing or $dir is NOT a directory"
- exit 0
- fi
- filen=`ls $dir`
- for filename in $filen
- do
- [ -c $dir/$filename ] && filetype="is character file"
- [ -p $dir/$filename ] && filetype="is PIPE file"
- [ -f $dir/$filename ] && filetype="is regular file"
- [ -L $dir/$filename ] && filetype="is link file"
- [ -S $dir/$filename ] && filetype="is sokkt file"
- [ -d $dir/$filename ] && filetype="is directory"
- [ -b $dir/$filename ] && filetype="is block file"
- [ -r $dir/$filename ] && per="$per readable"
- [ -w $dir/$filename ] && per="$per writeable"
- [ -o $dir/$filename ] && per="$per executable"
- [ -u $dir/$filename ] && per="$per set UID"
- [ -g $dir/$filename ] && per="$per set GID"
- [ -k $dir/$filename ] && per="$per set Sticky bit"
- echo "this file $dir/$filename is $filetype ,and permission is $per "
- filetype=""
- per=""
- 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結尾的。**
中間的就不說了,講講主要的1、第23到第28中per=$per……是說明權限不僅僅是一種,因此要寫成這樣的格式進行累加。2、filetype和per最後又多次一舉賦值為空,是因為這些權限和類型再循環時是會累加的。
example 2:該腳本通過不同的循環來說明1-100的累加。比如for、while、until等。
先使用while。while是當條件為真時執行do到done的程序段。為假時退出程序段循環。
- #!/bin/bash
- #program:use while to add 1 to 100
- #history:2013-02-20 ASK first release
- PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
- export PATH
- i=0
- s=0
- while [ $i -lt 100 ]
- do
- i=$(($i+1))
- s=$(($s+$i))
- done
- echo "1+2+3...+$i=$s"
或者使用until。和while的區別是until當遇到條件為真時退出當前循環。一定要和while分清
- #!/bin/bash
- #program:use until to add 1 to 100
- #history:2013-02-20 ASK first release
- PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
- export PATH
- i=0
- s=0
- until [ $i -eq 100 ]
- do
- i=$(($i+1))
- s=$(($s+$i))
- done
- echo "1+2+3...+$i=$s"
或者使用for循環來執行 。
- #!/bin/bash
- #program:use for to add 1 to 100
- #history:2013-02-20 ASK first release
- PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
- export PATH
- s=0
- for((i=0;i<=100;i++))
- do
- s=$(($s+$i))
- done
- 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的卻是有不同的自己可以去網上看看。
回顧:
1、結構:if、for、while、until等以及各自的區別
2、測試和關係語句:test和[]、關係的處理 &&、||、!、-a、-o等等
3、賦值:read -p、直接賦值的、重複賦值的。
4、引號:單引號、雙引號、反引號等區別
最後更新:2017-04-04 07:03:51