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

示例2

44.png

43.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)!

wKiom1e5qtbjlO7ZAAA8n6LQPgM723.png

原創文章,作者:~微風~,如若轉載,請注明出處:http://www.www58058.com/38690

(2)
~微風~~微風~
上一篇 2016-08-21 20:47
下一篇 2016-08-22 08:44

相關推薦

  • bash腳本之數組及字符串切片,登陸配置文件

    一,概述 數組(就是一堆變量的集合) 變量:存儲單個元素的內存空間 數組:存儲多個元素的連續的內存空間,相當于多個變量的集合/ 數組名和索引     索引:編號從0開始,屬于數值索引     注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,bash4.0版本之后…

    Linux干貨 2016-09-01
  • SHELL腳本編程之變量的種類

    變量 在進行腳本編程的時候,經常會使用到不同類型的變量,根據變量的生效范圍,可大致分為以下的幾類: 本地變量:生效范圍為當前shell進程,對當前shell之外的其他shell進程,包括當前shell進程的子shell進程都是無效的,它的作用域就是當前shell進程 環境變量:生效范圍是當前shell進程及其子進程 局部變量:生效范圍是當前shell進程中某…

    Linux干貨 2016-08-12
  • Linux文件目錄的權限

     Linux是多用戶多任務的分時操作系統,如果每個人都對文件和目錄都是隨便訪問的話,難么你的文件很有可能會被他人刪除或修改,從而丟失數據。為此系統對文件增加了權限的機制來防止這種事情的發生。對文件而言,用戶被分為三類:屬主(onwer)、屬組(group)、和其他(other)。常規的權限分為:讀(r readable)、寫(w writable)…

    Linux干貨 2016-08-07
  • 網絡分層基礎概念與TCP,IP協議解析

    網絡分層基礎概念:   與ISO的OSI網絡分層模型不同。網絡分層事實上的標準為TCP/IP 的網絡分層模型。   下圖是他們是他們之間的對應關系。   左邊為OSI網絡分層模型。右邊為TCP/IP的網絡分層模型。 網絡分層,是將一個大而復雜的網絡,拆分為多個層次,每個層次單獨完成自己的任務,多個層次再結合起來,完成一個復雜的通…

    2017-05-04
  • 路由器解析路由表

    1.定義——>選擇最佳路徑;他只完成發送到下一個路徑上就結束,任務到達就撤了(就像快遞員一樣,當他將物件發往到下一個目的地,那他的任務就結束了)2.分類:主機路由、網絡路由、默認路由3.每個路由記錄由四項主要組成部分目標地址:主機IP、網絡ID號、未知地址(0.0.0.0)子網掩碼接口interface:從哪個口發往目標地址 網…

    2017-09-05
  • 堡壘機-麒麟開源堡壘機 V 1.3 正式發布

    麒麟開源堡壘機團隊經過1個月的努力,發布V 1.3版本,本版本主要收集了5月開發的小功能,并且增加了大用戶量、大設備量,縱深目錄層級的優化支持,產品 V1.3  光盤主要新增功能如下(相對 V1.2光盤) 1.增加蘋果MAC OS系統客戶端的WEB訪問支持 2.增加CA認證支持,內置CA證書  3.增加ssh 公私鑰認證方式中,私鑰中有密…

    Linux干貨 2016-06-09
欧美性久久久久