1. 程式人生 > >2018-6-19bash編程之循環

2018-6-19bash編程之循環

leg end mount 宋體 space not import 知識點 date

我們繼續將bash腳本編程,回顧一下程序的執行流程,分別為:

順序執行
選擇執行
循環執行

而對於循環執行來說,其分類涉及到以下幾種:

    for, while, until

每個循環都有執行條件和退出條件,這樣的話才能夠執行該循環,而且一旦進入之後也不能夠無限期的循環,所以還要有退出條件,將循環結果用於其它代碼進行計算執行,而各個分類的進入循環和退出循環的條件是有所區別的。

進入條件:
    for:列表元素非空;
    while:條件測試結果為"真";
    until:條件測試結果為"假";

退出條件:
    for:列表元素遍歷完成;
    while:條件測試結果為"假";
    until:條件測試結果為"真";

一、循環控制語句

1.1 contunue語句

我們今天來講一下循環的另一個知識點,叫做循環控制語句,對於for循環來說,如果進入執行條件的話,列表元素不是空的就可以了,而退出條件是條件列表中的元素遍歷完成則退出循環,而每一次的開始循環,都是在執行循環體中的代碼,循環體執行結束時則開始下一輪的循環,直到退出該循環。但循環控制語句可以改變其默認的行為,那麽循環控制語句就是在循環體當中用來控制循環執行行為的這麽一個語句,它能夠實現本來這一輪循環完成的時候,它能夠提前能夠進入下一輪循環,例如在循環體當中有十個語句,執行到第五個的時候停止執行該循環體,轉而重新進入下一輪測試,而這個控制我們需要使用contunue

循環控制語句:
    contunue:提前結束本輪循環,而直接進入下一輪循環判斷;

以while循環為例,那麽該控制語句的使用用法:

        while CONDITION1; do
            COM1
            ...
            if CONDITION2; then
                continue
            fi
            CMDn
            ...
        done

執行continue之後,COMDn之後的語句都不會在執行,因此,該循環則結束,它用於在循環體語句當中的中間的某一個位置。

1.2 break語句

break的作用不是結束本輪循環,而是直接跳出並結束循環,它的用法和continue語句的格式一樣。

    break:提前跳出循環;
        while CONDITION1; do
            COMD1
            ...
            if CONDITION2; then
                break
            fi
            CMDn
            ...
        done

和continue語句所不同的是,break可以在任何一個位置上出現。
當然在使用break語句之前,我們先說一下如何創建死循環,如果說我們不知道要循環多少次的時候,這個時候我們就需要創建一個永久能夠符合條件的循環在運行,但一直死循環會造成對系統資源增加負擔,我們可以讓死循環每隔多長時間運行一次,使用
sleep命令能夠緩解bash循環對進程可以進行睡眠,而創建格式為:

創建死循環:
    while true; do
        循環體
    done

而sleep命令的用法為:

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

二、循環的特殊用法

2.1 while循環的特殊用法

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

2.2 for循環的特殊用法

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"


2018-6-19bash編程之循環