定義函數的格式:
name ()
{
command-list;
}
調用函數的格式:
name #省略括號
查看到所聲明的函數定義:
declare –f name
取消定義的函數,可以使用unset命令:
unset name
案例:
#!/bin/bash#定義函數PRintMsg用來輸出信息到終端屏幕,該函數至少需要兩個參數printMsg(){ #如果參數個數小于兩個,打印錯誤信息并且退出狀態為1 if [ $# -lt 2 ] then echo "printMsg() need 2 or more arguments..."#使用return語句退出函數的執行,并制定退出狀態return 1 fi #保存第一個參數值 PREFIX="$1" #在參數列表中去除第一個參數 shift #以參數1、參數2、參數3、參數4的形式打印出參數列表 echo "$PREFIX:$@" #函數執行到這里會以最后一個命令的退出狀態退出}#定義函數logMsg用來記錄信息到log文件,該函數至少可以接收一個參數logMsg(){ #判斷是否制定了參數的另一種方式,查看第一個參數是否為空 if [ -n "$1" ] then #如果參數不為空,把日期和參數列表輸出到log文件中echo "`date` $@" >> ./arguments.log else #如果參數為空,輸出錯誤信息并讓函數以退出狀態1返回 echo "logMsg() needs some arguments." return 1 fi}#通過兩個參數調用函數printMsg,如果函數以非零值退出,才會調用logMsg函數#由于指定了足夠的參數,printMsg函數會返回成功值0,所以logMsg不會被調用printMsg "From printMsg()" "it works..." "aabbcc" && logMsg "From logMsg()" "it works...."
注意:
1 如果定義的函數名與bash內建的命令相同,則這個函數會覆蓋內建命令。
本地變量:在函數內部所定義的變量只能在函數內部使用。變量前加了local。
全局變量:可以在腳本內任何地方使用。
解讀:為了程序不混亂,盡量使用本地變量,命名更具有描述性。
遞歸調用:函數調用本身。
案例:
#!/bin/bash#定義計算階乘的函數recursive,它接收一個參數recursive(){ #如果指定的參數為數字1,則直接返回結果1 if [ $1 - eq 1 ] then echo "1" #函數以狀態0返回 return 0 fi #定義本地變量TEMP,其中保存了參數值減1后的值 local TEMP=`expr $1 -1` #在recursive的函數體內遞歸調用函數recursive本身 #指定變量TEMP作為調用函數的參數 #使用命令替換的方式調用函數,就像執行一個普通命令一樣 local PREVIOUS=`recursive $TEMP` #把數值($1減1)的階乘計算結果和參數值$1相乘 #特殊字符星號*需要被引用,才能正確地傳遞給expr命令 RESULT=`expr $1 /* $PREVIOUS` #輸出數值$1的階乘計算結果 echo $RESULT #退出狀態0表示計算成功 return 0}#提示用戶輸入整數值做階乘運算,數值小于20是為了防止計算結果超出變量存儲范圍echo echo -n " Enter a number (<20) to do n! Operation (type "quit" to exit): "read INPUT#當用戶輸入字符串quit時,until循環結束,腳本退出until [ "$INPUT" = "quit" ]do #對輸入數據進行匹配 case $INPUT in #合法的輸入可以是1到9的個位數,或者是10到19的兩位數,還可以是20 [1-9]|[1][0-9]|20) #調用遞歸函數并保存計算結果OUTCOME=`recursive "$INPUT"`echo " After computing,$INPUT!=$OUTCOME"echo;; #對所有不合法的輸入進行匹配 *) echoecho " Not a valid number,Enter again!";; esac #為下一次階乘運算讀取用戶輸入的數據 echo -n " Enter a number(<20) to do n!operation (type "quit" to exit):" read INPUTdoneecho echo " Bye."exit 0
函數庫:指的是將通用的函數先定義好一個腳本,方便其他腳本調用。
注意:
1 不要以#!/bin/bash開始庫文件,同時給庫文件添加可執行權限
2 要在腳本文件的一開始執行庫文件
案例:
庫文件:
#!/bin/echo Warning:this is a library which should be sourced!#上面一行的作用是防止庫文件被意外執行#定義函數test_platform用來測試當前的操作系統test_platform(){ #在本地變量osname中保存當前的操作系統 local osname=`uname -s` #定義全局變量PLATFORM,并初始化為UNKOWN PLATFORM=UNKNOWN #根據當前的操作系統指定變量PLATFORM的值 case ${osname} in "FreeBSD" in PLATFORM="FREEBSD" ;;"SunOS" PLATFORM="SUNOS" ;;"linux" PLATFORM="LINUX" ;; esac return 0}
腳本:
#!/bin/bash#首先在腳本程序中包含進庫文件library.lib從而可以調用其中定義的函數source ./library.lib #調用函數庫中的函數test_platformtest_platform#輸出函數test_platform中定義的全局變量PLATFORMechoecho "Our running platform is $PLATFORM"exit 0
新聞熱點
疑難解答