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

}

函數  1.2.PNG

函數  1.PNG

載入函數

函數文件已創建好后,要將它載入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

}

函數set.PNG

執行shell 函數

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

示例:

    $findit groups

    /usr/bin/groups

    /usr/local/backups/groups.bak

函數.PNG

刪除shell 函數

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

命令格式為:

unset function_name

實例:

    $unset findit

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

函數unset.PNG

函數參數

函數可以接受參數:

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

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

函數變量

變量作用域:

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

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

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

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

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

local NAME=VALUE

bash 函數

bash 函數

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

bash 函數

bash 函數

原創文章,作者:AN0519,如若轉載,請注明出處:http://www.www58058.com/39867

(0)
AN0519AN0519
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • Linux文件系統

    Linux:glibc 程序編譯方式: 動態鏈接 靜態編譯 進程的類型: 終端:硬件設備,關聯一個用戶接口 與終端相關:通過終端啟動 與終端無關:操作引導啟動過程當中自動啟動 操作系統的組成: 靜態:kernel, application 文件系統:層級結構 FHS: Filesystem Hierarchy Standard /bin:所有用戶可用的基本命…

    Linux干貨 2016-11-10
  • 網絡N22期 第1周作業

    一、計算機組成及其功能 計算機由硬件部分和軟件部分組成。     硬件部分包括,         1、CPU:包括運算器、控制器、寄存器、緩存,具有對數據控制和計算功能。         2、存儲器:內部存儲器、外部存儲器,對數據提供存儲功能。   …

    Linux干貨 2016-08-15
  • Linux程序包管理(二)YUM使用

    YUM Linux程序包管理(二) 說完了程序包管理以及rpm的相關使用,接下來說說rpm的前端管理工具 YUM YUM是什么? &emsp;&emsp;&emsp;前面提到,yum是rpm程序包管理器的前端管理工具,那么yum到底是什么?又能做什么呢? YUM:yellow dog,Yellowdog Update Mod…

    Linux干貨 2016-06-01
  • N25期第七周作業

    創建一個10G分區,并格式為ext4文件系統   要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳 fdisk /dev/sdb # size 10G type 83 mke2fs -t ext4 -b 20…

    Linux干貨 2017-02-28
  • linux 路由配置及其網絡組配置實例

    linux 路由配置及其網絡組配置實例   §·路由配置 網絡簡單拓撲圖如下:   ※·實例要求:主機A可以ping同主機B即可。 ※·實驗步驟及其要點: 1.主機A設置IP地址與默認網關; 2.配置路由器1兩接口的IP地址,并開啟主機的路由功能,添加172.14.16.0路由條目; 3.配置路由器1兩接口的IP地址,并開啟主機的路由功能…

    Linux干貨 2016-09-06
  • Redis應用場景

    1.  MySql+Memcached架構的問題   實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據加載到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:   1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據…

    Linux干貨 2016-03-22
欧美性久久久久