函數
Bash調用函數不會開啟新的子shell,會在現有的shell環境中執行該函數。
函數的文法形式:
function 函數名稱()
{
命令地區
}
函數名稱()
{
命令地區
}
function 函數名稱
{
命令地區
}
調用:函數名 參數1 參數2 ....
FUNCNAME變數,值的內容是函數名
取消函數定義:unset -f 函數名
return指令 $?傳回值
作用範圍:函數僅在定義的shell環境中有效,如果要傳遞函數給子shell環境使用,可使用內建命令export和-f選項:export -f 函數名
如果沒有特別設定變數的屬性,那麼在script中自訂的變數稱為全域變數,作用範圍在整個script檔案中
內建命令local,設定變數屬性為私人
主程式中,盡量不要用傳入函數的全域變數的值來控制函數執行後的程式流程
位置參數
含義
移動位置參數:shift n
指定位置參數:set命令
例子
#!/bin/bash
declare -i i=0
set 61 62 63 64 65 66 67 68 69 70
for p in $@
do
((i++))
echo "第 $i 個位置參數 \$$i=$p"
done
運用位置參數傳遞參數值給函數時,原有的位置參數會被儲存,其內含值不會受到影響
取用命令列的選項和參數:
getopts 選項行 選項變數
選項行由各選項的單一字元組成,getopts由命令列取得選項,把它放入選項變數中,如果該選項需要額外的參數,參數值會放入OPTARG變數中
例子
#!/bin/bash
while getopts u:ah opt
do
case $opt in
u)
echo "提供了選項u和參數:$OPTARG";;
a)
echo "提供了選項a";;
h)
echo "提供了選項h";;
*)
;;
esac
done
建立函數庫
遞迴函式
例子
#!/bin/bash
function factor_in () {
local tmp
local tmp1
tmp="$1"
if [ $tmp -eq 1 ] ; then
echo -n " 1 "
r=1
else
echo -n " $tmp * "
tmp1=$tmp
tmp=$(($tmp-1))
factor_in $tmp
r=$(($tmp*$r))
fi
}
if [ $# -ne 1 ] ; then
echo "使用方法:$0 正整數"
exit 1
fi
echo
echo -n $1"! = "
factor_in $1
echo -n "= $r"
echo
結果