shell指令碼 函式

2022-08-30 16:48:16 字數 3383 閱讀 1746

函式function是由若干條shell命令組成的語句塊,實現**重用和模組化程式設計。

它與shell程式形式上是相似的,不同的是它不是乙個單獨的程序,不能獨立執行,而是shell 程式的一部分。

函式和shell程式比較相似,區別在於:

shell 程式在子shell中執行

而shell函式在當前shell中執行。因此在當前shell中,函式可以對shell 中變數進行修改

函式由兩部分組成,函式名和函式體。

/etc/init.d/functions中提供了些系統設定好的函式,可以直接呼叫。

help function

function name

or name ()

語法一:

function f_name

語法二:

function f_name()

語法三:

f_name()

定義方式:

可在互動式環境下定義函式

可在指令碼中定義函式

可將函式放在指令碼檔案中使用

可放在只包含函式的單獨檔案中使用

可在互動式環境中使用

函式呼叫:

函式只有被呼叫才會執行

呼叫給定函式名,函式名出現的地方,會被自動替換為函式**

函式的生命週期

被呼叫時建立,返回時終止

示例:在命令列中直接進行

dir()

定義該函式後,使用$dir,其顯示結果同ls -l的作用相同

該dir函式將會一直保留到使用者從其他退出,或者執行unset dir命令。

函式在使用前須先被定義,所以在指令碼中使用函式是,必須在指令碼開始前定義函式。

呼叫函式僅使用其函式名即可

示例:cat func1

#!/bin/bash

# func1

hello()

echo "now going to the function hello"

hello

echo "back from the function"

函式有兩種返回值,分別為執行結果的返回值和退出狀態碼。

函式的執行結果返回值:

使用echo 等命令進行輸出

函式體中呼叫命令的輸出結果

函式的退出狀態碼:

預設取決於函式中執行的最後一條命令的退出狀態碼

自定義退出狀態碼,其格式為:

return 從函式中返回,用最後狀態命令決定返回值

return 0 無錯誤返回。

return 1-255 有錯誤返回

可以將經常使用的函式存入函式檔案,然後將函式檔案載入shell。

檔名可任意選取,但最好與相關任務有某種聯絡,如functions.main

一旦函式檔案載入shell ,就可以在命令列或指令碼中呼叫函式。

可以使用set或declar -f 命令檢視所有定義的函式,其輸出列表包括已經載入shell 的所有函式。

建立函式檔案

函式檔案示例:

cat functions.main

#!/bin/bash

#functions.main

findit()

函式中使用return 來返回值,exit用於指令碼

載入函式

函式檔案已建立好後,要將它載入shell.

定位函式檔案並載入shell的格式:

. | source filename

注意:此即< 點》 < 空格》 < 檔名》,這裡的檔名要帶正確路徑.

示例:.|source functions.main

載入函式稱為環境函式

子程序也可使用

使用export -f function_name來載入成為環境函式

檢查檢視載入的函式

使用set 或者 declar -f 命令檢查函式是否已載入。

執行shell函式

要執行函式,簡單地鍵入函式名即可。

改動shell函式

若要改動函式,首先用unset 命令從shell 中刪除函式,改動完畢後,再重新載入此檔案。

刪除shell函式

使用unset 命令完成刪除函式。

unset function_name

函式可接收引數。

傳遞引數給函式:

呼叫函式時,在函式名後面以空白分隔給定引數列表即可。

如「testfunc arg1 arg2 ...」

在函式體中當中,可使用$1, $2, ...呼叫引數,還可以使用$@, $*, $# 等特殊變數。

函式變數

變數作用域:

環境變數:當前shell和子shell有效

本地變數:只在當前shell程序有效,執行指令碼會啟動專用子shell 程序。因此,本地變數的作用範圍是當前shell 指令碼程式檔案,包括指令碼中的函式。

區域性變數:函式結束時變數被自動銷毀

注意:如果函式中有區域性變數,如果其名稱同本地變數,使用區域性變數。

在函式中定義區域性變數的方法

local name=value

declare -i name=value

定義全域性變數

declare -ig name=value

函式可以直接或間接地呼叫自身。

在函式的遞迴呼叫中,函式既是呼叫者,又是被呼叫者。

遞迴函式的呼叫過程就是反覆地呼叫其自身,每呼叫一次就進入新的一層。

從基礎層開始來計算,注意遞迴的層數。

遞迴示例:

階乘階乘是數學術語乙個正整數的階乘(factorial)是所有小於及等於該數的正整數的積,並且有0 的階乘為1 ,自然數n 的階乘寫作n!

n!=1 ×2 ×3 ×... ×n

階乘亦可以遞迴方式定義:

0!=1

n!=n(n-1)(n-2)...1

n(n-1)! = n(n-1)(n-2)!

指令碼示例:cat fact.sh

#!/bin/bash

#fact()

fact $1

fork炸彈

fork 炸彈是一種惡意程式,它的內部是乙個不斷在fork 程序的無限迴圈,實質是乙個簡單的遞迴程式。

由於程式是遞迴的,如果沒有任何限制,這會導致這個簡單的程式迅速耗盡系統裡面的所有資源

函式實現

:();:

bomb() ; bomb

指令碼實現

cat bomb.sh

#!/bin/bash

./$0|./$0&

SHELL指令碼函式

shll作為指令碼語言,也有自己的函式。但是他有許多與其他語言不同的特點 在這裡,定義了乙個函式,有2個引數,第乙個 陣列,第二個 單個值。這個函式的作用是判斷第二個引數的值是否在第乙個引數 陣列 裡面。bin sh 定義函式 fun function contain do ta array ech...

shell指令碼 函式

函式是乙個指令碼 塊,由使用者對其自定義,可以在指令碼的任意位置建立,按照格式將命令寫入到函式中,系統不會直接執行函式中的命令。如果想要這個函式,只要呼叫這個函式的名稱 只需要輸入名稱 就可以了,而且可以在指令碼的任意位置呼叫,使用函式的好處在於模組化以及 可讀性強。function 函式名稱 可以...

Shell指令碼語法 函式

bin sh foo echo start fooecho end 注意函式體的左花括號寫在同一行,命令末尾必須有 號。在定義foo 函式時並不執行函式體中的命令,就像定義變數一樣,只是給foo這個名字乙個定義,到後面呼叫foo函式的時候 注意shell中的函式呼叫不寫括號 才執行函式體中的命令。s...