Shell Script 函式
阿新 • • 發佈:2018-12-22
建立函式
有兩種格式可以用來在bash shell指令碼中建立函式
function name {
commands
}
name() {
commands
}
要在指令碼中使用函式,只需要像其他shell命令一樣,在行中指定函式名就行了。如果在函式被定義前使用函式,你會收到一條錯誤訊息。
#!/bin/bash
function func1 {
echo "This is an example of a function"
}
func1
echo "Now this is the end of the script"
返回值
bash shell會把函式當作一個小型指令碼,執行結束時會返回一個退出狀態碼。有3種不同的方法來為函式生成退出狀態碼。
-
預設退出狀態碼
預設情況下,函式的退出狀態碼是函式中最後一條命令返回的退出狀態碼。在函式執行結束後,可以用標準變數$?來確定函式的退出狀態碼。
#!/bin/bash func1() { echo "trying to display a non-existent file" ls -l badfile } func1 echo "The exit status is: $?" $ $ ./test4 trying to display a non-existent file ls: badfile: No such file or directory The exit status is: 1 #函式的退出狀態碼是1,這是因為函式中的最後一條命令沒有成功執行
但你無法知道函式中其他命令中是否成功執行。
func1() {
ls -l badfile
echo "This was a test of a bad command"
} #函式的退出狀態碼就是0,儘管其中有一條命令並沒有正常執行
-
return
使用return命令來退出函式並返回特定的退出狀態碼。return命令允許指定一個整數值來定義函式的退出狀態碼
#!/bin/bash function dbl { read -p "Enter a value: " value echo "doubling the value" return $[ $value * 2 ] #退出狀態碼必須是0~255 } dbl echo "The new value is $?" #,$?變數會返回執行的最後一條命令的退出狀態碼
-
函式輸出
正如可以將命令的輸出儲存到變數中一樣,你也可以對函式的輸出採用同樣的處理辦法。新函式會用echo語句來顯示計算的結果。該指令碼會獲取dbl函式的輸出,而不是檢視退出狀態碼。
function dbl {
read -p "Enter a value: " value
echo $[ $value * 2 ]
}
result=$(dbl)
在函式中使用變數
-
向函式傳遞引數
函式名會在$0變數中定義,函式命令列上的任何引數都會通過$1、$2等定義。也可以用特殊變數$#來判斷傳給函式的引數數目。
function addem {
if [ $# -eq 0 ] || [ $# -gt 2 ]
then
echo -1
elif [ $# -eq 1 ]
then
echo $[ $1 + $1 ]
else
echo $[ $1 + $2 ]
fi
}
echo -n "Adding 10 and 15: "
value=$(addem 10 15)
echo $value
echo -n "Let's try adding just one number: "
value=$(addem 10)
echo $value
echo -n "Now trying adding no numbers: "
value=$(addem)
echo $value
echo -n "Finally, try adding three numbers: "
value=$(addem 10 15 20)
echo $value
儘管函式也使用了$1和$2變數,但它們和指令碼主體中的$1和$2變數並不相同。要在函式中使用這些值,必須在呼叫函式時手動將它們傳過去。
function func7 {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ]
then
value=$(func7 $1 $2)
echo "The result is $value"
else
echo "Usage: badtest1 a b"
fi
-
全域性變數
全域性變數是在shell指令碼中任何地方都有效的變數。如果你在指令碼的主體部分定義了一個全域性變數,那麼可以在函式內讀取它的值。類似地,如果你在函式內定義了一個全域性變數,可以在指令碼的主體部分讀取它的值。
function dbl {
value=$[ $value * 2 ] #讀取函式外全域性
}
read -p "Enter a value: " value
dbl
echo "The new value is: $value" #讀取函式內全域性
-
區域性變數
local關鍵字保證了變數只侷限在該函式中。如果指令碼中在該函式之外有同樣名字的變數,那麼shell將會保持這兩個變數的值是分離的。
function func1 {
local temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
func1
echo "The result is $result"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
函式遞迴
function factorial {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1 - 1 ]
local result=$(factorial $temp)
echo $[ $result * $1 ]
fi
}
read -p "Enter value: " value
result=$(factorial $value)
echo "The factorial of $value is: $result"
$ ./test13
Enter value: 5
The factorial of 5 is: 120
$