本文介紹 shell script 中變數的高階用法,包括參數解析候變數讀取。

1 Shell 自定義函式

除了 Shell 自帶命令之外,Shell 也支援自定義函式。好處是程式碼複用,方便修改。

[function] fun_name[()]
{
    echo $0
    echo $1
    [return x]
}
  • 函式名需要滿足變數名一樣的規則
  • 函式名前面的function關鍵字可要可不要,函式名後面的()可要可不要,{}是必要的
  • 最後的return x可要可以不要,如果沒有,就以最後一行命令的返回值作為整個函式的返回值,函式返回值只能是數字
  • 函式參數數目可以不確定,可以是任意多個

在函式內部,則用$0 $2$n 的方式來訪問變數。也可用$@$*的方式來表示所有命令。

fun_name arg1 arg2 arg3

2 參數傳遞解析

Shell 指令碼在執行時候可以傳遞參數,實現不同參數輸出不同結構。

bash xxx.sh arg1 arg2
變數含義
$n傳遞給指令碼或函式的參數,n是一個數字,表示從零開始第n個參數,第一個參數是$1
$0當前指令碼的檔名,shell script 第零個參數
$#傳遞給指令碼或函式的參數個數
$*傳遞給指令碼或函式的所有參數
$@傳遞給指令碼或函式的所有參數
$?上個命令的退出狀態,或函式的返回值
$$當前 Shell 行程 ID。對於 shell script,就是這些指令碼所在的行程 ID

$*$@都表示傳遞給函式或指令碼的所有參數。

  • 不被雙引號(” “)包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
  • 當它們被雙引號(” “)包含時:
    • "$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數
    • "$@" 會將各個參數分開,以"$1" "$2""$n" 的形式輸出所有參數

參數解析沒有順序,沒有 python argparse的位置參數和可選參數之分,得到的結果就是一個 list,所有的參數解析就是對 list 中結果進行匹配。其中帶有-和不帶有-的變數是不一樣的。

1 判斷命令是否有參數

if [ $# -lt 1 ];
then
echo "no arguments"
else
echo "has $# args"
fi

2 判斷命令是否帶有某個特定參數

j="-x"
for i in $@;
do
if [ $i = $j ];
then
echo "has $j"
fi
done

3 檔案包含

常常有這樣的需求,在一個檔案中定義了一個函式,要在另外一個檔案中呼叫。 此時用source或者.就可以了。

# funa in a.sh
funa {
     echo "funa"
}

b.sh中要呼叫a.shfuna,則是:

. a.sh
funa

總結

本文介紹了 Shell 中的函式定義和使用方式。