1、函數介紹
函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。
? 它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。
使用時, 在shell 中 source /path fo function_file,函數將保留至用戶退出,也可以使用 unset function_name ,撤銷函數
? 函數和shell程序比較相似,區別在于:
? Shell程序在子Shell中運行
? 而Shell函數在當前Shell中運行。因此在當前Shell中,函數可以對shell中變量進行修改
2、函數返回值
函數有兩種返回值:
? 函數的執行結果返回值:
(1) 使用echo或printf命令進行輸出
(2) 函數體中調用命令的輸出結果
? 函數的退出狀態碼:
(1) 默認取決于函數中執行的最后一條命令的退出狀態碼
(2) 自定義退出狀態碼, 其格式為:
return 從函數中返回,用最后狀態命令決定返回值
return 0 無錯誤返回。
return 1-255 有錯誤返回
3、在腳本中定義、使用函數
函數定義:
函數在使用前必須定義,因此應將函數定義放在腳本開始部分,
直至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中刪除函數。改動完畢后,再重新載入此文件
創建函數文件:
函數文件示例:
$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
執行函數:
要執行函數,簡單地鍵入函數名即可:
? 示例:
$findit groups
/usr/bin/groups
/usr/local/backups/groups.bak
刪除函數:
現在對函數做一些改動。首先刪除函數,使其對shell不可用。使用unset命令完成此功能.
? 命令格式為:
? unset function_name
? 實例:
$unset findit
再鍵入set命令,函數將不再顯示
函數參數:
函數可以接受參數:
傳遞參數給函數:調用函數時,在函數名后面以空白分隔
給定參數列表即可;例如“ testfunc arg1 arg2 …”
在函數體中當中,可使用$1, $2, …調用這些參數;還
可以使用$@, $*, $#等特殊變量
4、函數變量
變量作用域:
環境變量:當前shell和子shell有效
本地變量:只在當前shell進程有效,為執行腳本會啟動專用子shell進程;因此,本地變量的作用范圍是當前shell腳本
程序文件,包括腳本中的函數。
局部變量:函數的生命周期;函數結束時變量被自動銷毀
? 注意:如果函數中有局部變量,如果其名稱同本地變量, 使用局部變量。
? 在函數中定義局部變量的方法
local NAME=VALUE
為了避免函數中變量與shell中已經定義的變量或者命令名字沖突,盡可能使用局部變量
5、函數遞歸
函數遞歸:
函數直接或間接調用自身
(注意遞歸層數)
? 遞歸實例:
階乘是基斯頓·卡曼于 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)
? 示例: fact.sh
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]; then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
fact 5
原創文章,作者:ldt195175108,如若轉載,請注明出處:http://www.www58058.com/38776
總結的很不錯,以后的作業記得按時提交哦