函式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...