1. 程式人生 > >Shell函式的定義、執行、傳參和遞迴函式

Shell函式的定義、執行、傳參和遞迴函式



Bash(Bourne Againshell)也跟其他程式語言一樣也支援函式,一般在編寫大型指令碼中需要用到,它可以將Shell指令碼程式劃分成一個個功能相對獨立的程式碼塊,使程式碼的模組化更好,結構更加清晰,並可以有效地減少程式的程式碼量。但是bash作為一種解釋性語言,bash 在程式設計能力方面提供的支援並不像其他編譯性的語言(例如 C 語言)那樣完善,執行效率也會低很多。

shell函式的定義、執行與傳參

定義

格式1

function name() {
 Command sequence(命令序列);
}

格式2

name() {
 Command sequence(命令序列);
}

可以帶function name()定義,也可以直接name()定義,不帶任何引數。 

執行

name;

直接使用函式名稱即可呼叫某個函式。

傳遞引數

#!/bin/bash
aa="this is aa"
bb="this is bb"
function name() {                  #定義函式name
        local cc="this is cc"      #定義區域性變數$cc
        local dd="this is dd"      #定義區域性變數$dd
        echo $aa, $bb              #訪問引數1和引數2
echo $cc #列印區域性變數 return 0 #shell函式返回值是整形,並且在0~257之間。 } echo $dd #這裡將會列印不生效,因為dd是區域性變數。 name #使用函式name

上例中:

  • aa 和 bb 定義的是全域性變數。
  • cc 和 dd 定義的是區域性變數,只能在函式 name 中使用。
  • $aa是第一個引數$1$bb是第一個引數$2,以此類推$n是第n個引數$n

  • return 0引數返回,可以顯示加:return 返回,如果不加,將以最後一條命令執行結果作為返回值。

遞迴函式

bash也支援遞迴函式(能夠呼叫自身的函式)例如:

#!/bin/bash

function name() {
        echo $1
        name hello
        sleep 1
}
name

執行此指令碼後不斷打印出hello,按Ctrl+C結束。

遞迴經典:fork 炸彈

可能很多人都曾經聽說過 fork 炸彈,它實際上只是一個非常簡單的遞迴程式,程式所做的事情只有一樣:這個遞迴函式能夠呼叫自身,不算的生成新的程序,這會導致這個簡單的程式迅速耗盡系統裡面的所有資源,造成拒絕服務攻擊。

.()
{
.|.&
}
;
.
  • 第 1 行說明下面要定義一個函式,函式名為小數點,沒有可選引數。
  • 第 2 行表示函式體開始。
  • 第 3 行是函式體真正要做的事情,首先它遞迴呼叫本函式,然後利用管道呼叫一個新程序(它要做的事情也是遞迴呼叫本函式),並將其放到後臺執行。
  • 第 4 行表示函式體結束。
  • 第 5 行並不會執行什麼操作,在命令列中用來分隔兩個命令用。從總體來看,它表明這段程式包含兩個部分,首先定義了一個函式,然後呼叫這個函式。
  • 第 6 行表示呼叫本函式。