如何在 Bash 中使用函式

Suraj Joshi 2023年1月30日 2020年9月26日
  1. 在 Bash 中定義函式
  2. Bash 中變數的作用域
  3. Bash 中函式的返回值
  4. 向 Bash 函式傳遞引數
如何在 Bash 中使用函式

函式是每個程式語言中最重要的一個方面,它使我們的程式碼具有可重用性和可讀性。重複使用的同一段程式碼就寫在函式裡面。而當我們需要程式碼塊時,我們只需呼叫定義的函式即可。

在 Bash 中定義函式

要在 Bash 中定義函式,我們可以使用以下兩種方法中的任何一種。

在這種方法中,我們寫下函式的名稱,後面加括號。然後,我們在大括號內定義函式。使用這種格式的函式可以使用任何一種格式來定義。

function_name(){
statements
}
function_name() { statements }

在這種方法中,我們在函式名稱前指定 function 關鍵字。

function_name(){
statements
}
function_name() { statements }

大括號內的語句決定了函式的作用。函式名與函式的作用無關,但我們必須使函式名具有描述性。定義函式不會有任何作用。要執行函式定義中的命令,我們必須呼叫函式。

要在 Bash 中呼叫函式,我們使用函式的名稱。

#! /bin/bash

greet(){
    echo 'Hello, Folks. Welcome to DelftStack!'
}

greet

輸出:

Hello, Folks. Welcome to DelftStack!

在這裡,我們在一開始就用 greet 這個名字定義函式,然後呼叫函式。當我們呼叫函式的時候,函式定義裡面的語句就會被執行,因此我們看到 Hello, Folks. Welcome to DelftStack! 在終端列印出來。

我們還可以使用另一種方法來定義函式:

#! /bin/bash

function greet(){
    echo 'Hello, Folks. Welcome to DelftStack!'
}

greet

輸出:

Hello, Folks. Welcome to DelftStack!

我們必須確保在呼叫函式之前,我們總是先定義函式。

Bash 中變數的作用域

在 Bash 中, 變數的作用域可以是全域性的, 也可以是區域性的. 然而, 變數的預設作用域總是全域性的, 即使它是在函式作用域內宣告的. 我們必須使用 local 關鍵字來使一個變數成為區域性變數。

#! /bin/bash

gvar1=1
gvar2=2

change_variables() {

    local gvar1=10
    gvar2=7
    
    echo "Inside Function: gvar1: $gvar1, gvar2: $gvar2"
}

echo "Before executing function: gvar1: $gvar1, gvar2: $gvar2"

change_variables

echo "After executing function: gvar1: $gvar1, gvar2: $gvar2"

輸出:

Before executing function: gvar1: 1, gvar2: 2
Inside Function: gvar1: 10, gvar2: 7
After executing function: gvar1: 1, gvar2: 7

在這裡,宣告在頂部的 gvar1gvar2 是全域性變數。

在函式內部,由於我們對 gvar1 使用了 local 關鍵字,所以 gvar1 被宣告為一個區域性變數,而 gvar2 仍然是一個全域性變數,因為它沒有 local 關鍵字。因此,gvar2 的值是由函式全域性改變的,而 gvar1 的值只在函式內部改變。

Bash 中函式的返回值

與其他程式語言相反,Bash 不允許我們從函式中返回值。Bash 函式返回的值是函式中最後一條語句的執行狀態。數字 0 代表成功,而從 1-255 代表失敗。我們可以用 return 關鍵字來指定函式的退出狀態。return 語句也會終止函式的執行。

#! /bin/bash

return_value(){
  echo "This function returns 20!"
  return 30
  echo "After return statement"
}

return_value
echo $?

輸出:

This function returns 20!
30

在這裡,我們可以看到,函式 return_value 使用 return 語句返回值 30,該值被分配到 $? 變數。

我們還可以注意到,在執行完 return 語句後,函式就終止了,因為 return 語句下面的命令不會被執行。

如果我們想從函式中返回某個值,我們可以將該值賦給一個全域性變數,然後從函式外部訪問該變數來檢索該值。

#! /bin/bash

send_message(){
  message_from_function="Hello From the function!"
}
send_message
echo $message_from_function

輸出:

Hello From the function!

在程式中,我們把要返回的值分配給全域性變數 message_from_function,然後訪問該變數的返回值。

向 Bash 函式傳遞引數

要將引數傳遞給一個 Bash 函式,我們只需將引數放在函式後面即可。如果我們想向一個函式傳遞多個引數,我們可以用空格將引數分開。為了避免引數的誤碼,我們可以用雙引號來包裹引數。

根據引數的位置用 $1$2 等方式訪問。$0 代表函式名稱,而 $# 則表示函式中位置引數的數量。

#! /bin/bash

send_message(){
  message_from_function="Hello $1 "
}
send_message
echo $message_from_function "Delft!"

輸出:

Hello Delft!

在這裡,引數 Delft!被傳入函式,並在函式中通過引數 $1 訪問,我們得到 Hello Delft!作為函式的最終輸出。

Author: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn