天天看點

Bash腳本之函數定義和調用

把那些在腳本中重複出現并且沒有任何改變的代碼,封裝起來,在适當的場景中調用執行。程式員将這種被封裝起來的代碼稱為功能體,或者叫子產品,也稱為函數。這樣看來是不是和循環類似,循環也是為了友善去多次執行一堆代碼,而函數是将一堆代碼寫在一起,起一個名字,然後在需要這堆代碼的時候隻需要寫上函數的名字即可。在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>&gt; {</code>

<code>&gt; </code><code>echo</code> <code>"123"</code>

<code>&gt; }</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,如需轉載請自行聯系原作者

繼續閱讀