首頁 > shell教程 閱讀:0更新時間:2020-03-28 02:20:06

Shell模塊化(把代碼分散到多個腳本文件中)

所謂模塊化,就是把代碼分散到多個文件或者文件夾。對于大中型項目,模塊化是必須的,否則會在一個文件中堆積成千上萬行代碼,這簡直是一種災難。

基本上所有的編程語言都支持模塊化,以達到代碼復用的效果,比如,Java 和 Python 中有 import,C/C++ 中有 #include。在 shell 中,我們可以使用 source 命令來實現類似的效果。

在《執行Shell腳本》一節中我們已經提到了 source 命令,這里我們再來講解一下。

source 命令的用法為:

source filename

也可以簡寫為:

. filename

兩種寫法的效果相同。對于第二種寫法,注意點號.和文件名中間有一個空格。

source 是 Shell 內置命令的一種,它會讀取 filename 文件中的代碼,并依次執行所有語句。你也可以理解為,source 命令會強制執行腳本文件中的全部命令,而忽略腳本文件的權限。

實例

創建兩個腳本文件 func.sh 和 main.sh:func.sh 中包含了若干函數,main.sh 是主文件,main.sh 中會包含 func.sh。

func.sh 文件內容:

#計算所有參數的和
function sum(){
    local total=0

    for n in $@
    do
         ((total+=n))
    done

    echo $total
    return 0
}


main.sh 文件內容:

#!/bin/bash

source func.sh

echo $(sum 10 20 55 15)

運行 main.sh,輸出結果為:
100

source 后邊可以使用相對路徑,也可以使用絕對路徑,這里我們使用的是相對路徑。

避免重復引入

熟悉 C/C++ 的讀者都知道,C/C++ 中的頭文件可以避免被重復引入;換句話說,即使被多次引入,效果也相當于一次引入。這并不是 #include 的功勞,而是我們在頭文件中進行了特殊處理。

Shell source 命令和 C/C++ 中的 #include 類似,都沒有避免重復引入的功能,只要你使用一次 source,它就引入一次腳本文件中的代碼。

那么,在 Shell 中究竟該如何避免重復引入呢?

我們可以在模塊中額外設置一個變量,使用 if 語句來檢測這個變量是否存在,如果發現這個變量存在,就 return 出去。

這里需要強調一下 return 關鍵字。return 在 C++、C#、Java 等大部分編程語言中只能退出函數,除此以外再無他用;但是在 Shell 中,return 除了可以退出函數,還能退出由 source 命令引入的腳本文件。

所謂退出腳本文件,就是在被 source 引入的腳本文件(子文件)中,一旦遇到 return 關鍵字,后面的代碼都不會再執行了,而是回到父腳本文件中繼續執行 source 命令后面的代碼。

return 只能退出由 source 命令引入的腳本文件,對其它引入腳本的方式無效。

下面我們通過一個實例來演示如何避免腳本文件被重復引入。本例會涉及到兩個腳本文件,分別是主文件 main.sh 和 模塊文件 module.sh。

模塊文件 module.sh:

if [ -n "$__MODULE_SH__" ]; then
    return
fi
__MODULE_SH__='module.sh'

echo "http://c.biancheng.net/shell/"

注意第一行代碼,一定要是使用雙引號把$__MODULE_SH__包圍起來,具體原因已經在《Shell test》一節中講到。

主文件 main.sh:

#!/bin/bash

source module.sh
source module.sh

echo "here executed"

./表示當前文件,你也可以直接寫作source module.sh。

運行 main.sh,輸出結果為:
http://c.biancheng.net/shell/
here executed

我們在 main.sh 中兩次引入 module.sh,但是只執行了一次,說明第二次引入是無效的。

main.sh 中的最后一條 echo 語句產生了輸出結果,說明 return 只是退出了子文件,對父文件沒有影響。

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩