在寫 Shell Script 也是可以像寫程式一樣,引入其他的 shell script。
如果我們常常寫一些各式各樣的 Bash Shell Script 來協助我們日常重複的工作時,不難發現其實會有很多重複的函式。例如:寫 log 的格式。這應該在很多 Shell Script 中都會用到,所以都會重複。
在前幾篇我介紹了一些使用函式提高程式碼的方式,我先以寫 log 的格式來舉例子好了。
我在 A Script 和 B Script中都會用到寫 log 這個函式,所以這兩個 Script 中都會有一個函式叫做 LogToFile() (假設這個函式的名稱叫做 LogToFile())。這樣會造成什麼樣的問題呢?其實也還好啦,平常問題是不大,只不過如果有一天你想更改寫 log 的格式時,你就必須將這兩個 Script 翻出來,然後一一修改。如果今天是十個呢?那就要一一找出來,總共要改十次。
OK!格式漏改也沒什麼了不起的。但如果今天這個函式叫做『取得某SDK的路徑』呢?那很抱歉,漏改一個我們SDK路徑錯誤就可能會導致程式碼編譯錯誤,或者是編譯出來的根本就是錯誤的版本。
有感覺了嗎?這其實就跟我們在 script 中使用到的變數一樣。同樣的東西只要有一個就好,其他的就用變數來代替。如此一來如果說要修改什麼,你只要修改一個地方就完成了所有工作了。不用在擔心是否有哪裡漏掉,哪裡忘了改。
那該怎麼做呢?
在 Bash Shell Script 中也是可以 引入 其他的 Bash Shell Script 的。其語法如下:
source someScript.sh
只要在要 引入 的 script 前面加上 source 就可以了。如果有不同的路徑,也要將該相對或絕對路徑加上。
與前面相同的是,必須要在用到要該 引入 的 script 之前就把該 script 給 引入 進來,否則會造成找不到的現象喔!!
那我就來個非常非常簡單的範例吧,這個範例主要就是要介紹怎麼使用 source 這個關鍵字來 引入 其他的 script.
這個非常簡單的範例就是,我有一個函式是負責計算圓的面積,因為考慮到很多 script 都會用到,所以我將這個函式拉到另一個 script 中,並且放到 Common 資料夾下,讓其他要用到的 script 去用 source 把他引用進來。
Common 資料夾下的 math.sh
#!/bin/bash
CalCricleArea(){
radius=$1
pi=3.1415
circleArea=$(echo "scale=2;$pi * ($radius * $radius)" | bc)
echo $circleArea
}
在 math.sh 中,目前就只有一個函式 CalCircleArea (計算圓的面積)。
那我們的主成是就是要把 Common/math.sh 這個 script 給引入,範例如下:
#!/bin/bash
source Common/math.sh
result=$(CalCricleArea 5)
echo " 半徑為 5 的原面積 = $result"
主要的部分就是第三行 source Common/math.sh ,這樣不同的script都可以引用同一個函式了。所以我們實際上執行的結果如下: