LinuxShell腳本——函數 摘要:本文主要學習了Shell中函數的定義和使用。 函數的定義 Shell函數的本質是一段可以重覆使用的腳本代碼,這段代碼被提前編寫好了,放在了指定的位置,使用時直接調取即可。 函數定義的語法 Shell函數定義的語法格式如下: 對各個部分的說明: 由 {} 包圍的 ...
LinuxShell腳本——函數
摘要:本文主要學習了Shell中函數的定義和使用。
函數的定義
Shell函數的本質是一段可以重覆使用的腳本代碼,這段代碼被提前編寫好了,放在了指定的位置,使用時直接調取即可。
函數定義的語法
Shell函數定義的語法格式如下:
1 function 函數名() { 2 命令 3 return 返回值 4 }
對各個部分的說明:
1 function:Shell中的關鍵字,專門用來定義函數。 2 return:Shell關鍵字,專門用在函數中返回一個值,這一部分可以寫也可以不寫。
由 {} 包圍的部分稱為函數體,調用一個函數,實際上就是執行函數體中的代碼。
函數定義的簡化寫法
函數定義時也可以不寫function關鍵字:
1 函數名() { 2 命令 3 return 返回值 4 }
如果寫了function關鍵字,也可以省略函數名後面的小括弧:
1 function 函數名 { 2 命令 3 return 返回值 4 }
函數調用
和其它編程語言不同的是,Shell函數在定義時不能指明參數,但是在調用時卻可以傳遞參數,並且給它傳遞什麼參數它就接收什麼參數。
Shell也不限制定義和調用的順序,你可以將定義放在調用的前面,也可以反過來,將定義放在調用的後面。
調用函數不傳遞參數
如果不傳遞參數,直接給出函數名字即可:
1 函數名
調用函數傳遞參數
如果傳遞參數,那麼多個參數之間以空格分隔:
1 函數名 參數1 參數2 參數3
函數的返回值
return關鍵字
在大部分編程語言中,返回值是指函數被調用之後,執行函數體中的代碼所得到的結果,這個結果就通過return語句返回。
但是Shell中的return語句表示的是函數的退出狀態:返回值為0表示函數執行成功了,返回值為非0表示函數執行出錯了。if、while、for等語句都是根據函數的退出狀態來判斷條件是否成立。
Shell函數的返回值只能是一個介於0~255之間的整數,其中只有0表示成功,其它值都表示失敗。
函數執行失敗時,可以根據返回值(退出狀態)來判斷具體出現了什麼錯誤,比如一個打開文件的函數,我們可以指定1表示文件不存在,2表示文件沒有讀取許可權,3表示文件類型不對。
如果函數體中沒有return語句,那麼使用預設的退出狀態,也就是最後一條命令的退出狀態。更加嚴謹的寫法為:
1 return $?
其中, $? 是一個特殊變數,用來獲取上一個命令的退出狀態,或者上一個函數的返回值。
獲取返回值
想得到函數的處理結果,有兩種解決方案:
1)藉助全局變數,將得到的結果賦值給全局變數。
2)在函數內部使用echo、printf命令將結果輸出,在函數外部使用 $() 或者 `` 捕獲結果。
使用舉例
1)藉助全局變數獲取返回值
這種方案的弊端是定義函數的同時還得額外定義一個全局變數,如果我們僅僅知道函數的名字,但是不知道全局變數的名字,那麼也是無法獲取結果的。
1 #!/bin/bash 2 sum=0 3 function doSum(){ 4 sum=$(($1+$2)) 5 return $? 6 } 7 if doSum 2 3 9 echo "sum = $sum" 10 else 11 echo "error" 12 fi
2)在函數內部使用echo輸出結果
使用 $() 捕獲echo的輸出結果,結果將不會輸出到終端上。除了 1 $() ,也可以使用 `` 來捕獲echo的輸出結果。
1 #!/bin/bash 2 function doSum(){ 3 echo $(($1+$2)) 4 return $? 5 } 6 sum=$(doSum 2 3) 7 echo "sum = $sum"