建立函數有2中格式:shell
function name { command }
name(){ command } #name後的圓括號爲空
直接引用函數名,函數定義必須在引用以前。函數名必須惟一,不然函數會被新的建立的同名函數覆蓋掉,而不會報錯。數組
bash shell會把函數當作小型腳本,運行結束時會返回一個退出狀態碼。有3中不一樣的方法生成退出狀態碼。bash
1)默認退出狀態碼ide
默認退出狀態碼是函數中最後一條命令返回的退出狀態碼。能夠用$?來查看。函數
2)使用return命令spa
bash shell使用return命令來退出函數並返回特定的退出狀態碼。命令行
但注意:函數一結束就取返回值;退出狀態碼必須在0~255之間。code
3)使用函數輸出遞歸
能夠將函數輸出保存到shell變量中,result=`functionname`three
#!/bin/bash #using the echo to return a value function db1 { read -p "Enter a value: " value #注意技巧 echo $[ $value * 2 ] } rusult=`db1` echo "The new value is $result"
函數用echo語句顯示計算結果。技巧:db1函數輸出了2條信息,read命令輸出了一條詢問用戶輸入值的消息。bash shell沒有將它做爲STDOUT輸出的一部分,而且忽略掉它。·
1)向函數傳遞參數
bash shell 會將函數當成小型腳本,意味着咱們能夠向函數傳遞參數,同腳本相似,函數也可使用標準的參數環境變量來表明命令行上傳給函數的參數。如$0表明函數名、$一、$2.等定義參數,$#表明參數數目。
在腳本中使用帶參函數時,函數和參數必須放在同一行,如:functionname 參數1 參數2...
注意:因爲函數使用特殊參數環境變量做爲本身的參數值,它不能直接從腳本的命令行獲取腳本的參數值。必須在調用函數時,手動將它們傳過去。
#!/bin/bash #trying to access script parameters inside a function function func1 { echo $ [ $1 * $2 ] } if [ $# -eq 2 ] then value=`func1 $1 $2` #此處注意。將腳本的參數傳遞給函數。。若改成value=`func1`沒法執行成功 echo "The result is $value" else echo "usage : sh1.sh a b" fi
2)在函數中處理變量——全局和局部
全局變量
全局變量在shell腳本中任何地方都有效,默認狀況下,在腳本中定義的任何變量都是全局變量。函數可使用全局變量,若函數改變了變量的值,這個值是有效的,函數外這個變量就變成了新值。
#!/bin/bash #test variables function func1 { temp=$[ $value + 5 ] result=$[ $temp * 2 ] } temp=4 value=6 func1 echo "the result is: $result" echo "the temp is: $temp" echo "the $value is: $value" 執行結果: the result is: 22 the temp is: 11 the $value is: 6 #能夠看到temp被函數func1賦予新值
局部變量
函數內部使用的變量能夠聲明爲局部變量:local 變量
也能夠在給變量賦值時使用local關鍵字。local關鍵字保證變量只侷限在函數中。
#!/bin/bash #test variables function func1 { local temp=$[ $value + 5 ] result=$[ $temp * 2 ] echo 「the local temp is: $temp" } temp=4 value=6 func1 echo "the result is: $result" echo "the temp is: $temp" echo "the $value is: $value" 執行結果: the local temp is: 11 #注意temp值,在函數內變化 the result is: 22 the temp is: 4 #注意temp值,在函數外沒有 the $value is: 6
與C語言中數組相似,數組是可以存儲多個值的變量,值可按單個值或整個數組來引用。值與值之間用空格分開。
數組定義:myarray=(one two three four five) 或者數字 myarrayn=(1 2 3 4 5 6 7)
echo $myarry 只顯示第一個數one echo ${myarry[2]} 顯示一個數 three echo ${myarry[*]} 顯示整個數組one two three four five
能夠用unset命令刪除數組中的某個值,注意:值刪掉了,但位置還在
$unset myarray[2] $echo ${myarray[*]} one two four five $echo ${myarray[2]} $echo ${myarray[3]} four
向函數傳遞數組時,必須使用functionname ${myarray[*]} 的方式傳遞,不能只寫數組名$myarray,不然只能傳遞第一個數。
在接收數組值以後,能夠在函數內重建數組,重建的數組任然能夠像其餘數組同樣使用。
#!/bin/bash #array variable test function testit { local newarray newarray=($@) #這幾種重建方式均可以newarray=(`echo "$@"`) local sum=0 for value in ${newarray[*]} do sum=$[ $sum + $value ] done echo $sum } wholearray=(1 2 3 4 5) echo "the original array is :${wholearray[*]}" result=`testit ${wholearray[*]}` #注意傳遞數組的全部值 echo "the result is $result" @lab403-1F:~/shell_script$ ./shell5.sh the original array is :1 2 3 4 5 the result is 15
就是在函數中構建數組,並從新返回給腳本。
#!/bin/bash #array variable test function testit { local newarray=$@ #此處不加括號,運行是不會報錯,由於newarray[$i]=$[ ${origarray[$i]} * 2 ]一句生成新的數組 local origarray=($@) #此處若省略括號origarray=$@,會把全部值賦給origarray[0],echo ${origarray[0]},會輸出1 2 3 4 5, #而echo ${origarray[1]}沒有值輸出,運行時出錯!!! n=$[ $# - 1 ] for (( i=0; i <= $n; i++ )) { newarray[$i]=$[ ${origarray[$i]} * 2 ] } echo ${newarray[*]} } wholearray=(1 2 3 4 5) echo "the original array is :${wholearray[*]}" result=`testit ${wholearray[*]}` echo "the result is ${result[*]}" 執行結果: yanfang@lab403-1F:~/shell_script$ ./shell5.sh the original array is :1 2 3 4 5 the result is 2 4 6 8 10
遞歸函數能夠遞歸的調用本身,不須要使用任何外部資源。一般遞歸函數都有一個最終能夠迭代到的基準值。計算階乘的函數爲例:
function factorial { if [ $1 -eq 1 ] then echo 1 else local temp=$[ $1 - 1 ] local result=`factorial temp` echo $[ $result * $1 ] fi }
能夠將多個腳本須要用函數寫在同一個文件中,並在腳本中引用,腳本中引用庫函數文件須要用source(.點操做符)命令。
注意:庫文件的路徑,若庫文件與腳本在同一目錄,能夠用source ./functions 或者 . ./fuanctions;
若庫文件與腳本不在同一目錄,則用絕對路徑: . /home/caishu/fuanctions
能夠把函數寫進 .bashrc文件(能夠是用戶的.bashrc,能夠是系統的),shell每次啓動都能從新載入的地方。
$ .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions #直接定義的函數 function addem { echo [[1 + $2 ] } #也能夠在這裏用source命令加函數庫 . /home/caishu/functions (重啓shell以後,新加入的函數就有效了)