Table of Contents
ToggleBash 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 常見的操作方式,可以減少冗長的程式碼,增加腳本的可讀性。