
我有一個由應用程式取得的文件,將相關目錄新增至 $PATH 和 $LD_LIBRARY_PATH 中。
這很好,但它會導致 $PATH 和 $LD_LIBRARY_PATH 過度污染,因為添加了相當多的路徑,其中大約 2/3 不存在。
我可以使用 測試目錄是否存在[ ! -d $VARIABLE_TO_ADD_TO_PATH ]
,但如果發現該目錄不存在,則取消設定似乎更困難。
我可以寫(對於大約 10 個變數中的每一個)
if [ ! -d $VAR ]
unset VAR
fi
但我寧願有一個功能。
我試過:
_testPathAndUnset()
{
while [ $# -ge 1 ]
do
dirToTest=${1/startPattern/\$startPattern}
if [ ! -d $dirToTest ]
unset $1
fi
shift
done
}
_testPathAndUnset VAR1 VAR2 VAR3
以(not )等形式傳遞值$VAR1 $VAR2 $VAR3
,但現在我有不擴展的字串。
使用eval
可能會為我解決這個問題,但其他問題、答案、網站等表明這通常是一個壞主意。
如何以比 30 行 10x3 更好的方式解決這個問題?
if [ ! -d $VAR ]
unset VAR
fi
答案1
這是一個函數:
_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }
這裡它正在使用。首先,我們有兩個目錄:
$ ls -d */
a1/ a2/
我們定義了四個 shell 變量,它們可能會或可能不會計算為目錄:
$ one=a1; two=a2; three=a3; four=a4
現在,針對這四個變數運行我們的函數:
$ _testPathAndUnset one two three four
並且,觀察到只有兩個變數保持設定:
$ echo "one=$one two=$two three=$three four=$four"
one=a1 two=a2 three= four=
細節:
for d in "$@"
這會循環遍歷命令列上的每個參數。
[ -d "${!d}" ] || unset "$d"
這裡
d
指的是變數的名稱。${!d}
指名為 的變數的值d
。這測試指定變數的值是否d
是一個目錄。如果不是,則[
測試結果為 false,並unset "$d"
執行該子句。