1. 程式人生 > >Shell Script 函式

Shell Script 函式

建立函式

有兩種格式可以用來在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
$