把那些在腳本中重複出現并且沒有任何改變的代碼,封裝起來,在适當的場景中調用執行。程式員将這種被封裝起來的代碼稱為功能體,或者叫子產品,也稱為函數。這樣看來是不是和循環類似,循環也是為了友善去多次執行一堆代碼,而函數是将一堆代碼寫在一起,起一個名字,然後在需要這堆代碼的時候隻需要寫上函數的名字即可。在shell腳本程式設計中,函數是由若幹條shell指令組成的語句塊,函數裡面的内容和shell程式形式上是一緻的。不同之處就是,shell代碼可以直接被執行,而函數中的内容,不能獨立執行,隻有被調用的時候才執行。比如:
<code>#!/bin/bash</code>
<code>out(){</code>
<code>echo</code> <code>"123"</code>
<code>}</code>
<code>[root@localhost class]</code><code># bash hanshu </code>
<code>[root@localhost class]</code><code>#</code>
在上面這個例子中,我在腳本中寫入了一個函數,但是沒有去調用它,是以在執行這個腳本後,沒有任何的輸出。接下來說一下如何去定義一個函數。
函數是由函數名稱和函數體(能夠實作獨立功能的shell語句塊)兩部分組成,格式為:
<code>function</code> <code>func_name {</code>
<code>函數體</code>
或者:
<code>func_name() {</code>
注意:函數名和()之間不能加空白字元
這兩種不同的定義方法都可以定義函數,不同點在于函數名字前的“function”這個指令,這個指令可有可無。定義函數不一定非得在腳本中定義,還可以在互動式環境下定義,比如在指令行中直接輸入函數名來定義,例如:
<code>[root@localhost class]</code><code># out()</code>
<code>> {</code>
<code>> </code><code>echo</code> <code>"123"</code>
<code>> }</code>
<code>[root@localhost class]</code><code># out</code>
<code>123</code>
在定義的時候,一個函數以“{”開始,以“}”結束,在定義完成後就可以直接使用名字來調用這個函數。可以使用“set”指令來檢視自己定義的和系統内已經存在的函數,使用unset指令可以撤銷已經定義的函數。值得注意的是在目前shell内定義的函數隻能在目前shell中使用,一旦關閉,那麼定義的函數就會消失。同理,在腳本中定義的函數會随着腳本的關閉而消失,比如:
<code>testEcho(){</code>
<code>echo</code> <code>"執行了show函數"</code>
<code>[root@localhost class]</code><code># bash testfunction </code>
<code>[root@localhost class]</code><code># testEcho</code>
<code>bash</code><code>: testEcho: 未找到指令...</code>
<code>[root@localhost class]</code><code># source testfunction </code>
<code>執行了show函數</code>
在這個例子中我們可以看到,當使用bash執行腳本之後在腳本内加載了“testEcho”這個函數但是随着這個腳本的關閉,再執行這個函數的時候就會報錯了,而之後我又使用了“source”指令來執行這個腳本之後,在目前shell内就可以使用腳本内定義的函數了。這是一種在目前shell中使用腳本内函數的方法。
像指令一樣,函數的執行也會有一個傳回值,分為以下兩種:
第一種是函數的執行結果的傳回值,例如在函數體中某些指令輸出的結果;
第二種是函數的狀态傳回值:
1.函數中最後一條指令的執行狀态傳回值;
2.自定義退出狀态碼:
<code>return</code> <code>[n]</code>
n:0-255 (1 2 127盡可能不使用)
0: 表示無錯誤傳回
1-255:有錯誤傳回
注意:跟其他程式設計語言一樣,隻要函數在執行時,遇到了return指令,不管函數中的指令語句是否全部執行完成,立刻退出函數。一個函數從被調用開始,直到遇到return指令或全部的語句執行完才終止。
在調用函數的時候我們也可以将一些參數傳入進去,方法是在調用函數的時候直接在函數名後頭寫上參數,使用空格隔開,比如:func_name arg1 arg2 ...。在函數體中,可以使用$1,$2,..等位置變量來調用外部調用此函數時為此函數提供的參數,和腳本一樣,還可以使用$*或$@的方式引用所有位置參數或者使用$#計算為函數傳遞的參數個數。舉例如下:
<code>echo</code> <code>$@</code>
<code>out a b c </code><code>#在這裡調用函數,并将“a b c ”作為參數傳到函數中</code>
<code>[root@localhost class]</code><code># bash funcdiaoyong</code>
<code>a b c</code>
本文轉自正經的青年51CTO部落格,原文連結: http://blog.51cto.com/11142243/1927827,如需轉載請自行聯系原作者