我在《Javascript include guard》這篇有提到在 Javascript 裡怎麼寫 include guard,今天再來介紹一下 Bourne Shell 的版本。

一般而言,include guard 的關鍵在設立變數,以及檢驗變數存不存在。在 javascript 裡我們靠的是 typeof() 檢查變數是否存在,但對於 Bourne Shell 而言,卻無法如此套用。因為不存在的變數,在 Bourne Shell 裡會被解譯成空字串。不過還好,空字串也夠用了。這回我們用的是 test 指令的 -n 參數:

SHELL> man test
...
     -n string     True if the length of string is nonzero.
...

靠著 -n 指令,我們可以判斷給定的變數,解譯後是否是長度為零的空字串。如果變數不存在,便會被解譯成空字串,也可以偵測的出來。所以, Bourne Shell 版的 include guard 就可以寫成這樣:

if [ -n $ADK_UNIX_SUDO_SH_INCLUDED ]; then
    ADK_UNIX_SUDO_SH_INCLUDED='yes';
    ...
fi;

其中,[ 就是 test,而 ] 是沒有效果的符號。換用 [ 也可以用,是為了寫程式方便,和 ] 湊成對,剛好看起來像個括弧。