函數

創建函數

function name {
    commands
}

或者

name() {
    commands
}

函數返回值

返回值有多種形式。

使用 $?

表示函數最後一條命令的退出狀態碼。

echo $?

使用 return

#!/usr/bin/env bash

function double {
    echo "Double value"
    read -p "Enter a value:" value
    return $[ $value * 2 ]
}

double
echo "Result: $?"

本質係退出狀態碼,範圍 [0, 255],超出會對 256 取模。

使用標準輸出

#!/usr/bin/env bash

function double {
    read -p "Enter a value:" value
    echo $[ $value * 2 ]
}

result=$(double)
echo "Result: $result"

result 會保存函數中所有的標準輸出。

函數傳參

#!/usr/bin/env bash

function add {
    if [ $# -lt 2 ]; then
        echo "invalid params"
    else
        echo $[ $1 + $2 ]
    fi
}

result=$(add 1 2)
echo "Result: $result"

函數入面嘅 $#$1 同外層嘅參數相互獨立。

變量的作用域

函數外定義

邊度都可以訪問。

#!/usr/bin/env bash

soda=green
function foo {
    echo $soda
    soda=yellow
}
foo
echo $soda
green
yellow

函數內定義

#!/usr/bin/env bash

function foo {
    soda=green
}
# 函數未執行前無法訪問
echo $soda
foo
echo $soda
soda=yellow
echo $soda

green
yellow

使用 local

local 變量只喺函數內部生效,同外部重名變量相互獨立。

#!/usr/bin/env bash

soda=green
function foo {
    echo $soda
    local soda=yellow
    echo $soda
}
foo
echo $soda
green
yellow
green

變量是否被定義

可以使用參數展開的 + 標記

函數是否被定義

後面定義的同名函數會覆蓋前面定義同名函數,所以喺定義函數之前,可以先判斷一下。

declare -f FUNC_NAME

例如把函數寫喺 .bashrc 文件。

function sayhello() {
    echo "hello"
}
declare -f sayhello
echo $?

函數已定義,退出碼為 0,未定義,退出碼為 1。

if declare -f sayhello > /dev/null; then
  echo "sayhello is defined"
else
  echo "sayhello not defined"
fi