本章內(nèi)容:
- 基本的腳本函數(shù)
- 返回值
- 在函數(shù)中使用變量
- 數(shù)組變量和函數(shù)
- 函數(shù)遞歸
- 創(chuàng)建庫
- 在命令行中使用函數(shù)
創(chuàng)建函數(shù)
有兩種格式可以用來在bash shell腳本中創(chuàng)建函數(shù)。第一種格式是采用關(guān)鍵字function,后跟分配給該代碼塊的函數(shù)名:
function name {
command
}
另一種格式:函數(shù)名后的圓括號為空惧眠,表明正在定義的是一個函數(shù)于个。
name() {
command
}
使用函數(shù)
#!/bin/bash
# using a function in a script
function func1{
echo "This is a example of a function"
}
count=1
while [ $count -le 5 ]
do
func1
count=$[ $count +1 ]
done
echo "This is the end of the loop"
func1
echo "Now this is the end of the script"
返回值
bash shell 會把函數(shù)當(dāng)做小型腳本厅篓,運(yùn)行結(jié)束時會返回一個退出狀態(tài)碼,有3種不同的方法來為函數(shù)生成退出狀態(tài)碼或链。
第一種方式:利用標(biāo)準(zhǔn)的$?
來決定函數(shù)的退出狀態(tài)碼档押,備注:$?
變量會返回執(zhí)行的最后一條命令的退出狀態(tài)碼,必須得緊跟在后面
#!/bin/bash
# testing the exit status of a function
func1() {
echo "trying to display a non-existent file"
ls -l badfile
}
echo "testing the function:"
func1
echo "The exit status is : $?"
第二種方式:使用return
命令 備注:退出狀態(tài)碼必須小于256叼耙,任何大于256的值都會返回一個錯誤值
#!/bin/bash
#using the return command in a function
function db1 {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2 ]
}
db1
echo "The new value is $?"
$./test5
Enter a vlaue:200
doubling the value
The new value is 1
$
第三種方式:使用函數(shù)輸出
正如同可以將命令的輸出保存到shell變量中一樣筛婉,也可以將函數(shù)的輸出保存到shell變量中革娄∶岬可以用這種技術(shù)來獲得任何類型的函數(shù)輸出安寺,并將其保存到變量中去:
result= `db1`
這個命令會將db1函數(shù)的輸出賦值給$result這個變量。
#!/bin/bash
#using the echo ri return a value
function db1 {
read -p "Enter a value: " value
echo $[ $value * 20 ]
}
result=`db1`
echo "The new value is $result"
$./tetst5
Enter a value: 200
The new value is 400
$
$./test5
Enter a value: 2000
The new value is 4000
$
向函數(shù)傳遞參數(shù)
#!/bin/bash
#passing parameters to a function
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 number: "
value=`addem`
echo $value
echo -n "Finally, try adding tree number: "
value=`addem 10 20 30`
echo $value
$./test6
Adding 10 and 15: 25
Let's try adding just one number: 20
Now trying adding no number: -1
Finally, try adding tree number: -1
$
由于函數(shù)使用特殊參數(shù)環(huán)境變量作為自己的參數(shù)值,它不能直接從腳本的命令行獲取傳遞給腳本的參數(shù)值迎捺。必須在調(diào)用函數(shù)是手動將它們傳過去。
#!/bin/bash
#trying to access script parameters inside a function
function func7 {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ]
then
value=`func7 $1 $2`
echo "The result is $value"
else
echo "The Usage: badtest1 a b"
fi
$
$./test7
The Usage: badtest1 a b
$./test7 10 15
The result is 150
$
在函數(shù)中處理變量
函數(shù)會用兩種類型的變量:
全局變量
-
局部變量
全局變量
是在shell腳本中任何地方都有效的變量抄沮。如果你在函數(shù)中定義了一個全局變量叛买,你可以在腳本的主體部分讀取它的值。默認(rèn)情況下刻伊,你在腳本中定義的任何變量都是全局變量椒功。在函數(shù)外定義的變量可以在函數(shù)內(nèi)正常訪問:
#!/bin/bash
#using a global variable to pass a value
function db1 {
value=$[ $value * 2 ]
}
read -p "Enter a value: " value
db1
echo "The new value is:$value"
#$value 變量是在函數(shù)外定義的动漾,并在函數(shù)外被賦值了。當(dāng)db1函數(shù)被調(diào)用時悦屏,變量及其值在函數(shù)中依然有效键思。如果變量在函數(shù)中被賦予了新的值,那么在腳本中引用該變量是看蚜,新值依然有效赔桌。
#!/bin/bash
#demonstrating a bad use of variables
function func1 {
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
$./badtest2
The result is 22
temp is larger
$
#由于$temp變量在函數(shù)中用到了疾党,它的值在腳本中使用,產(chǎn)生了一個意想不到的結(jié)果竭钝。此時如果需要避免這個問題雹洗,得需要使用局部變量
局部變量
在函數(shù)內(nèi)部使用的任何變量都可以被聲明稱局部變量,只要在變量聲明的前面加上local
關(guān)鍵字就可以了:
local temp
#local 關(guān)鍵字保證了變量只局限在該函數(shù)中庇茫。如果腳本中在該函數(shù)之外有同樣名稱的變量旦签,那么shell將會保持這兩個變量的值是分離的。那么你就能很輕松地讓函數(shù)變量和腳本變量分離開來咪惠,只共用想共用的:
#!/bin/bash
# demonstrating the local keyword
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
$
$./test9
The result is 22
temp is smaller
$
#現(xiàn)在在func1函數(shù)中使用$temp變量時淋淀,并不影響在主體腳本中賦給$temp變量的值
數(shù)組變量和函數(shù)
- 向函數(shù)傳數(shù)組參數(shù)
#!/bin/bash
#tring to pass an array variable
function testit {
echo "The parameters are: $@"
thisarray=$1
echo "The received array is ${thisarray[*]}
}
myarray=(1 2 3 4 5)
echo "The original array is : ${myarray[*]}"
testit $myarray
$./badtest3
The original arry is: 1 2 3 4 5
The parameters are: 1
./badtest3: thisarray[*]: bad array subscript
The received array is
$
#如果你試圖將該數(shù)組當(dāng)成一個函數(shù)參數(shù)朵纷,函數(shù)只會取數(shù)組變量的第一個值。
解決的方法鞋仍,你可以將所有的參數(shù)重組到新的數(shù)組變量中
#!/bin/bash
# array variable to function test
function testit {
local newarray
newarray=(`echo $@`)
echo "The new array value is: ${newarray[*]}"
}
myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}
$./test10
The original array is 1 2 3 4 5
The new array is 1 2 3 4 5
$
- 從函數(shù)返回數(shù)組
#!/bin/bash
#returning an array value
function arrayblr {
local origarray
local newarray
local elements
local i
origarray=(`echo $@`)
newarray=(`echo $@`)
elements=$( $# - 1 )
for (( i=0; i <= $elements; i++ ))
{
newarray[$i]=$[ ${origarray[$i] * 2} ]
}
echo ${newarray[*]}
}
myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=(`echo $arg1`)
echo "The newarray is $result[*]"
$
$./test12
The original array is: 1 2 3 4 5
The new array is: 2 4 6 8 10
- 函數(shù)遞歸
#!/bin/bash
#using recursion
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 a value: " value
result=`factorial $value`
echo "The factorial of $value is: $result"
- 創(chuàng)建庫
#my script functions
function addem {
echo $[ $1 + $2 ]
}
function multem {
echo $[ $1 * $2 ]
}
#!/bin/bash
#using a library file
source ./myfuncs
#. ./myfuncs source的快捷別名威创, 點操作符
value1=10
value2=5
result1=`addem $value1 $value2`
result2=`multem $value1 $value2`
echo "The result of addem them is: $result1"
echo "The result of multem them is: $result2"
$./test14
The result of addem them is: 15
The result of multem them is: 50
$