函數可以讓多條shell的命令組成語句塊,實現代碼重用和模塊化編程。讓我們在不用重復編寫一些腳本,下面讓我們來了解函數。
1,函數的簡介
函數在腳本中使用應先定義,聲明,再可以調用。
函數function 是由若干條shell 命令組成的語句塊,實現代碼重用和模塊化編程。
函數與shell 程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell 程序的一部分。(pstree 查看進程 )
函數和shell 程序比較相似,區別在于:
Shell 程序在子Shell 中運行
而Shell 函數在當前Shell 中運行。因此在當前Shell 中,函數可以對shell中變量進行修改
函數一般放在一個文件中,單獨的函數文件只能在當前shell執行,不能在子shell執行,因此當我們要使用時可以用 . 或 source 來執行,它倆代表可以在當前shell執行。
2,函數編寫
函數由兩部分組成:函數名和函數體。(不換行的話兩條命令中間要加;)
語法一:
function f_name {
… 函數體…
}
語法二:
f_name() {
… 函數體…
}
創建函數文件
函數文件示例:
$cat functions.main
#!/bin/bash
#functions.main
findit()
{
if [ $# -lt 1 ] ; then
echo "Usage:findit file"
return 1
fi
find / -name $1 –print
}
載入函數
函數文件已創建好后,要將它載入shell
定位函數文件并載入shell 的格式:
. filename 或 source filename
注意:此即< 點> < 空格> < 文件名>
這里的文件名要帶正確路徑
示例:上例中的函數,可使用如下命令:
$ . functions.main
檢查載入函數
使用set 命令檢查函數是否已載入。set 命令將在shell 中顯示所有的載入函數 。
示例:
$set
findit=( )
{
if [ $# -lt 1 ]; then
echo "usage :findit file";
return 1
fi
find / -name $1 -print
}
執行shell 函數
要執行函數,簡單地鍵入函數名即可 :
示例:
$findit groups
/usr/bin/groups
/usr/local/backups/groups.bak
刪除shell 函數
現在對函數做一些改動。首先刪除函數,使其對shell不可用。使用unset命令完成此 功能.
命令格式為:
unset function_name
實例:
$unset findit
再鍵入set 命令,函數將不再顯示
函數參數
函數可以接受參數:
傳遞參數給函數:調用函數時,在函數名后面以空白分隔給定參數列表即可;例如“testfunc arg1 arg2 …”
在函數體中當中,可使用$1, $2, … 調用這些參數;還可以使用$@, $*, $# 等特殊變量
函數變量
變量作用域:
環境變量:當前shell 和子shell 有效
本地變量:只在當前shell 進程有效,為執行腳本會啟動專用子shell 進程;因此,本地變量的作用范圍是當前shell 腳本程序文件,包括腳本中的函數。
局部變量:函數的生命周期;函數結束時變量被自動銷毀
注意:如果 函數中有局部變量,如果其名稱同本地變量, 使用局部變量。
在函數中定義局部變量的方法
local NAME=VALUE
3,函數的使用
函數的定義和使用:(函數要在調用之前就要聲明好)
可在交互式環境下定義函數
可將函數放在腳本文件中作為它的一部分
可放在只包含函數的單獨文件中(這只是一個普通的文件,沒有執行權限)
調用:函數只有被調用才會執行;
調用:給定函數名
函數名出現的地方,會被自動替換為函數代碼
函數的生命周期:被調用時創建,返回時終止
函數有兩種返回值:
函數的執行結果返回值:
(1) 使用echo 或printf 命令進行輸出
(2) 函數體中調用命令的輸出結果
函數的退出狀態碼:
(1) 默認取決于函數中執行的最后一條命令的退出狀態碼
(2) 自定義退出狀態碼, 其格式為:
return 從函數中返回,用最后狀態命令決定返回值
return 0 無錯誤返回。
return 1-255 有錯誤 返回
return 函數返回狀態碼 (return: 退出前面函數,繼續執行后面的函數)(exit 退出整個函數)
交互式環境下定義和使用函數
示例:
$dir() {
> ls -l
> }
定義該函數后,若在$后面鍵入dir ,其顯示結果同ls -l的 的作用相同。
$dir
該dir 函數將一直保留到用戶從系統退出,或執行了如下所示的unset 命令:
$ unset dir
在腳本中定義及使用函數
函數在使用前必須定義,因此應將函數定義放在腳本開始部分,直至shell 首次發現它后才能使用
調用函數僅使用其函數名即可。
示例:
$cat func1
#!/bin/bash
# func1
hello()
{
echo "Hello there today's date is `date +%F`"
}
echo "now going to the function hello"
hello
echo "back from the function"
使用函數文件
可以將經常使用的函數存入函數文件,然后將函數文件載入shell。 。
文件名可任意選取,但最好與相關任務有某種聯系。例如:functions.main
一旦函數文件載入shell ,就可以在命令行或腳本中調用函數。可以使用set 命令查看所有定義的函數,其輸出列表包括已經載入shell 的所有函數。
若要改動函數,首先用unset 命令從shell 中刪除函數。改動完畢后,再重新載入此文件。
4,函數遞歸:
函數直接或間接調用自身
注意遞歸層數
遞歸實例:
階乘是基斯頓·于 卡曼于 1808 年發明的運算符號,是數學術語一個正整數的階乘(factorial )是所有小于及等于該數的正整數的積,并且有0 的階乘為1 。自然數n 的階乘寫作n!。
n!=1 ×2 ×3 ×… ×n。 。
階乘亦可以遞歸方式定義:0!=1 ,n!=(n-1)! ×n。 。
n!=n(n-1)(n-2)…1
n(n-1)! = n(n-1)(n-2)!
原創文章,作者:AN0519,如若轉載,請注明出處:http://www.www58058.com/39867