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,就可以在命令行或腳本中調用函數??梢允褂胹et命令查看所有定義的函數,其輸出列表包括已經載入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
下一篇 2016-08-22

相關推薦

  • Linux軟件管理(rpm,yum)

    Linux的應用程序安裝提供了兩中格式的軟件包:一種是軟件開發者直接提供的源碼包;另一種是發行版廠商提供事先編譯好打包的軟件包;用戶需要根據需要來選擇何種方式安裝軟件,作為系統管理運維人員,要想合理應用,必須熟悉這兩者之間的內在聯系以及各自的特性和差異; *軟件包管理工具)   — RPM軟件包管理工具  — YUM軟件包前端管理工具 軟…

    Linux干貨 2016-08-29
  • Linux的終端類型

         序  終端的概念是由Ken Thompson提出的,是人機交互的接口。它是一種字符型設備,有多種類型,它大體上分為設備終端,物理終端,虛擬終端,圖形終端,串行終端,偽終端。 一、   設備終端  設備終端就是顯而易見的外在設備,比如鍵盤、鼠標和顯示器等。 二、&nbsp…

    Linux干貨 2016-10-19
  • 網絡班N22期第四周博客作業

    一、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 [root@bogon ~]# cp -r /etc/skel /home/tuser1 && chmod -R 60…

    Linux干貨 2016-09-05
  • 8.3-特殊權限(作業篇)

    1. 在/data/testdir里創建的新文件自動屬于g1組,組g2的成員如: alice能對這些新文件有讀寫權限,組g3的成員如: tom只能對新文件有讀權限,其它用戶(不屬于,g2,g3)不能訪問這個文件夾。 root@localhost ~]# mkdir -p /data/testdir [root…

    Linux干貨 2016-08-04
  • N26-第十三周

    1、建立samba共享,共享目錄為/data,要求:(描述完整的過程)  1)共享名為shared,工作組為magedu;  2)添加組develop,添加用戶gentoo,centos和ubuntu,其中gentoo和centos以develop為附加組,ubuntu不屬于develop組;密碼均為用戶名;  3)添加samb…

    Linux干貨 2017-06-01
  • 網絡及TCP三次握手四次揮手

    批處理應用程序 ????FTP 、TFTP 、庫存更新 ????無需直接人工交互 ????帶寬很重要,但并非關鍵性因素 交互式應用程序 ????庫存查詢、數據庫更新。 ????人機交互。 ????因為用戶需等待響應,所以響應時間很重要,但并非關鍵性因素,除非要等待很長時間。 實時應用程序 ????VoIP 、視頻 ????人與人的交互 ????端到端的延時至…

    2017-05-06
欧美性久久久久