1. 程式人生 > >shell指令碼--建立函式

shell指令碼--建立函式

轉自:http://www.2cto.com/os/201309/240741.html 主要是ubuntu格式   其他版本略有不同 基本的指令碼函式 建立函式 1.用function關鍵字,後面跟函式名 [plain]  function name {       commands   }   2.函式名後面跟空圓括號,標明正在定義一個函式 [plain]  name() {      commands   }   如果兩個函式的名稱相同,那麼後面的將會覆蓋前面的,而且不會有提示。 使用函式 使用函式名稱即可。必須先定義,再使用。 [plain]  #!/bin/bash   f1() {       echo "this is f1."   }   f1   function f1 {       echo "this is f1111."   }   f1   f2   f2() {       echo "this is f2."   }   這裡首先定義了f1,然後執行,然後又定義了一個f1,再執行。發現第二次執行的是新的f1函式。 接著呼叫f2,由於此時f2還沒有定義,所以會呼叫失敗。 [plain]  $ function_test    this is f1.   this is f1111.   ./function_test: line 12: f2: command not found   返回值 bash shell會把函式當做小型指令碼,執行結束時會返回一個退出狀態碼。 有三種方式生成函式退出狀態碼 預設退出狀態碼 預設情況下,函式的退出狀態碼是函式中最後一條命令返回的退出狀態碼 函式執行結束後,可以使用$?變數來決定函式的退出狀態碼 [plain]  #!/bin/bash   fun(){       ls nothing       echo $?       echo "done"   }   fun   echo "fun:$?"   由於ls找不到nothing檔案或者目錄,所以返回的狀態碼=2 但是fun函式最後的echo執行成功了,所以fun返回的狀態碼=0 [plain]  $ function_test    ls: cannot access nothing: No such file or directory   2   done   fun:0   使用函式預設退出狀態碼是很危險的…… 使用return命令 bash shell使用return命令退出函式並返回特定的退出狀態碼。 return命令允許指定一個整數值來定義函式的退出狀態碼 注意:函式一結束就取返回值,退出狀態碼必須在0-255之間。 使用函式輸出 可以將函式的輸出儲存到變數中,例如: result=`f1` bash shell不會將read讀取輸入的部分作為 STDOUT 在函式中使用變數 向函式傳遞引數 在指令碼中指定函式時,必須將引數和函式放在同一行 然後函式可以用引數環境變數來獲得引數值 在函式中處理變數 函式會用到全域性變數和區域性變數。 全域性變數 在指令碼中定義的所有變數均為全域性變數。 [plain]  #!/bin/bash   var=1   fun(){       echo "var:"$var       var2=2   }   fun   echo "var2:"$var2   輸出: [plain]  $ function_test    var:1   var2:2   區域性變數 函式內部任何變數都可以宣告為區域性變數,只需在變數前加local關鍵字即可。 在指令碼中定義的區域性變數,函式中是無法訪問的。 陣列變數和函式 向函式傳遞陣列引數 需要將陣列變數的值分解成單個值,然後作為函式引數使用。 在函式內部,可以將他們再組成一個數組。 [plain]  #!/bin/bash   array=(a b c d)   fun(){       newarray=([email protected]) #重新組合為陣列       echo "newarray is:"${newarray[*]} #列印陣列       echo "The 3rd element is:"${newarray[3]}   }   fun ${array[*]} #拆分成多個值傳入   輸出: [plain]  $ function_test    newarray is:a b c d   The 3rd element is:d   如果試圖將陣列當做一個引數傳遞給函式,那麼函式只會讀取陣列變數的第一個值。 [plain]  #!/bin/bash   array=(a b c d)   fun(){       echo "We have "$#" parameter(s)."       echo "They are: "
[email protected]
      echo "They are: "$*   }   fun $array   fun函式只認識陣列中的第一個元素 [plain]  $ function_test    We have 1 parameter(s).   They are: a   They are: a   從函式返回陣列 [plain]  #!/bin/bash   fun(){       local array=(a b c d)       echo ${array[*]}   }   array=(`fun`)   echo ${array[2]}   同返回普通字串類似,按順序echo輸出,然後放在圓括號裡面即可。 函式遞迴 還是以最簡單的求N的階乘為例: [plain]  #!/bin/bash   fun(){       local result=1;       if [ $1 -eq 1 ]       then           echo 1       else           result=$[$1 * `fun $[$1 - 1]`]           echo $result       fi   }   fun $1   沒有新的知識點,只是不太熟悉罷了 如果使用了``,那麼函式內的echo就不會輸出到STDOUT了,和上面其他的例子一樣。 建立庫 source命令可以在當前的shell上下文中執行命令,而不是建立一個新的shell來執行命令。可以用source命令來在shell指令碼中執行庫檔案指令碼。 source命令等同於點操作符(dot operator) 在一個名叫lib_test的檔案中定義一個plus函式 [plain]  #!/bin/bash   plus(){       if [ $# -ne 2 ]       then           echo "I need 2 numbers!"           return       fi       echo $[$1 + $2]   }   然後我們在另一個指令碼中使用它 [plain]  #!/bin/bash   . lib_test #指令碼路徑   plus $1 $2   使用方法很簡單,這樣就相當於把lib_test匯入到當前檔案中了 [plain]  $ function_test 4 5   9   在命令列上使用函式 在命令列上建立函式 由於在鍵入命令時shell就會解釋命令,所以可以在命令上直接定義函式。 [plain]  $ plus(){ echo $[$1 + $2]; }   $ plus 3 1   4   注意:要在花括號兩邊加空格,每條命令用分號隔開。 下面的方法看起來更實用一些,效果也更好 [plain]  $ plus(){   > echo $[$1 + $2]   > }   $ plus 4234 23   4257   無須分號和空格。 在.bashrc檔案中定義函式 可以直接在這裡定義函式,也可以使用source命令,匯入庫 注意,修改了.bashrc之後要重啟才能生效 如果不是每次開機都要執行,那我們還可以在shell中直接使用source,很多時候,這種方式可能更好一些。