Linux shell指令碼程式設計之函式

2021-07-26 20:39:37 字數 4618 閱讀 9862

在編寫功能比較複雜的shell指令碼時,完成具體任務的**有時會被重複使用,bash shell指令碼提供函式特性實現**復用,函式是被賦予名稱的指令碼**塊。

一、建立函式

在bash shell指令碼中建立函式的格式如下:

function name()

乙個簡單的例子如下:

$ cat test.sh

#!/bin/bash

function func_test()

func_test;

$ ./test.sh

hello world

注意:函式要在使用前定義,使用沒有定義的函式會報錯。

二、函式的返回值

bash shell將函式看作是乙個小型的指令碼,函式的退出碼(即返回值)有三種形式:

(1)預設退出狀態

與一般指令碼相同,在函式執行完後,函式的退出碼存放於變數$?中。

$ cat test.sh

#!/bin/bash

function func_test()

func_test;

echo "func_test的返回值為:$?"

$ ./test.sh

hello world

func_test的返回值為:0

可以看出函式的預設返回值為0,但是最好不要使用函式的預設返回值,看下面這個例子

$ cat test.sh

#!/bin/bash

function func_test()

func_test;

echo "func_test的返回值為:$?"

$ ./test.sh

ls: 無法訪問'/***/***x': 沒有那個檔案或目錄

program end

func_test的返回值為:0

可以看出 ls -l 命令執行失敗,但是函式返回值卻是0,因為最後一條命令echo能夠正確執行。函式的返回值是最後一條命令的返回值。我們執行func_test後,根據返回碼無法判斷ls -l命令是否執行成功,這明顯不是乙個好的做法。

(2)在函式中使用return命令返回指定狀態碼

$ cat test.sh

#!/bin/bash

function func_test()

func_test;

echo "func_test的返回值為:$?"

$ ./test.sh

ls: 無法訪問'/***/***x': 沒有那個檔案或目錄

func_test的返回值為:1

ls -l 命令執行失敗,函式退出,返回碼為1。有兩點一定要注意:

1、函式的返回碼跟指令碼返回碼一樣,取值範圍為0~255

2、函式返回值在函式執行完後最好立即取出。(如果在函式後又執行了其它命令,函式的返回碼會被命令的返回碼覆蓋)

(3)函式輸出

使用函式輸出將函式輸出存放到shell變數中,這樣我們可以從函式獲取任意型別的輸出。

$ cat test.sh

#!/bin/bash

function func_add()

result=`func_add`;

echo "兩個數的和為:$result"

$ ./test.sh

請輸入兩個整數:100 300

兩個數的和為:400

三、向函式中傳遞引數

與向指令碼傳遞引數相同,參見

linux shel程式設計之命令列引數處理:

這裡只給出乙個簡單例子:

$ cat test.sh

#!/bin/bash

function func_add()

read -p "請輸入兩個整數:" a b

result=`func_add $a $b`;

echo "兩個數的和為:$result"

$ ./test.sh

請輸入兩個整數:100 200

兩個數的和為:300

四、在函式中使用變數

變數作用域是shell指令碼程式設計師遇到的常見的問題,使用域是變數的可見區域。函式內定義的變數與普通變數有著不同的作用域。函式內可以使用兩種型別的變數:全域性變數和區域性變數

1.全域性變數

全域性變數是在shell指令碼內處處可以使用的變數,如果指令碼的主**定義了全域性變數,那在函式內部可以使用這個變數的值,同樣,如果在函式內部定義了全域性變數,那在指令碼的主**中也可以使用這個變數的值。預設情況下,指令碼中定義的變數都是全域性變數,使用全域性變數時應該非常小心:

$ cat test.sh

#!/bin/bash

function test_global

value=12

test_global

echo "value=$"

echo "temp=$"

$ ./test.sh

value=24

temp=24

2.區域性變數

只能在函式內部使用的變數稱為區域性變數,宣告區域性變數時要在變數名前加上"local"關鍵字

$ cat test.sh

#!/bin/bash

function test_global"}

value=12

test_global

echo "global value=$"

$ ./test.sh

local value=24

global value=12

五、陣列變數與函式

1.陣列變數

陣列是能儲存多個值的變數,陣列中的值可以單個引用,也可以作為乙個整體引用。

$ cat test.sh

#!/bin/bash

array=(1 2 3 4 5)

echo $

echo $

echo $

array[2]=333

echo $

$ ./test.sh 13

1 2 3 4 5

1 2 333 4 5

從上面例子可以看出:如果直接使用$只能得到第乙個元素。使用$可以根據下標索引獲取陣列中元素。如果想得到整個陣列的值就要使用echo $,還可以直接修改陣列元素的值。

2.向函式傳遞陣列

要想把陣列變數傳遞給函式,如果把陣列變數作為單個引數傳遞,會得到意想不到的結果。

$ cat test.sh

#!/bin/bash

function test_array

array=(1 2 3 4 5)

test_array $

$ ./test.sh

the parameters are:1

顯然直接將陣列變數作為函式引數使用,那麼只能得到陣列變數的第乙個元素。將陣列變數拆分為單個元素可以解決這個問題。

$ cat test.sh

#!/bin/bash

function test_array

" sum=0

for val in $

dosum=$[$+$]

done

echo "the total of array is :$"

}array=(1 2 3 4 5)

test_array $

$ ./test.sh

the parameters are:1 2 3 4 5

new_array: echo 1 2 3 4 5

the total of array is :15

3.從函式返回陣列

也可以從函式向shell指令碼回傳陣列變數,利用函式輸出以恰當的順序輸出各陣列的值,然後指令碼必須將這些資料重組為新陣列變數。

$ cat test.sh

#!/bin/bash

function test_array"}

array="(`test_array`)"

echo "the functon return:$"

$ ./test.sh

the functon return:(1 2 3 4 5)

六、函式庫

如果我們想在乙個指令碼a呼叫另乙個指令碼b定義的函式,即將指令碼檔案b當作乙個函式庫使用,利用source命令可以在指令碼a內部執行指令碼b(不建立新的shell執行指令碼b),這樣在指令碼a中就可以使用指令碼b種定義的函式。所以只需要在指令碼a中加入 

source  /..../b.sh或.  /...../b.sh即可,/....../b.sh表示指令碼b的路徑

.與source在此處含義相同。

$ cat add.sh

#!/bin/bash

function add()

$ cat test.sh

#!/bin/bash

. ./add.sh

result=`add 1 2`

echo "1,2相加的和為:$result"

$ ./test.sh

1,2相加的和為:3

Linux shell指令碼程式設計之符號篇

shell的作用是解釋執行使用者的命令,使用者輸入一條命令shell就解釋執行一條,這種方式成為互動式shell shell還有一種執行命令的方式稱為批處理,即使用者事先編寫好乙個shell指令碼 script 其中有很多條命令,讓shell一次性執行這些命令。今天我們重點說的就是這種批處理shel...

linux shell高階指令碼程式設計之函式篇

1.建立函式 function name 也可以寫成下面這種形式 name 2.函式返回值 函式退出狀態是函式最後條命令返回的退出狀態,可以用 確定函式的退出狀態 使用return bin bash func1 func1 echo now value 使用函式的輸出 bin bash func1 ...

Linux shell程式設計之控制指令碼之定時執行

目錄 控制指令碼之定時執行 cron時間表 系統不關機情況下 與cron相關的檔案和目錄 anacron crontab定時任務 定時任務實戰 cron時間表 系統不關機情況下 linux使用cron程式 通過檢查cron時間表 來計畫要定期執行的指令碼 每個使用者 包括root 都有自身的cron...