本文介紹 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.sh的funa,則是:
. a.sh
funa
總結
本文介紹了 Shell 中的函式定義和使用方式。