
アプリケーションによってソース化され、関連するディレクトリを $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"
節が実行されます。