第五章 shell函數的定義、執行、傳參和遞歸函數
阿新 • • 發佈:2018-05-09
shell函數的定義、執行、傳參 shell遞歸函數 shellfork××× 第五章 shell函數的定義、執行、傳參和遞歸函數
Bash(Bourne Again shell)也支持函數,在編寫大型復雜腳本的時候,可以用函數把代碼編寫成一個一個功能相對獨立的代碼塊,使代碼模塊塊、結構清晰、有效的減少程序的代碼量。但是bash shell是一種解釋性語言,執行效率沒有編譯性語言高。
shell函數的定義
格式一:(
function name() {
command sequence (命令序列)
}
格式二:
name() {
command sequence (命令序列)
}
函數執行
[root@ceshi ~]# function name() { > echo "123" > } 執行 [root@ceshi ~]# name #直接調用函數名即可 123
傳遞參數
[root@ceshi ~]# vi chuandi.sh #!/bin/bash aa="111" #定義全局變量 bb="222" #定義全局變量 function name() { #定義函數名 local cc="ccc" #定義局部變量 local dd="ddd" #定義局部變量 echo $aa, $bb #打印全局變量 echo $cc #打印局部變量 return 0 #shell函數返回值是正行,並且在0-257之間。 } echo $dd #運行局部變量,因為這裏是在函數外運行,不會生效。 name #運行函數name 註意: $aa是第一個參數$1, $bb是第二個參數$2, 依次類推$n就是第n個參數$n return 0 參數返回,可以顯示加:return 返回,如果不加,將以最後一條命令運行結果作為返回值
執行:
[root@ceshi ~]# /bin/bash chuandi.sh
111, 222
ccc
遞歸函數
bash也支持遞歸函數(能夠調用自身的函數)
[root@ceshi ~]# cat digui.sh
#!/bin/bash
function name() {
echo $1
name hello
sleep 1
}
name
執行腳本會不停的打印hello,按ctrl+c 手動結束
遞歸經典:fork ×××
可能很多人都曾經聽說過fork×××,它實際上只是一個非常簡單的遞歸程序,程序所做的事情只有一樣:這個遞歸函數能夠調用自身,不斷的生成新的進程,這會導致這個簡單的程序迅速耗盡系統裏面的所有資源,造成拒絕服務攻擊。
.()
{
.|.&
}
;
.
- 第1行說明下面要定義一個函數,函數名為小數點,沒有可選參數。
- 第2行表示函數體開始。
- 第3行是函數體真正要做的事情,首先它遞歸調用本函數,然後利用管道調用一個新進程(它要做的事情也是遞歸調用本函數),並將其放到後臺執行。
- 第4行表示函數體結束
- 第5行並不會執行什麽操作,在命令行中用來分隔兩個命令用。從總體來看,它表明這段程序包含兩個部分,首先定義了一個函數,然後調用這個函數。
- 第6行表示調用本函數
第五章 shell函數的定義、執行、傳參和遞歸函數