函數(shù)允許你將一個(gè)腳本的整體功能分解成更小的邏輯子部分,然后當(dāng)需要的時(shí)候可以被調(diào)用來(lái)執(zhí)行它們各自的任務(wù)。
使用函數(shù)來(lái)執(zhí)行重復(fù)性的任務(wù)是一個(gè)創(chuàng)建代碼重用的很好的方式來(lái)。代碼重用是現(xiàn)代面向?qū)ο缶幊痰脑瓌t的重要組成部分。
Shell 函數(shù)類似于其他編程語(yǔ)言中的子程序和函數(shù)。
聲明一個(gè)函數(shù),只需使用以下語(yǔ)法:
function_name () {
list of commands
}
函數(shù)的名字是 function_name,在腳本的其它地方你可以用函數(shù)名調(diào)用它。函數(shù)名后必須加括號(hào),在其后加花括號(hào),其中包含了一系列的命令。
以下是使用函數(shù)的簡(jiǎn)單例子:
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World"
}
# Invoke your function
Hello
當(dāng)你想執(zhí)行上面的腳本時(shí),它會(huì)產(chǎn)生以下結(jié)果:
$./test.sh
Hello World
$
你可以定義一個(gè)函數(shù),在調(diào)用這些函數(shù)的時(shí)候可以接受傳遞的參數(shù)。這些參數(shù)可以由 $1,$2 等表示。
以下是一個(gè)例子,我們傳遞兩個(gè)參數(shù) Zara 和 Ali ,然后我們?cè)诤瘮?shù)中捕獲和編譯這些參數(shù)。
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World $1 $2"
}
# Invoke your function
Hello Zara Ali
這將產(chǎn)生以下結(jié)果:
$./test.sh
Hello World Zara Ali
$
如果你從一個(gè)函數(shù)內(nèi)部執(zhí)行一個(gè) exit 命令,不僅能終止函數(shù)的執(zhí)行,而且能夠終止調(diào)用該函數(shù)的 Shell 程序。
如果你只是想終止該函數(shù)的執(zhí)行,有一種方式可以跳出定義的函數(shù)。
根據(jù)實(shí)際情況,你可以使用 return 命令從你的函數(shù)返回任何值,其語(yǔ)法如下:
return code
這里的 code 可以是你選擇的任何東西,但很明顯,考慮到將腳本作為一個(gè)整體,你應(yīng)該選擇有意義的或有用的東西。
下面的函數(shù)返回一個(gè)值 1:
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World $1 $2"
return 10
}
# Invoke your function
Hello Zara Ali
# Capture value returnd by last command
ret=$?
echo "Return value is $ret"
這將產(chǎn)生以下結(jié)果:
$./test.sh
Hello World Zara Ali
Return value is 10
$
函數(shù)更有趣的功能之一就是他們可以調(diào)用本身以及調(diào)用其他函數(shù)。調(diào)用自身的函數(shù)被稱為遞歸函數(shù)。
下面簡(jiǎn)單的例子演示了兩個(gè)函數(shù)的嵌套:
#!/bin/sh
# Calling one function from another
number_one () {
echo "This is the first function speaking..."
number_two
}
number_two () {
echo "This is now the second function speaking..."
}
# Calling function one.
number_one
這將產(chǎn)生以下結(jié)果:
This is the first function speaking...
This is now the second function speaking...
你可以把常用函數(shù)的定義放置到文件 .profile 中,這樣當(dāng)你載入的時(shí)候可以得到它們并且在 prompt 命令中使用它們。
或者,你可以將多個(gè)函數(shù)定義在一個(gè)文件中,比如 test.sh,然后通過(guò)鍵入以下內(nèi)容當(dāng)前 Shell 中執(zhí)行該文件:
$. test.sh
這樣做可以使 test.sh 內(nèi)定義的任何函數(shù)被讀入,定義到當(dāng)前 Shell ,如下:
$ number_one
This is the first function speaking...
This is now the second function speaking...
$
要從 Shell 刪除函數(shù)的定義,你可以使用帶 .f
選項(xiàng)的 unset 命令。這也是用來(lái)刪除 Shell 中一個(gè)變量的定義的命令。
$unset .f function_name
更多建議: