Bash Functions - Bash 460

Bash Functions – Bash 460

  • Post author:
  • Post category:IT / Bash
  • Post comments:0 Comments
  • Post last modified:2023-02-13

Bash Functions

函數本質上是一組可以多次調用的命令,目的是幫助使 Bash 腳本更具可讀性,避免重複編寫相同的程式碼,與大多數程式語言相比,Functions Bash 的功能有些受限,本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

./
   +- basics
       +- functions_test.sh

單元測試

Func Bash 提供宣告建立、傳回值、參數傳入等操作函數,預設變數是全域變數,因此方法內建議宣告為區域變數,避免彼此互相覆蓋。

testHelloWorld

建立一個 Function,以函數名稱開頭,後跟括號,這是首選及常用的格式。

testHelloWorld () {
    echo "Hello World"
}
Hello World

testBashWorld

建立一個 Function,以保留字 function 開頭,後跟函數名稱。

function testBashWorld {
    echo "Bash World"
}
Bash World

testLocalVariables

建立一個 Function,宣告區域變數,預設是全域變數。

name="Ruoxue"
amount=10
localVariables () {
    local name="RX"
    amount=20
    echo "inside: name: $name, amount: $amount"
}

testLocalVariables () {
    echo "before: name: $name, amount: $amount"
    localVariables
    echo "after: name: $name, amount: $amount"
    assertEquals "name" "Ruoxue" $name
    assertEquals "name" 20 $amount
}
before: name: Ruoxue, amount: 10
inside: name: RX, amount: 20
after: name: Ruoxue, amount: 20

testReturnValue

建立一個 Function,執行完後傳回值,但 Bash 函數不允許在調用時傳回值,當函數完成時,傳回值是函數中執行的最後一條語句的狀態,0 為成功, 1 – 255 範圍內為失敗,使用 return 關鍵字指定返回狀態,並將其分配給變數 $? 。

returnValue () {
    return 100
}

testReturnValue () {
    local expected=100
    returnValue
    local result=$?
    echo $result
    assertEquals "result" $expected $result
}
100

testReturnValueStdout

建立一個 Function,執行完後傳回值,從函數傳回值的另一個更好的選擇是 stdout ,使用 echo 或 printf 來完成傳回值。

returnValueStdout () {
    local result="Bash"
    echo $result
}

testReturnValueStdout () {
    local expected="Bash"
    local result="$(returnValueStdout)"
    echo $result
    assertEquals "result" $expected $result
}
Bash

testAdd

Bash Functions with Arguments 建立一個 Function,傳入多個參數,執行完後傳回值。

add () {
    local result=$(($1+$2))
    echo $result
}

testAdd () {
    local expected=3
    local result="$(add 1 2)"
    echo $result
    assertEquals "result" $expected $result
}
3

functions_test.sh

Bash Functions 新增單元測試,驗證是否符合預期。

#!/bin/bash

testHelloWorld () {
    echo "Hello World"
}

function testBashWorld {
    echo "Bash World"
}

name="Ruoxue"
amount=10
localVariables () {
    local name="RX"
    amount=20
    echo "inside: name: $name, amount: $amount"
}

testLocalVariables () {
    echo "before: name: $name, amount: $amount"
    localVariables
    echo "after: name: $name, amount: $amount"
    assertEquals "name" "Ruoxue" $name
    assertEquals "name" 20 $amount
}


returnValue () {
    return 100
}

testReturnValue () {
    local expected=100
    returnValue
    local result=$?
    echo $result
    assertEquals "result" $expected $result
}


returnValueStdout () {
    local result="Bash"
    echo $result
}

testReturnValueStdout () {
    local expected="Bash"
    local result="$(returnValueStdout)"
    echo $result
    assertEquals "result" $expected $result
}

add () {
    local result=$(($1+$2))
    echo $result
}

testAdd () {
    local expected=3
    local result="$(add 1 2)"
    echo $result
    assertEquals "result" $expected $result
}

# Load shunit2
. shunit2

心得分享

Bash Function Arguments 函數的設計,是用於執行特定操作的可重用程式碼,依照需求定義,在腳本中多次調用該函數,提供了 Function 操作範例,在應用上相當廣泛,熟悉 Functions Bash 常見的操作方式,可以減少冗長的程式碼,增加腳本的可讀性。

發佈留言