bash的函數

    函數可以讓多條shell的命令組成語句塊,實現代碼重用和模塊化編程。讓我們在不用重複編寫一些腳本,下面讓我們來了解函數。


1,函數的簡介

函數在腳本中使用應先定義,聲明,再可以調用。

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

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

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

    Shell 程序在子Shell 中運行

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

函數一般放在一個文件中,單獨的函數文件只能在當前shell執行,不能在子shell執行,因此當我們要使用時可以用 . 或 source 來執行,它倆代表可以在當前shell執行。



2,函數編寫

函數由兩部分組成:函數名和函數體。(不換行的話兩條命令中間要加;)

語法一:

    function f_name {

        ... 函數體...

    }

語法二:

    f_name() {

        ... 函數體...

    }

創建函數文件

函數文件示例:

$cat functions.main

#!/bin/bash

#functions.main

findit()

{

    if [ $# -lt 1 ] ; then

        echo "Usage:findit file"

        return 1

    fi

    find / -name $1 –print

}

wKioL1e6_-egvCz_AAAHpVGanU0866.png-wh_50

wKioL1e6_-jzpNxOAAAILg4YA9k582.png-wh_50


載入函數

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

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

.  filename 或 source filename

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

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

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

$ . functions.main


檢查載入函數

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

示例:

$set

    findit=( )

{

    if [ $# -lt 1 ]; then

        echo "usage :findit file";

        return 1

    fi

    find / -name $1 -print

}

wKiom1e7A-nASFzTAAAZ-sbBu3c087.png-wh_50


執行shell 函數

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

示例:

    $findit groups

    /usr/bin/groups

    /usr/local/backups/groups.bak

wKiom1e7A3WRbJpNAAANbiOd5eA466.png-wh_50

刪除shell 函數

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

命令格式爲:

unset function_name

實例:

    $unset findit

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

wKiom1e7BEDwllsHAAALvYpuP7A409.png-wh_50

函數參數

函數可以接受參數:

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

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

函數變量

變量作用域:

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

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

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

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

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

local NAME=VALUE

wKiom1e7BaCRshf3AAAJDpmd-YI507.png-wh_50

wKioL1e7BaGiClPFAAAXuoan5Hc010.png-wh_50


3,函數的使用

函數的定義和使用:(函數要在調用之前就要聲明好)

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

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

    可放在只包含函數的單獨文件中(這只是一個普通的文件,沒有執行權限)

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

    調用:給定函數名

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

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

函數有兩種返回值:

函數的執行結果返回值:

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

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

函數的退出狀態碼:

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

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

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

    return 0 無錯誤返回。

    return 1-255 有錯誤 返回

return  函數返回狀態碼 (return:  退出前面函數,繼續執行後面的函數)(exit  退出整個函數)


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

示例:

$dir() {

> ls -l

> }

定義該函數後,若在$後面鍵入dir ,其顯示結果同ls -l的 的作用相同。

$dir

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

$ unset dir


在腳本中定義及使用函數

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

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

示例:

    $cat func1

    #!/bin/bash

    # func1

    hello()

    {

    echo "Hello there today's date is `date +%F`"

    }

    echo "now going to the function hello"

    hello

    echo "back from the function"


使用函數文件

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

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

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

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







4,函數遞歸:

函數直接或間接調用自身

注意遞歸層數

遞歸實例:

階乘是基斯頓·於 卡曼於 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)!

wKiom1e7AeXTaDOBAAAPGFLHEjY859.png-wh_50

wKioL1e7Aeahh4UQAAAJD9z_qhM686.png-wh_50






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