咱們繼續將bash腳本編程,回顧一下程序的執行流程,分別爲:shell
順序執行 選擇執行 循環執行
而對於循環執行來講,其分類涉及到如下幾種:編程
for, while, until
每一個循環都有執行條件和退出條件,這樣的話纔可以執行該循環,並且一旦進入以後也不可以無限期的循環,因此還要有退出條件,將循環結果用於其它代碼進行計算執行,而各個分類的進入循環和退出循環的條件是有所區別的。bash
進入條件: for:列表元素非空; while:條件測試結果爲"真"; until:條件測試結果爲"假"; 退出條件: for:列表元素遍歷完成; while:條件測試結果爲"假"; until:條件測試結果爲"真";
咱們今天來說一下循環的另外一個知識點,叫作循環控制語句,對於for循環來講,若是進入執行條件的話,列表元素不是空的就能夠了,而退出條件是條件列表中的元素遍歷完成則退出循環,而每一次的開始循環,都是在執行循環體中的代碼,循環體執行結束時則開始下一輪的循環,直到退出該循環。但循環控制語句能夠改變其默認的行爲,那麼循環控制語句就是在循環體當中用來控制循環執行行爲的這麼一個語句,它可以實現原本這一輪循環完成的時候,它可以提早可以進入下一輪循環,例如在循環體當中有十個語句,執行到第五個的時候中止執行該循環體,轉而從新進入下一輪測試,而這個控制咱們須要使用contunue
。ide
循環控制語句: contunue:提早結束本輪循環,而直接進入下一輪循環判斷;
以while循環爲例,那麼該控制語句的使用用法:測試
while CONDITION1; do COM1 ... if CONDITION2; then continue fi CMDn ... done
執行continue以後,COMDn以後的語句都不會在執行,所以,該循環則結束,它用於在循環體語句當中的中間的某一個位置。spa
break
的做用不是結束本輪循環,而是直接跳出並結束循環,它的用法和continue語句的格式同樣。日誌
break:提早跳出循環; while CONDITION1; do COMD1 ... if CONDITION2; then break fi CMDn ... done
和continue語句所不一樣的是,break能夠在任何一個位置上出現。
固然在使用break語句以前,咱們先說一下如何建立死循環,若是說咱們不知道要循環多少次的時候,這個時候咱們就須要建立一個永久可以符合條件的循環在運行,但一直死循環會形成對系統資源增長負擔,咱們可讓死循環每隔多長時間運行一次,使用sleep
命令可以緩解bash循環對進程能夠進行睡眠,而建立格式爲:code
建立死循環: while true; do 循環體 done
而sleep命令的用法爲:orm
sleep命令: sleep - delay for a specified amount of time sleep NUMBER
因爲沒有退出條件,因此這是死循環,但咱們不能看着它一直循環下去,咱們必須得讓它知足某個條件時必須讓其退出該循環去執行其它指令,那麼它的退出方式爲當某個條件知足時,可以讓循環體去執行break命令。進程
退出方式: 某個測試條件知足時,讓循環體執行break命令;
示例:每隔3秒鐘系統以上獲取已經登陸用戶的信息;其中,若是logstash用戶登陸了系統,則記錄於日誌中,並退出;
#!/bin/bash # while true; do if who | grep "^li\>" &> /dev/null; then echo "user li login." break fi sleep 3 echo "user li not login." done echo "$(date +"%F %T") li logged on." >> /tmp/user.log
while循環的特殊用法就是用來去遍歷文件,固然這個遍歷是遍歷文件的行,假如說要去遍歷該文件的每一行時,使用該機制是一個不錯的選擇,好比說咱們取得ID號爲偶數的用戶名,以及shell和用戶id。對於這個示例來說,咱們的特殊用法使用的是read
關鍵字,在這裏不用和用戶交互,後面跟上一個變量開始循環,使用輸入重定向來指定文件路徑。
while循環的特殊用法(遍歷文件的行): while read VARIABLE; do 循環體 done < /PATH/FROM/SOMEFILE
它所實現的功能爲:
依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將其賦值給VARIABLE變量;
示例:找出ID號爲偶數的用戶,顯示其用戶名、ID、及默認shell;
#!/bin/bash # while read line; do username=`echo $line | cut -d: -f1` userid=`echo $line | cut -d: -f3` usershell=`echo $line | cut -d: -f7` if [ $[$userid%2] -eq 0 ]; then echo "$username, $userid, $usershell" fi done < /etc/passwd
for
循環的特殊用法和while的循環遍歷也是同樣的,其該用法爲:
for循環的特殊用法: for ((控制變量初始化;條件判斷表達式;控制變量的修正語句));do 循環體 done
對於括號裏的條件來講,做爲控制變量初始化,是僅在循環代碼開始運行時只執行一次,而在控制變量的修正表達式是在每輪循環結束會先控制遍歷修正運算,然後在作條件判斷。
控制變量初始化:僅在循環代碼開始運行時執行一次; 控制變量的修正語句:每輪循環結束會先進行控制遍歷修正運算,然後在作條件判斷;
示例:求100之內全部正整數之和;
#!/bin/bash # declare -i sum=0 for ((i=1;i<=100;i++)); do let sum+=$i done echo "Sum: $sum"