UNIX Shell函數(shù)

2018-12-09 15:44 更新

Shell函數(shù)

函數(shù)允許你將一個(gè)腳本的整體功能分解成更小的邏輯子部分,然后當(dāng)需要的時(shí)候可以被調(diào)用來(lái)執(zhí)行它們各自的任務(wù)。

使用函數(shù)來(lái)執(zhí)行重復(fù)性的任務(wù)是一個(gè)創(chuàng)建代碼重用的很好的方式來(lái)。代碼重用是現(xiàn)代面向?qū)ο缶幊痰脑瓌t的重要組成部分。

Shell 函數(shù)類似于其他編程語(yǔ)言中的子程序和函數(shù)。

創(chuàng)建函數(shù)

聲明一個(gè)函數(shù),只需使用以下語(yǔ)法:

    function_name () { 
       list of commands
    }

函數(shù)的名字是 function_name,在腳本的其它地方你可以用函數(shù)名調(diào)用它。函數(shù)名后必須加括號(hào),在其后加花括號(hào),其中包含了一系列的命令。

例子

以下是使用函數(shù)的簡(jiǎn)單例子:

    #!/bin/sh

    # Define your function here
    Hello () {
       echo "Hello World"
    }

    # Invoke your function
    Hello

當(dāng)你想執(zhí)行上面的腳本時(shí),它會(huì)產(chǎn)生以下結(jié)果:

    $./test.sh
    Hello World
    $

函數(shù)的參數(shù)傳遞

你可以定義一個(gè)函數(shù),在調(diào)用這些函數(shù)的時(shí)候可以接受傳遞的參數(shù)。這些參數(shù)可以由 $1,$2 等表示。

以下是一個(gè)例子,我們傳遞兩個(gè)參數(shù) ZaraAli ,然后我們?cè)诤瘮?shù)中捕獲和編譯這些參數(shù)。

    #!/bin/sh

    # Define your function here
    Hello () {
       echo "Hello World $1 $2"
    }

    # Invoke your function
    Hello Zara Ali

這將產(chǎn)生以下結(jié)果:

    $./test.sh
    Hello World Zara Ali
    $

函數(shù)返回值

如果你從一個(gè)函數(shù)內(nèi)部執(zhí)行一個(gè) exit 命令,不僅能終止函數(shù)的執(zhí)行,而且能夠終止調(diào)用該函數(shù)的 Shell 程序。

如果你只是想終止該函數(shù)的執(zhí)行,有一種方式可以跳出定義的函數(shù)。

根據(jù)實(shí)際情況,你可以使用 return 命令從你的函數(shù)返回任何值,其語(yǔ)法如下:

    return code

這里的 code 可以是你選擇的任何東西,但很明顯,考慮到將腳本作為一個(gè)整體,你應(yīng)該選擇有意義的或有用的東西。

例子

下面的函數(shù)返回一個(gè)值 1:

    #!/bin/sh

    # Define your function here
    Hello () {
       echo "Hello World $1 $2"
       return 10
    }

    # Invoke your function
    Hello Zara Ali

    # Capture value returnd by last command
    ret=$?

    echo "Return value is $ret"

這將產(chǎn)生以下結(jié)果:

    $./test.sh
    Hello World Zara Ali
    Return value is 10
    $

嵌套函數(shù)

函數(shù)更有趣的功能之一就是他們可以調(diào)用本身以及調(diào)用其他函數(shù)。調(diào)用自身的函數(shù)被稱為遞歸函數(shù)。

下面簡(jiǎn)單的例子演示了兩個(gè)函數(shù)的嵌套:

    #!/bin/sh

    # Calling one function from another
    number_one () {
       echo "This is the first function speaking..."
       number_two
    }

    number_two () {
       echo "This is now the second function speaking..."
    }

    # Calling function one.
    number_one

這將產(chǎn)生以下結(jié)果:

    This is the first function speaking...
    This is now the second function speaking...

從 Prompt 函數(shù)調(diào)用

你可以把常用函數(shù)的定義放置到文件 .profile 中,這樣當(dāng)你載入的時(shí)候可以得到它們并且在 prompt 命令中使用它們。

或者,你可以將多個(gè)函數(shù)定義在一個(gè)文件中,比如 test.sh,然后通過(guò)鍵入以下內(nèi)容當(dāng)前 Shell 中執(zhí)行該文件:

    $. test.sh

這樣做可以使 test.sh 內(nèi)定義的任何函數(shù)被讀入,定義到當(dāng)前 Shell ,如下:

    $ number_one
    This is the first function speaking...
    This is now the second function speaking...
    $

要從 Shell 刪除函數(shù)的定義,你可以使用帶 .f 選項(xiàng)的 unset 命令。這也是用來(lái)刪除 Shell 中一個(gè)變量的定義的命令。

    $unset .f function_name
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)