Unix/Linux - Shell 函式



在本章中,我們將詳細討論 Shell 函式。函式使您能夠將指令碼的整體功能分解成更小、更邏輯的子部分,然後可以在需要時呼叫它們來執行其各自的任務。

使用函式執行重複性任務是建立**程式碼重用**的絕佳方法。這是現代面向物件程式設計原則的重要組成部分。

Shell 函式類似於其他程式語言中的子程式、過程和函式。

建立函式

要宣告一個函式,只需使用以下語法:

function_name () { 
   list of commands
}

您的函式名稱為**function_name**,您將使用它從指令碼中的其他位置呼叫它。函式名後面必須跟括號,然後是括在大括號中的命令列表。

示例

以下示例演示了函式的使用:

#!/bin/sh

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

# Invoke your function
Hello

執行後,您將收到以下輸出:

$./test.sh
Hello World

向函式傳遞引數

您可以定義一個函式,該函式在呼叫函式時接受引數。這些引數將由**$1**、**$2**等表示。

以下是一個示例,我們傳遞兩個引數ZaraAli,然後我們在函式中捕獲並列印這些引數。

#!/bin/sh

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

# Invoke your function
Hello Zara Ali

執行後,您將收到以下結果:

$./test.sh
Hello World Zara Ali

從函式返回值

如果您從函式內部執行**exit**命令,其效果不僅是終止函式的執行,還會終止呼叫該函式的 Shell 程式的執行。

如果您只想終止函式的執行,則有一種方法可以退出已定義的函式。

根據情況,您可以使用**return**命令從函式返回任何值,其語法如下:

return code

這裡**code**可以是您選擇的任何內容,但顯然您應該選擇在整個指令碼的上下文中具有意義或有用的內容。

示例

以下函式返回一個值 10:

#!/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"

執行後,您將收到以下結果:

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

巢狀函式

函式的一個更有趣的特性是它們可以呼叫自身以及其他函式。呼叫自身的函式稱為**遞迴函式**。

以下示例演示了兩個函式的巢狀:

#!/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

執行後,您將收到以下結果:

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

從提示符呼叫函式

您可以將常用函式的定義放在您的**.profile**中。這些定義將在您登入時可用,您可以在命令提示符下使用它們。

或者,您可以將定義分組到一個檔案中,例如**test.sh**,然後透過鍵入以下內容在當前 Shell 中執行該檔案:

$. test.sh

這會將**test.sh**中定義的函式讀取並定義到當前 Shell 中,如下所示:

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

要從 Shell 中刪除函式的定義,請使用帶**.f**選項的unset命令。此命令還用於從 Shell 中刪除變數的定義。

$ unset -f function_name
廣告