Ksh
將大寫變數分配給命令
在嘗試破譯我目前公司的前僱員編寫的一些腳本時,在許多腳本中,我遇到了以下語句,這些語句將變數分配給一些命令,如下所示:
CAT=cat GREP=grep SED=sed
稍後在腳本中,我看到他們使用了這些變數而不是正常命令:
$GREP -v "^#" `dirname $0`/abcdfilename | while read line do <some loop operations> done
我沒有看到使用這個變數而不是
grep
直接使用的意義。我的問題是:
- 以這種方式執行 grep 或 sed (在我們的例子中)有什麼意義嗎?
- 這是有人試圖編寫腳本以使其他人更難理解的結果嗎?
- 或者這僅僅是糟糕腳本的一個例子?
有一個論點是將您在整個腳本中重複使用的幾乎任何東西都變成一個變數,因為這樣您就可以重新定義它一次並讓它在腳本的其餘部分中漣漪。
您可能會爭辯說,通過簡單的 sed 搜尋/替換可以完成基本相同的事情,但許多使用者對搜尋/替換持謹慎態度,因為意外替換您不打算替換的東西並不難。
事實上,我建議對他們現有的版本進行改進:
GREP=${GREP:-/bin/grep}
這意味著 GREP 將設置為使用者在 shell 中設置的任何值,或者如果未設置,則設置為 /bin/grep
這樣,使用者可以即時覆蓋“grep”。
$ export GREP=/bin/fgrep $ ./path/to/script.sh
在系統上,標準命令有不同的實現。就像在 Solaris 10 和更早版本中一樣,您擁有
/bin/sh
的是舊的 Bourne shell 和/usr/xpg4/bin/sh
Is POSIX compliant shell。或者在 OSX 上,呼叫時使用 BSD sed,呼叫sed
時使用 GNU sedgsed
。您可以選擇要在腳本中使用的實現。因此,當您使用變數時,更容易更改腳本中的實現。當你想要 GNU sed 時:
SED=gsed
如果不使用變數,則必須替換
sed
腳本中所有出現的 。儘管您可以輕鬆地做到這一點,但它被認為是不好的程式習慣。