1. 程式人生 > >第五章 shell函數的定義、執行、傳參和遞歸函數

第五章 shell函數的定義、執行、傳參和遞歸函數

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函數的定義、執行、傳參和遞歸函數