取消設定引用不存在目錄的 bash 變數

取消設定引用不存在目錄的 bash 變數

我有一個由應用程式取得的文件,將相關目錄新增至 $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"執行該子句。

相關內容