函數(shù)是代碼重用的最重要方式。Bash函數(shù)可以定義為一組命令,在bash腳本中多次調(diào)用。
bash函數(shù)使腳本更具可讀性,并避免一次又一次地編寫相同的代碼。它還允許開發(fā)人員將復(fù)雜而冗長的代碼分解為小部分,可以在需要時調(diào)用它們??梢噪S時重復(fù)調(diào)用函數(shù),這樣就能夠重用,優(yōu)化和最小化代碼。
1. 函數(shù)聲明
bash函數(shù)必須先聲明,然后才能使用它。函數(shù)的聲明有兩種格式:
# 第一種方法:以函數(shù)名稱開頭,后跟括號。
function_name () {
commands
}
# 第二種方法:以函數(shù)保留字開頭,后跟函數(shù)名稱。
function function_name {
commands
}
2. 函數(shù)參數(shù)
可以往bash函數(shù)中傳遞參數(shù)來處理數(shù)據(jù),只需要把要傳遞的數(shù)據(jù)放在調(diào)用的函數(shù)名稱之后,在函數(shù)名稱和參數(shù)之間使用空格,為了防止參數(shù)解析錯誤,建議在參數(shù)周圍使用雙引號。
給定的參數(shù)以$1,$2,$3,...$n的形式訪問,對應(yīng)于函數(shù)名后參數(shù)的位置。
$0變量的值是函數(shù)的名稱。
$#變量用于保存賦予函數(shù)的位置參數(shù)的數(shù)量。
*** 和**@ 變量用于保存賦予函數(shù)的所有參數(shù)。當(dāng)** * 與雙引號(即"** * ")一起使用時,它將擴(kuò)展為一個由空格分隔的字符串。例如,"$1 $2 n"等。當(dāng)@與雙引號(即"** @")一起使用時,它將擴(kuò)展為單獨的字符串。例如,"$1" "$2" "n"等。當(dāng)和*#不與雙引號一起使用時,它們都是相同的。
例子如下:
# The script is:
function_name () {
echo "the function is called"
echo '$0 is' $0
echo '$1 is' $1
echo '$2 is' $2
echo '$# is' $#
echo '$*' is $*
echo '$@' is $@
}
function_name first second third
# The result is:
the function is called
$0 is ./bash_ex.sh
$1 is first
$2 is second
$# is 3
$* is first second third
$@ is first second third
3. 函數(shù)返回值
Bash函數(shù)不提供在調(diào)用時返回值的支持,但是,它們允許設(shè)置返回狀態(tài),這種狀態(tài)類似于程序或命令如何以退出狀態(tài)退出。bash函數(shù)完成時,其返回值是函數(shù)中最后執(zhí)行的語句的狀態(tài)。對于成功狀態(tài),它將返回0,對于失敗,將返回1-255范圍內(nèi)的非零十進(jìn)制數(shù)。
可以使用關(guān)鍵字return指示返回狀態(tài),并將它分配給變量$?。return語句終止函數(shù)并用作函數(shù)的退出狀態(tài)。
例子如下:
# The script is:
func_return () {
echo "the function is called"
return 6
}
func_return
echo "func_return status: $?"
# The result is:
the function is called
func_return status: 6
從函數(shù)返回值的另一個更好的選擇是使用echo或printf命令將打印值發(fā)送到stdout,如下腳本代碼所示:
# The script is:
func_print () {
local it="Welcome!!!"
echo "$it"
}
my="$(func_print)"
echo $my
# The result is:
Welcome!!!
4. 變量的作用域
全局變量定義為可以在腳本內(nèi)的任意位置訪問的變量,而不管它的范圍如何。默認(rèn)情況下,所有變量都定義為全局變量,即使它們在函數(shù)內(nèi)部聲明也是如此。
還可以將變量創(chuàng)建為局部變量??梢允褂胠ocal關(guān)鍵字在函數(shù)體內(nèi)聲明局部變量。首次分配關(guān)鍵字時。
它們只能在該函數(shù)內(nèi)部訪問??梢栽诓煌暮瘮?shù)中創(chuàng)建具有相同名稱的局部變量。要添加局部變量,語法如下:
local var_name=< var_value >
例子如下:
# The script is:
v1='A'
v2='B'
test_local_var () {
local v1='C'
v2='D'
echo "test_local_var Function"
echo "v1 is $v1."
echo "v2 is $v2."
}
echo "Before Executing the Function"
echo "v1 is $v1."
echo "v2 is $v2."
test_local_var
echo "After Executing the Function"
echo "v1 is $v1."
echo "v2 is $v2."
# The result is:
Before Executing the Function
v1 is A.
v2 is B.
test_local_var Function
v1 is C.
v2 is D.
After Executing the Function
v1 is A.
v2 is D.
5. 覆蓋命令
可以通過創(chuàng)建與要覆蓋的命令同名的函數(shù)來覆蓋bash命令。例如,如果想覆蓋echo命令,那么只需要創(chuàng)建一個名稱為echo的函數(shù)即可。
覆蓋bash命令的概念在某些情況下可能會很有用,例如當(dāng)要使用帶有特定選項的命令時,或者當(dāng)我們不喜歡在腳本中多次為整個命令提供選項時。在這種情況下,可以將內(nèi)置bash命令覆蓋為帶選項的命令。
例子如下:
# The script is:
echo () {
builtin echo -n `date +"[%m-%d %H:%M:%S]"` ": "
builtin echo $1
}
echo "Welcome to Official Accounts"
# The result is:
[09-29 21:56:10] : Welcome to Official Accounts
從上面例子可以看出,echo輸出會附帶上時間信息。
-
Shell
+關(guān)注
關(guān)注
1文章
365瀏覽量
23354 -
bash終端
+關(guān)注
關(guān)注
0文章
7瀏覽量
1992
發(fā)布評論請先 登錄
相關(guān)推薦
評論