Shell函數類似於Shell腳本,里面存放了一系列的指令,不過Shell的函數存在於內存,而不是硬盤文件,所以速度很快,另外,Shell還能對函數進行預處理,所以函數的啟動比腳本更快。
1、函數定義
function 函數名() { 語句 [return] }
關鍵字function表示定義一個函數,可以省略,其后是函數名,有時函數名后可以跟一個括號,符號“{”表示函數執行命令的入口,該符號也可以在函數名那一行,“}”表示函數體的結束,兩個大括號之間是函數體。
語句部分可以是任意的Shell命令,也可以調用其他的函數。
如果在函數中使用exit命令,可以退出整個腳本,通常情況,函數結束之后會返回調用函數的部分繼續執行。
可以使用break語句來中斷函數的執行。
declare –f 可以顯示定義的函數清單
declare –F 可以只顯示定義的函數名
unset –f 可以從Shell內存中刪除函數
export –f 將函數輸出給Shell
另外,函數的定義可以放到 .bash_profile 文件中,也可以放到使用函數的腳本中,還可以直接放到命令行中,還可以使用內部的unset命令刪除函數。一旦用戶注銷,Shell將不再保持這些函數。
2、函數的調用
函數調用的實例:
#!/bin/bash function show() { echo "hello , you are calling the function" } echo "first time call the function" show echo "second time call the function" show
3、函數參數的傳遞
函數可以通過位置變量傳遞參數。例如
函數名 參數1 參數2 參數3 參數4
當函數執行時,$1 對應 參數1,其他依次類推。
實例:
#!/bin/bash function show() { echo "hello , you are calling the function $1" } echo "first time call the function" show first echo "second time call the function" show second
4、函數的返回值
函數中的關鍵字“return”可以放到函數體的任意位置,通常用於返回某些值,Shell在執行到return之后,就停止往下執行,返回到主程序的調用行,return的返回值只能是0~256之間的一個整數,返回值將保存到變量“$?”中。
實例:
#!/bin/bash function abc() { RESULT=`expr $1 \% 2` #表示取余數 if [ $RESULT –ne 0 ] ; then return 0 else return 1 fi } echo "Please enter a number who can devide by 2" read N abc $N case $? in 0) echo "yes ,it is” ;; 1) echo “no ,it isn’t” ;; esac
在這里要注意參數傳遞了,上面read進來的數字,必須加上$符號才能傳遞給函數,我剛開始不知道是哪里錯了,找了半天才知道是這里出錯了。
5、函數的載入
如果函數在另外一個文件中,我們該怎么調用它呢?
這里就有一個方法。比如 show 函數寫在了function.sh里面了,我們就可以用 source 命令
source function.sh show
這樣就可以調用了。
6、函數的刪除
用法:unset –f 函數名
7、函數的變量作用域
默認情況下,變量具有全局作用域,如果想把它設置為局部作用域,可以在其前加入local
例如:
local a="hello"
使用局部變量,使得函數在執行完畢后,自動釋放變量所占用的內存空間,從而減少系統資源的消耗,在運行大型的程序時,定義和使用局部變量尤為重要。
8、函數的嵌套
函數可以進行嵌套,實例:
#!/bin/bash function first() { function second() { function third() { echo "------this is third" } echo "this is the second" third } echo "this is the first" second } echo "start..." first