存在しないディレクトリを参照するbash変数を設定解除する

存在しないディレクトリを参照するbash変数を設定解除する

アプリケーションによってソース化され、関連するディレクトリを $PATH および $LD_LIBRARY_PATH に追加するファイルがあります。

これは問題ありませんが、かなりの数のパスが追加され、そのうち約 2/3 は存在しないため、$PATH と $LD_LIBRARY_PATH がやや過度に汚染されることになります。

を使用してディレクトリの存在をテストできます[ ! -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、この問題が解決するかもしれませんが、他の質問、回答、Web サイトなどでは、これは一般的に悪い考えであると示唆されています。

この問題を 10x3 の 30 行よりも良い方法で解決するにはどうすればよいでしょうか?

if [ ! -d $VAR ]
    unset VAR
fi

答え1

ここに関数があります:

_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }

ここでは使用例を示します。まず、2 つのディレクトリがあります。

$ ls -d */
a1/  a2/

ディレクトリとして評価される場合とされない場合がある 4 つのシェル変数を定義します。

$ one=a1; two=a2; three=a3; four=a4

次に、これらの 4 つの変数に対して関数を実行します。

$ _testPathAndUnset one two three four

また、2 つの変数のみが設定されていることに注意してください。

$ 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"節が実行されます。

関連情報