天天看點

Shell Script 函數建立函數傳回值在函數中使用變量函數遞歸函數庫在指令行上使用函數

目錄

建立函數

傳回值

預設退出狀态碼

return 

函數輸出

在函數中使用變量

向函數傳遞參數

全局變量

局部變量

函數遞歸

函數庫

在指令行上使用函數

在指令行上建立函數

在.bashrc 檔案中定義函數

建立函數

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

函數庫

bash shell允許建立函數庫檔案,然後在多個腳本中引用該庫檔案。第一步是建立一個包含腳本中所需函數的公用庫檔案

$ cat myfuncs
# my script functions
function addem {
echo $[ $1 + $2 ]
}
function multem {
echo $[ $1 * $2 ]
}
function divem {
if [ $2 -ne 0 ]
then
echo $[ $1 / $2 ]
else
echo -1
fi
}
$
           

source指令會在目前shell上下文中執行指令,而不是建立一個新shell。可以用source指令來在shell腳本中運作庫檔案腳本。這樣腳本就可以使用庫中的函數了。

source指令有個快捷的别名,稱作點操作符(dot operator)。要在shell腳本中運作myfuncs庫檔案,隻需添加下面這行:

. ./myfuncs 
           

這個例子假定myfuncs庫檔案和shell腳本位于同一目錄。如果不是,你需要使用相應路徑通路該檔案

$ cat test14
#!/bin/bash
# using functions defined in a library file
. ./myfuncs
[...]
           

在指令行上使用函數

  • 在指令行上建立函數

一種方法是采用單行方式定義函數。當在指令行上定義函數時,你必須記得在每個指令後面加個分号,這樣shell就能知道在哪裡是指令的起止了

$ function divem { echo $[ $1 / $2 ]; }
$ divem 100 5
20
$ function doubleit { read -p "Enter value: " value; echo $[
$value * 2 ]; }
$
$ doubleit
Enter value: 20
40
$
           

另一種方法是采用多行方式來定義函數。在定義時,bash shell會使用次提示符來提示輸入更多指令。

$ function multem {
> echo $[ $1 * $2 ]
> }
$ multem 2 5
10
$
           
  • 在.bashrc 檔案中定義函數

可以直接在主目錄下的.bashrc檔案中定義函數。許多Linux發行版已經在.bashrc檔案中定義了一些東西,是以注意不要誤删了。把你寫的函數放在檔案末尾就行了。

$ cat .bashrc
# .bashrc
# Source global definitions
if [ -r /etc/bashrc ]; then
. /etc/bashrc
fi
function addem {
echo $[ $1 + $2 ]
}
$
           

也可以用source指令(或者它的别名點操作符)将庫檔案中的函數添加到你的.bashrc腳本中

$ cat .bashrc
# .bashrc
# Source global definitions
if [ -r /etc/bashrc ]; then
    . /etc/bashrc
fi
. /home/rich/libraries/myfuncs
$
           

繼續閱讀