1、Shell函數shell
本教程目前爲止全部腳本都是從頭至尾執行。這樣作很好,但你也許已經注意到有些腳本段間互相重複。數組
shell容許將一組命令集或語句造成一個可用塊,這些塊稱爲shell函數。bash
shell中函數的定義格式以下:
函數
複製代碼代碼以下:spa
函數名(){
command1
command2
...
commandN
[ return value ]
}命令行
若是願意,可在函數名前加上關鍵字function,這取決於使用者。
code
代碼以下:orm
function 函數名(){
command1
command2
...
commandN
[ return value ]
}教程
函數返回值,能夠顯示增長return語句;若是不加,則將最後一條命令運行結果做爲返回值(通常爲0,若是執行失敗則返回錯誤代碼)。 return後跟數值(0-255)。遞歸
函數能夠放在同一個文件中做爲一段代碼,也能夠放在只包含函數的單獨文件中。函數沒必要包含不少語句或命令,甚至能夠只包含一個echo語句,這取決於使用者。
下面的例子定義了一個函數並進行調用:
複製代碼代碼以下:
#!/bin/bash demoFun(){ echo "This is your first shell function!" } echo "Function begin..." demoFun echo "Function end!"
輸出:
Function begin...
This is your first shell function!
Function end!
下面定義一個帶有return語句的函數:
複製代碼代碼以下:
#!/bin/bash funWithReturn(){ echo "The function is to get the sum of two numbers..." echo -n "Input first number: " read aNum echo -n "Input another number: " read anotherNum echo "The two numbers are $aNum and $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn echo "The sum of two numbers is $? !"
輸出相似下面:
The function is to get the sum of two numbers...
Input first number: 25
Input another number: 50
The two numbers are 25 and 50 !
The sum of two numbers is 75 !
函數返回值在調用該函數後經過 $? 來得到。
注意:全部函數在使用前必須定義。這意味着必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,纔可使用。調用函數僅使用其函數名便可。
2、Shell函數參數
在Shell中,調用函數時能夠向其傳遞參數。在函數體內部,經過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...
帶參數的函數示例:
複製代碼代碼以下:
#!/bin/bash funWithParam(){ echo "The value of the first parameter is $1 !" echo "The value of the second parameter is $2 !" echo "The value of the tenth parameter is $10 !" echo "The value of the tenth parameter is ${10} !" echo "The value of the eleventh parameter is ${11} !" echo "The amount of the parameters is $# !" echo "The string of the parameters is $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73
輸出:
The value of the first parameter is 1 !
The value of the second parameter is 2 !
The value of the tenth parameter is 10 !
The value of the tenth parameter is 34 !
The value of the eleventh parameter is 73 !
The amount of the parameters is 12 !
The string of the parameters is 1 2 3 4 5 6 7 8 9 34 73 !"
注意,$10 不能獲取第十個參數,獲取第十個參數須要${10}。當n>=10時,須要使用${n}來獲取參數
使用return命令
#!/bin/bash # testing the script function myfun { read -p "Enter a value:" value echo "double the value" return $[ $value * 2 ] } myfun echo "The new vlue is $?"
結果:
Enter a value:23
double the value
The new vlue is 46
(退出狀態的取值範圍是0到255,$?是最近已執行命令的退出狀態)
使用函數輸出,這種方法最靠譜了
看例子
#!/bin/bash # testing the script function myfun { read -p "Enter a value:" value echo $[ $value * 2 ] } result=`myfun` echo "The new vlue is $result"
(這樣就能很好的利用輸出結果了)
在函數中使用變量
向函數傳遞參數
#!/bin/bash # testing the script 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 "Just one number 10:"value=`addem 10` echo $value echo -n "No numbers:"value=`addem` echo $value echo -n "More than two numbers:"vaule=`addem 10 15 20` echo $value
結果:
Adding 10 and 15:25
Just one number 10:20
No numbers:-1
(由上述可知,#能夠獲得參數的個數,1表示第一個參數,$2表示第二個參數)
#!/bin/bash # testing the script function addem { if [ $# -eq 0 ]||[ $# -gt 2 ] then echo -1 elif [ $# -eq 1 ] then echo $[ $1 + $1 ] else echo $[ $1 + $2 ] fi }if [ $# -eq 2 ] then value=`addem $1 $2` echo "The value is $value"else echo "Usage:test1 a b"fi
(函數外面的#表示調用腳本使用的參數數,函數裏的#表示調用函數使用的參數數,注意這點區別)
做用域是變量的可見區域。
全局變量,在shell腳本內到處有效的變量。函數中定義全局變量,那麼主代碼中有效。主代碼中定義全局,函數中也有效。
默認狀況下,腳本中定義的變量都是全局變量。
看例子:
#!/bin/bash # testing the script function myfun { value=$[ $value * 2 ] } read -p "Enter a value:" value myfun echo "The new value is:$value"
(輸入45,獲得90,這裏的value在函數中發生變化了,到腳本中同樣可使用,並且已經變化了)
局部變量
做用範圍只在函數當中
關鍵字local
#!/bin/bash # testing the script function myfun { local value=$[ $value * 2 ] } read -p "Enter a value:" value myfun echo "The new value is:$value"
(輸入45,輸出45。由於加上local關鍵字以後,函數中的value是局部變量,與外界無關)
#!/bin/bash # testing the script function myfun { local value=$[ $value * 2 ] echo $value } read -p "Enter a value:" value result=`myfun` echo "The new value is:$value"echo "The result of the fun is $result"
(不過能夠經過輸出來獲取函數處理的結果,這裏的result仍是處理後的結果,好比輸入45,處理後是90)
數組變量與函數
#!/bin/bash # testing the script function addarray { local sum=0 local newarray newarray=(`echo "$@"`) for value in ${newarray[*]} do sum=$[ $sum + $value ] done echo $sum } myarray=(1 2 3 4 5) echo "The original array is :${myarray[*]}"arg=`echo ${myarray[*]}` result=`addarray $arg` echo "The result is $result"
結果:
The original array is :1 2 3 4 5
The result is 15
(數組參數傳入函數,函數獲取後,進行處理輸出。腳本將輸出結果打印)
#!/bin/bash # testing the script function addarray { local sum=0 local newarray newarray=(`echo "$@"`) for value in ${newarray[*]} do sum=$[ $sum + $value ] done echo ${newarray[*]} } myarray=(1 2 3 4 5) echo "The original array is :${myarray[*]}"arg=`echo ${myarray[*]}` result=`addarray $arg` echo "The result is $result"
(輸出數組)
函數遞歸
#!/bin/bash # testing the script 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"
(輸入5,輸出120。大環套小環,小環套更小,逐步執行。
咱們一步一步剖析
5輸入獲得5*4!
4又獲得4*3!
3又獲得3*2!
2又獲得2*1
由此獲得5*4*3*2*1也就是120
)
顯然單個腳本有助於減小輸入量,可是若是多個腳本碰巧使用一樣的函數又該怎樣?
建立庫
#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
#!/bin/bash # testing the script source ./myfuncs result=`addem 10 15` echo "The result is $result"
(經過source就能使用庫函數了)
#!/bin/bash
# testing the script
. ./myfuncs
result=`addem 10 15`
echo "The result is $result"
(或者點操做符,效果是同樣的)
在命令行中使用函數
[root@localhost shellscript]# function multem {
> echo [1 * $2 ]> }[root@localhost shellscript]# multem 2 510