shell腳本中函數(shù)的定義和使用
Bash(Bourne Again shell)跟其他編程語言一樣也支持函數(shù),一般在編寫大型腳本中需要用到,它可以將Shell腳本程序劃分成一個個功能相對獨立的代碼塊,使代碼的模塊化更好,結構更加清晰,并可以有效地減少程序的代碼量。但是bash作為一種解釋性語言,bash 在編程能力方面提供的支持并不像其他編譯性的語言(例如 C 語言)那樣完善,執(zhí)行效率也會低很多。
定義
格式1
function name() {
Command sequence(命令序列);
}
格式2
name() {
Command sequence(命令序列);
}
可以帶function name()定義,也可以直接name()定義,不帶任何參數(shù)。
執(zhí)行
name;
直接使用函數(shù)名稱即可調用某個函數(shù)。
傳遞參數(shù)
#!/bin/bash
aa="this is aa"
bb="this is bb"
function name() {? ? ? ? ? ? ? ? ? #定義函數(shù)name
local cc="this is cc"? ? ? #定義局部變量$cc
local dd="this is dd"? ? ? #定義局部變量$dd
echo $aa, $bb? ? ? ? ? ? ? #訪問參數(shù)1和參數(shù)2
echo $cc? ? ? ? ? ? ? ? ? #打印局部變量
return 0? ? ? ? ? ? ? ? ? #shell函數(shù)返回值是整形,并且在0~257之間。
}
echo $dd? ? ? ? ? ? ? ? ? ? ? ? ? #這里將會打印不生效,因為dd是局部變量。
name? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #使用函數(shù)name
上例中:
?aa 和 bb 定義的是全局變量。
?cc 和 dd 定義的是局部變量,只能在函數(shù) name 中使用。
?$aa是第一個參數(shù)$1,$bb是第一個參數(shù)$2,以此類推$n是第n個參數(shù)$n。
?$@是獲取腳本調用時的傳入?yún)?shù)列表。
?return 0參數(shù)返回,可以顯示加:return 返回,如果不加,將以最后一條命令運行結果作為返回值。
.
遞歸函數(shù)
bash也支持遞歸函數(shù)(能夠調用自身的函數(shù))例如:
#!/bin/bash
function name() {
echo $1
name hello
sleep 1
}
name
運行此腳本后不斷打印出hello,按Ctrl+C結束。
遞歸經(jīng)典:fork 炸彈
可能很多人都曾經(jīng)聽說過 fork 炸彈,它實際上只是一個非常簡單的遞歸程序,程序所做的事情只有一樣:這個遞歸函數(shù)能夠調用自身,不算的生成新的進程,這會導致這個簡單的程序迅速耗盡系統(tǒng)里面的所有資源,造成拒絕服務攻擊。
.()
{
.|.&
}
;
.
?第 1 行說明下面要定義一個函數(shù),函數(shù)名為小數(shù)點,沒有可選參數(shù)。
?第 2 行表示函數(shù)體開始。
?第 3 行是函數(shù)體真正要做的事情,首先它遞歸調用本函數(shù),然后利用管道調用一個新進程(它要做的事情也是遞歸調用本函數(shù)),并將其放到后臺執(zhí)行。
?第 4 行表示函數(shù)體結束。
?第 5 行并不會執(zhí)行什么操作,在命令行中用來分隔兩個命令用。從總體來看,它表明這段程序包含兩個部分,首先定義了一個函數(shù),然后調用這個函數(shù)。
?第 6 行表示調用本函數(shù)。