shell中函數類似於java中的方法,指令碼代碼放在函數中,可以任意位置運行減少大量重複代碼。
瞭解掌握shell函數主要從以下幾點:函數的建立、函數調用、變數、傳回值、參數。
1、函數建立以及調用。
基本結構:有兩種方式帶function和不帶function,
function hello (){}以及hello (){}
舉個例子:
#!/bin/shfunction hello(){ echo "this is a day : `date`"}echo '=======' helloecho '======='#執行結果=======this is a day : Fri Sep 28 11:56:00 CST 2012=======
需要注意的是:1、函數的建立一定在調用之前。2、函數名稱不要重複,否則先定義的會被覆蓋。
2、傳回值
首先說下預設退出狀態,在指令碼中用$?表示。表示:最後一次執行命令的退出狀態,0代表成功,非0代表失敗。
2.1、$?
#!/bin/shfunction hello(){ echo "this is a day : `date`" cd /qwer}echo "state:$?"echo '=======' hello echo "state: $?"echo '======='#執行結果:state:0=======this is a day : Fri Sep 28 12:12:31 CST 2012./fun.sh: line 5: cd: /qwer: No such file or directorystate: 1=======
如上所示:兩個$?分別0和1,對比來看下一個程式:
#!/bin/shfunction hello(){ echo "this is a day : `date`" cd /qwer}echo "state:$?"echo '=======' hello echo "test..test..." echo "state: $?"echo '======='#執行結果:state:0=======this is a day : Fri Sep 28 12:19:28 CST 2012./fun.sh: line 5: cd: /qwer: No such file or directorytest..test...state: 0=======
現在可以深刻理解$?的含義了,shell命令最後一次的執行狀態,當執行完函數後又執行了其他的命令,那麼$?就表示其他命令的執行狀態了。
關於$?還有一個好玩的:
#!/bin/shfunction hello(){ cd /qwer echo "this is a day : `date`"}echo "state:$?"echo '=======' hello echo "state: $?"echo '======='#執行結果:state:0=======./fun.sh: line 4: cd: /qwer: No such file or directorythis is a day : Fri Sep 28 12:26:43 CST 2012state: 0=======
好吧,預設退出狀態不太好用吧。
2.2、使用傳回值return
return只能返回單個的整數,對於字串指令碼會報錯。
看下面的程式。使用者輸入值和100比較,返回不同的值。
read -p "please input :" valuetest(){ if [ $value -lt 100 ] then echo "< 100 " return -1 elif [ $value -eq 100 ] then echo "= 100" return 0 else echo "> 100" return 1fi}testecho "result value is :$?"#執行結果:please input :999> 100result value is :1
即是return的傳回值由$?接受。
====================================
有一點很疑惑,如果在上述指令碼if語句的結束後,加上return 1000
最後程式的輸出,
please input :999
> 100
result value is :1
為什麼是1?有的時候是255,???
====================================
另外在一種方法就是使用函數的輸出。輸出可以被捕獲放入shell變數中。
ceo () {read -p "please input a value:" valueecho $[ $value * 2 ]}result=`ceo`echo "the result is : $result"#執行結果:please input a value:999the result is : 1998
注意接受的時候是result = `ceo`
====================================
還是上述指令碼,把輸出替換成:
echo $[ $vale ]
echo $[ $value * 2 ]
輸出變成了:the result is : 0
不明白?
====================================
3、參數的傳遞
shell指令碼函數參數的傳遞可以用標準參數環境變數表示。
如下指令碼:根據傳入參數個數不同,做不同輸出
#!/bin/shfunction param(){ if [ $# -lt 2 ] then echo "param count < 2" elif [ $# -gt 2 ] then echo "param count > 2 " else echo "param count =2" fi}param 1 2 3#執行結果:param count > 2
需要注意的是,函數不能直接使用指令碼的參數,函數為自己的參數使用專用的參數環境變數。
就是說在運行指令碼時候,用命令列傳入的參數函數是無法直接使用的,必須手動傳入才可以。
看下面的例子:
function useMainPram(){ echo "----" echo $1 echo $2 echo "----"}echo $1echo $2useMainPram#檔案命名為param.sh ./param.sh 98 99執行結果:9899--------
函數中的列印沒有值,調整指令碼中函數調用為:useMainPram $1 $2
同樣的執行命令,結果正確展示。
4、變數
變數主要是範圍的問題,在指令碼內(不是函數內部)定義的變數在任何地方都是可以用的,屬於全域變數。
函數內部可以定義局部變數用local修飾,範圍僅僅在函數內部。
b=100function tt(){ local b=10 result=$[$b + 5 ]}ttecho $resultecho $b#執行結果:15100
5、庫檔案
函數可以在指令碼內部使用,如果多個指令碼要使用同一個函數就要使用到庫檔案。
首先建立庫檔案,檔案名稱ku,注意是沒有尾碼名稱的:
function useMainPram(){ echo "----" echo $1 echo $2 echo "----"}
然後在指令檔中調用,指令碼命名param.sh:
. ./kuecho $1echo $2useMainPram $1 $2#執行結果 ./param.sh:9899----9899----
需要注意的是:引入庫檔案的格式
點後面有個空格,然後是執行庫檔案。
到這裡就差不多了,函數的基本操作就這些了。