? ? 寫一個又大又復雜的程序的技巧之一,就是將該程序分解成一些稱之為子程序的小程序,而在每一個子程序中,又可以把重復出現的代碼組織到一起形成一個函數。
? ? 函數和子程序執行的是主程序某一特定的任務。我們要做的工作就是寫一個主程序,當需要某一個函數和子程序的時候就調用它們。
本章先了解函數。
在編寫Linux程序的時候,有時不得不一遍又一遍地重寫某些相同的命令。例如,給朋友寫一份邀請信,請他們來參加一個狂歡舞會。可把這些信息寫在一個for in循環中,并將每個朋友的名字放在一個單詞表中。當然,也可以把每一份邀請信都寫進程序中,只不過是將內容重寫幾次罷了。或者使用一個函數。
函數(function)是Linux程序的一部分,與程序的其余部分是分開的。試設想一下:一個函數就像程序中的一個分隔倉。我們先給一個函數取一個惟一的名字(即函數名),然后就可以把經常要使用的一條或多條命令放入函數之中。
當linux需要使用存放在函數中的命令時,可以在程序中鍵人該函數的名字。因此,通過使用函數名就可以重復使用函數中的命令,而不必再重寫這些命令。譬如,把那些邀請詞放在一個函數中。
在每次調用函數時,可以給函數傳遞一定的信息。這個過程稱之為給函數傳遞參數。因此,可以創建一個打印邀請信的函數,每調用它一次,就給函數傳遞一個名字,而函數則會自動地把名字賦給函數中的某個變量。以后,當涉及到那位朋友的時候,代表他的就是一個變量,而不是他的名字。
通常使用函數來處理傳遞給函數的某些信息,然后,將處理結果返回到程序的調用處。函數處理后返回的結果稱之為返回值(return value)。我們可以在程序中利用這個返回值。
如果需要重寫某段代碼,就可以使用函數來代替它。
## 創建一個函數
在使用一個函數之前,必須先在程序中定義一個函數。因此,創建一個函數最好的地方是在程序的開始位置。創建函數也稱之為定義函數,定義的結果稱為函數定義。
定義一個函數請遵循下述步驟:
1.首先在程序中鍵入一個關鍵字function。
? 它表示要創建一個函數。
2.給函數起一個名字。且它在程序中沒有任何重名。
? 函數的名稱最好能反映函數的功能。
3.在函數名和第一個命令之間要使用一個開大括號"{"。
? 它表示函數執行命令的入口。
4.在函數體中鍵入所需要的任何命令。
? 在函數體中使用在本書中討論的任何命令都可以。
5.在函數體每一個命令之后,下一個命令之前用一個分號";"隔開。
? 注意,分號和命令之間不要留有空格。分號";"表示一個特定的命令結束。
6.在最后一個命令的分號";"之后用一個閉大括號"}"。
? 注意,在最后一個分號"}"和"|"之間不要留有空格。閉大括號"|"表示函數定義的結束。
下面是函數定義的一般格式:
~~~
function name
{
command;
command;
?}
~~~
下面是一個典型的函數定義,它的作用是在屏幕上顯示一條歡迎信息(此函數例子在本
章后面還會引用到,請留心)。
~~~
function display
{
echo "Welcome to the world"
echo "of functios"
}
~~~
## 調用一個函數
在定義了一個函數以后,調用它是非常容易的。我們需要做的就是在需要使用該函數的地方用一下函數名即可。
通過函數調用,Linux會自動尋找該函數的定義,并執行其中的每一條指令。
在程序執行到閉大括號“}”后,Linux返回到調用函數的下一行,并繼續執行其他的指令。
下面是函數調用的一個典型例子:
~~~
#!/bin/bash
clear
function display
echo "Welcome to the world"
echo "of functions. "
}
display
~~~
## 給函數傳遞參數
例如,假設要寫一個驗證用戶ID和密碼( password)的函數,這個函數除了ID和密碼之外,還包括所有驗證用戶身份所必需的命令和信息。在每次調用函數時,除了ID和密碼可以不同之外,其余各部分都應相同。
如果讀者想在程序中調用該函數,就把ID和密碼作為參數傳遞給函數,linux把它們賦給某些變量。在這個程序中,這兩個變量分別是$$1和$$2。每一個數字都指向它所對應的傳遞來的參數。注意,由于Linux在這里期望的是數字,所以不能用其他的字符如varl來取代這些變量中的數字的。
因此,可以用變量來取代函數定義中的信息。例如,ID是傳遞給函數的第一個參數,密碼是傳遞給函數的第二個參數。因此,在函數定義中,當需要引用ID時就可以用變量$1,需要引用密碼時可以用變量$2。
請看下面的例子:
~~~
#!/bin/bash
clear
function verify
{
if [$1 -eq "Bob" ]&&[$2 -eq "555"]
then
echo "Verified"
eise
echo "Rejected"
fi
}
verify Bob 555
~~~
## 驗證傳遞給函數的參數的個數
如果程序不能給一個函數傳遞它所需要的全部信息,可能會遇到麻煩。例如,一個函數可能要依據程序提供的某些信息來進行某種計算操作。不過,如果程序根本不給函數傳遞什么 信息,也可能會出現錯誤。
變量$#包含了傳遞給函數的參數的個數。通過對變量$#的值和函數實際需要的參數的
個數進行比較,就可以決定是否阻止函數處理傳遞來的信息。請看下面的示例:
~~~
#!/bin/bash
clear
function verify
{
if [$# -ne 2]
then
echo "Wrong number of arguments!"
else
if[$1 -eq "Bob"] &&[$2 -eq "555"]
then
echo "Verified"
else
echo "Rejected"
fi
fi
}
verify Bob 555
~~~
## 與子程序共享函數
? ? 子程序同樣也可以使用程序員建立的函數。只要把子程序設想成是程序中的一個程序即可。
? ? ?我們建立一個用函數驗證用戶ID和密碼的程序。但這次卻想在另一個不含有該函數的程序中使用該函數。當然,不是把該函數復制到第二個程序中,而是讓第二個程序(子程序)也能分享第一個程序中的函數。
? ? 我們可以用export命令輸出函數,實現子程序之間共享函數。然后,就可以在子程序中調用該子函數。請看下面的例子:
~~~
#!/bin/bash
clear
function verify
{
if [$# -ne 2]
then
echo "Wrong number of arguments!"
else
if[$1 -eq "Bob"]&&[$2 -eq "555"]
then
echo "Verified"
else
echo "Rejected"
fi
fi
}
export verify
subprogram1
~~~
現在對加在函數定義之后的兩行說明如下:
1.在函數定義結束符“}”之后,用export命令來說明子程序subprogram1可以訪問函數verify。
2.程序中最后一行是調用子程序subprogram1。注意,子程序subprogram1并沒有包含函數verify的定義,但子程序可以調用它,因為在調用予程序之前已用export命令說明了輸出該函數verify。
子程序subprogram1如下:
~~~
#!/bin/bash
clear
verify "Bob" "555"
~~~
## 從函數返回信息
函數就像一條雙行道,程序可以發送信息給函數,函數可以回送信息給程序。比如說,不是用函數verify驗證一個用戶的ID和密碼是否正確,而是讓函數將它處理后的結果返回給調用程序。
那么,調用程序就要決定它下面該如何操作。
函數的返回值通常存儲在變量$?中。但要注意,返回值必須是在0到256之間的一個整數。因此,是不能將字符串作為返回值返回的。
通常是用一個關鍵字return,再在其后加上一個要返回的值的方式,從函數返回一個值。
由于返回值是一個整數,因此必須給每一個要返回的整數賦予一定的含義。例如,常用0表示函數運行正常,用非0表示函數運行出錯。
關鍵字return可以放在函數中的任意位置,但它通常放在函數驗證某些值-----如比較ID和密碼的位置之后。Linux執行到return之后,函數就停止往下執行,返回到主程序的調用行。
若想知道如何從函數返回一個值,請看下面的例子:
~~~
#!/bin/bash
clear
function verify
{
if [$# -ne 2]
then
return 1
else
if [$1 -eq "Bob"]&&[$2 -eq "555"]
then
return 0
else
return 2
echo "Rejected"
fi
fi
}
verify Bob 555
case $? in
do
0)
echo "Verified"
;;
1)
echo "Wrong number of arguments!"
;;
2)
echo "Rejected"
;;
done
~~~
- 前言
- linux基礎(一)------登錄以及文件系統的了解
- linux基礎(二)----linux常用命令積累
- linux基礎(三)----linux命令系統學習----安裝和登錄命令
- linux基礎(四)----linux命令系統學習----文件處理命令
- linux基礎(五)----linux命令系統學習----系統管理命令
- linux基礎(六)----linux命令系統學習----網絡操作命令
- linux基礎(七)----linux命令系統學習----系統安全相關命令
- linux基礎(八)----linux命令系統學習----其它命令
- linux基礎(九)----linux性能監測
- linux基礎(十)----linux網絡配置詳細步驟---橋接模式和兩臺機子的遠程通信
- linux基礎(十一)----linux編程基礎----變量
- linux基礎(十二)----linux編程基礎----與用戶交互
- linux基礎(十三)----linux編程基礎----linux運算符
- linux基礎(十四)----linux編程基礎----linux條件控制語句----if else語句
- linux基礎(十五)----linux編程基礎----linux條件控制語句----case語句
- linux基礎(十六)----linux編程基礎----linux條件控制語句----多層嵌套控制結構
- linux基礎(十七)----linux編程基礎----linux循環控制語句----while循環
- linux基礎(十八)----linux編程基礎----linux循環控制語句----for in循環
- linux基礎(十九)----linux編程基礎----linux循環控制語句----break中斷和continue繼續
- linux基礎(二十)----linux編程基礎----子程序----函數