8.17_Linux之bash shell腳本編程入門篇(三)之循環以及函數function的使用

bash shell腳本編程入門篇(三)之循環


什麼是循環執行?

    將某代碼段重複運行多次

    重複運行多少次:

        循環次數事先已知

        循環次數事先未知

    有進入條件和退出條件


相關命令:for, while, until,selet,


for命令的使用


作用:

    依次將列表中的元素賦值給“變量名”; 每次賦值後即執行一次循環體; 直到列表中的元素耗盡,循環結束


命令格式:

    for 變量名 in 列表; do

        循環體(正常執行的執行命令)

        語句1

        語句2

        語句3

        ...

    done


列表生成方式:

    (1) 直接給出列表

    (2) 整數列表:

        (a) {start..end}

        (b) $(seq[start [step]] end)

    (3) 返回列表的命令

        $(COMMAND)

    (4) 使用glob,如:*.sh

    (5) 變量引用;

        $@, $*


for命令示例1,利用for循環增加用戶user1-10

wKioL1e5K2CQr2OVAABK7RFTEdw813.png

for命令示例2,利用for循環顯示99乘法表

wKiom1e5LYLQDZneAABjkCvz4Ks683.png


while命令的使用


作用:

    while命令判斷CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件爲“true”,則執行一次循環;直到條件測試狀態爲“false”終止循環。

因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正

進入條件:CONDITION爲 true;

退出條件:CONDITION爲 false。


命令格式

    while CONDITION; do

        循環體

    done


while命令示例1,利用while求1..100之間的正整數之和

wKioL1e5O5LSGh2qAAA20DdK4kg027.png

while命令示例2,利用while求隨機10個數的最大值和最小值

wKioL1e5QYmAlq_2AAA9iJCBQSY305.png

while命令示例3,利用while輸出一個國際棋盤

wKioL1e5RgaSKFXYAABF-nITuoA539.png


until命令的使用


作用:

    同while,只是進入的條件相反。

進入條件:CONDITION 爲false

退出條件:CONDITION 爲true


命令格式:

    until CONDITION; do

        循環體

    done


until命令示例1,利用until隨機生成10以內的數字,實現猜字遊戲,提示比較大或小,相等則退出。

wKioL1e5Tw6zOIMLAABD-cSpVZQ815.png

until命令示例2,利用until打印99乘法表

wKiom1e5UGqQwiBEAABgUqIoWRU723.png


循環控制語句之continue使用

使用環境:用於循環體中

continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層爲第1層

    while CONDTIITON1; do

        CMD1

        ...

        if CONDITION2; then

        continue

        fi

        CMDn

        ...

    done


continue命令示例1;當循環符合5的時候,跳出當前循環,繼續下一個循環

wKiom1e5UcDw0Ph3AAAqjnVVdmc760.png

continue命令示例2;當循環符合當前條件的時候,跳出當前循環,繼續下一個循環

wKioL1e5Ufjh14dXAABD-cSpVZQ966.png


循環控制語句之break的使用

使用環境:用於循環體中

break [N]:提前結束第N層循環,最內層爲第1層

    while CONDTIITON1; do

        CMD1

        ...

        if CONDITION2; then

        break

        fi

        CMDn

        ...

    done


break命令示例1,當符合條件的時候,跳出當前循環,執行下一個echo的命令

wKiom1e5UuqAr8crAAA2zK3m_Os561.png

break命令示例2,當符合條件的時候,跳出當前循環,執行下一個echo的命令

wKiom1e5U9LyHTMhAAA0LoClVJE518.png


循環控制之無限循環(退出請按ctrl+c)

while無限循環:讓條件一直爲真,讓while進入無限循環

    while true; do

        循環體

    done


until無限循環:讓條件一直爲假,讓while進入無限循環

    until false; do

        循環體

    Done


while循環的特殊用法(遍歷文件的每一行)

while read line; do

    循環體

done < /PATH/FROM/SOMEFILE

依次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line


示例1,計算uid的和

wKioL1e5aBWT5eYxAAAzee9P7D4510.png

示例2

掃描/etc/passwd文件每一行,如發現GECOS字段爲空,則填充用戶名和單位電話爲62985600,並提示該用戶的GECOS信息修改成功。

wKiom1e5bISiXGgEAABRvXFhSJE569.png


for循環的特殊格式:雙小括號方法C語言風格的變量操作


for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式))

do

    循環體

done


雙小括號方法,即((…))格式,也可以用於算術運算

雙小括號方法也可以使bash Shell實現C語言風格的變量操作

    #I=10

    #((I++))


控制變量初始化:僅在運行到循環代碼段時執行一次

控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而後再做條件判斷


工作原理:按照符號的順序執行1-2-3-4,然後2-3-4-2-3-4-2這樣一直循環,

直到程序2的條件不符合,跳出循環。

wKiom1e5c0SRklo4AABtj4JLFxQ866.png


示例:利用for的雙小括號c語言風格打印1到10

wKiom1e5csnQsVZ2AAAtJPuiEqI484.png



select 循環與菜單

select variable in list;do

    循環體命令

done

select 循環主要用於創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,並顯示PS3 提示符,等待用戶輸入

用戶輸入菜單列表中的某個數字,執行相應的命令

用戶輸入被保存在內置變量REPLY 中。


select 是個無限循環,因此要記住用break 命令退出循環,或用exit 命令終止腳本。也可以按ctrl+c 退出循環。

select 經常和case 聯合使用

與for 循環類似,可以省略in list ,此時使用位置參量


select示例:

wKioL1e5jkvTha9EAABBGEax8N4380.png



函數function介紹  

  

1)函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。

2)它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。

3)函數和shell程序比較相似,區別在於:

    Shell程序在子Shell中運行

    而Shell函數在當前Shell中運行。因此在當前Shell中,函數可以對shell中變量進行修改


定義函數

函數由兩部分組成:函數名和函數體。

語法一:

function f_name{

...函數體...

}

語法二:

f_name() {

...函數體...

}


函數使用

函數的定義和使用:

    可在交互式環境下定義函數

    可將函數放在腳本文件中作爲它的一部分

    可放在只包含函數的單獨文件中

調用:函數只有被調用纔會執行;

    調用:給定函數名

    函數名出現的地方,會被自動替換爲函數代碼

函數的生命週期:被調用時創建,返回時終止


定義和使用function示例;定義一個兩數雙加的function

wKioL1e5khPB08NxAAAZ8mQo0zg539.png


函數返回值

函數有兩種返回值:

函數的執行結果返回值:

(1) 使用echo或printf命令進行輸出

(2) 函數體中調用命令的輸出結果

函數的退出狀態碼:

(1) 默認取決於函數中執行的最後一條命令的退出狀態碼

(2) 自定義退出狀態碼,其格式爲:

return 從函數中返回,用最後狀態命令決定返回值

return 0 無錯誤返回。

return 1-255 有錯誤返回


示例:自定義return返回值

wKioL1e5k1iTu5u3AABK6ilZ12Y441.png


交互式環境下定義和使用函數

示例:

abc() {

> ls-l

> }

定義該函數後,鍵入abc,其顯示結果同ls-l的作用相同。

該abc函數將一直保留到用戶從系統退出,或執行了如下所示的unset命令:unset abc

wKiom1e5lMeCLj9qAABltYm3BVY661.png

wKioL1e5lMeTnFyEAAAZrCBHEqs046.png


在腳本中定義及使用函數

函數在使用前必須定義,因此應將函數定義放在腳本開始部分,直至shell首次發現它後才能使用

調用函數僅使用其函數名即可。

示例:

wKiom1e5meaxkfBZAAA1rzjhJKY466.png


使用函數文件

可以將經常使用的函數存入函數文件,然後將函數文件載入shell。

文件名可任意選取,但最好與相關任務有某種聯繫。例如:functions.main

一旦函數文件載入shell,就可以在命令行或腳本中調用函數。可以使用set命令查看所有定義的函數,其輸出列表包括已經載入shell的所有函數。

若要改動函數,首先用unset命令從shell中刪除函數。改動完畢後,再重新載入此文件。


創建函數文件

函數文件示例:

wKioL1e5m_Gx3YcnAAAVnr6xRpw134.png


載入函數

函數文件已創建好後,要將它載入shell

定位函數文件並載入shell的格式:

. filename 或source filename

注意:此即<點> <空格> <文件名>

這裏的文件名要帶正確路徑

示例:上例中的函數,可使用如下命令:

source myFuntions.main


wKioL1e5nefQSVNHAAAX00LDg8I488.png


檢查載入函數

使用set命令檢查函數是否已載入。set命令將在shell中顯示所有的載入函數。

示例:

wKioL1e5nFai4xeuAAAYU8NKvNA408.png


執行shell函數

要執行函數,簡單地鍵入函數名即可:

示例:

wKiom1e5nlvz9wSUAAAPiay1xOI042.png


刪除shell函數

現在對函數做一些改動。首先刪除函數,使其對shell不可用。使用unset命令完成此功能.

命令格式爲:

unset function_name

再鍵入set命令,函數將不再顯示

示例:

wKiom1e5ntbxxQa3AAAg6D1hqLs607.png


函數參數

函數可以接受參數:

傳遞參數給函數:調用函數時,在函數名後面以空白分隔給定參數列表即可;例如“testfuncarg1 arg2 ...”

在函數體中當中,可使用$1, $2, ...調用這些參數;還可以使用$@, $*, $#等特殊變量

示例:

wKiom1e5n5zQb2Y9AAAkwEEAuBM375.png


函數變量

變量作用域:

環境變量:當前shell和子shell有效

本地變量:只在當前shell進程有效,爲執行腳本會啓動專用子shell進程;因此,本地變量的作用範圍是當前shell腳本程序文件,包括腳本中的函數。

局部變量:函數的生命週期;函數結束時變量被自動銷燬

注意:如果函數中有局部變量,如果其名稱同本地變量,使用局部變量。

在函數中定義局部變量的方法

local NAME=VALUE

示例:定義不同的變量

wKiom1e5pU3S_w7jAACAbjQv_nI223.png


函數遞歸實例

函數遞歸:

    函數直接或間接調用自身

    注意遞歸層數

遞歸實例:

階乘是基斯頓·卡曼於1808 年發明的運算符號,是數學術語

一個正整數的階乘(factorial)是所有小於及等於該數的正整數的積,並且有0的階乘爲1。自然數n的階乘寫作n!。

    n!=1×2×3×...×n。

    階乘亦可以遞歸方式定義:0!=1,n!=(n-1)!×n。

    n!=n(n-1)(n-2)...1

    n(n-1)! = n(n-1)(n-2)!


以5爲示例分析:

第一步:5x(fact (5-4))=5x(fact 4)

第二步:5x(4xfact3)

第三步:5x(4x(3xfact2))

第四步:5x(4x(3x(2xfact1)))

由於    fact1=1

所以    5x4x3x2x1=120

wKiom1e5qtbjlO7ZAAA8n6LQPgM723.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章