歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> 《Linux命令行與shell腳本編程大全》創建函數

《Linux命令行與shell腳本編程大全》創建函數

日期:2017/3/1 14:51:17   编辑:SHELL編程
《Linux命令行與shell腳本編程大全》創建函數
基本的腳本函數 創建函數 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=($@) #重新組合為數組 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: "$@ 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,很多時候,這種方式可能更好一些。
Copyright © Linux教程網 All Rights Reserved