
Ich habe eine Datei, die von einer Anwendung bezogen wird, und füge relevante Verzeichnisse zu $PATH und $LD_LIBRARY_PATH hinzu.
Das ist in Ordnung, führt jedoch zu einer etwas übermäßigen Verschmutzung von $PATH und $LD_LIBRARY_PATH, da ziemlich viele Pfade hinzugefügt werden, von denen etwa zwei Drittel nicht existieren.
Ich kann die Existenz des Verzeichnisses mithilfe von testen [ ! -d $VARIABLE_TO_ADD_TO_PATH ]
, wenn ich aber feststelle, dass das Verzeichnis nicht existiert, scheint es schwieriger zu sein, es aufzuheben.
Ich kann schreiben (für jede der vielleicht 10 Variablen)
if [ ! -d $VAR ]
unset VAR
fi
aber ich hätte lieber eine Funktion.
Ich habe es versucht:
_testPathAndUnset()
{
while [ $# -ge 1 ]
do
dirToTest=${1/startPattern/\$startPattern}
if [ ! -d $dirToTest ]
unset $1
fi
shift
done
}
Übergeben von Werten in einer Form wie _testPathAndUnset VAR1 VAR2 VAR3
(nicht $VAR1 $VAR2 $VAR3
), aber jetzt habe ich Zeichenfolgen, die nicht erweitert werden.
Die Verwendung eval
könnte das Problem für mich lösen, aber andere Fragen, Antworten, Websites usw. legen nahe, dass dies im Allgemeinen keine gute Idee ist.
Wie kann ich dieses Problem besser lösen als mit 30 Zeilen à 10 x 3?
if [ ! -d $VAR ]
unset VAR
fi
Antwort1
Hier ist eine Funktion:
_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }
Hier wird es verwendet. Zunächst haben wir zwei Verzeichnisse:
$ ls -d */
a1/ a2/
Wir definieren vier Shell-Variablen, die Verzeichnisse auswerten können, dies aber nicht müssen:
$ one=a1; two=a2; three=a3; four=a4
Führen Sie nun unsere Funktion für diese vier Variablen aus:
$ _testPathAndUnset one two three four
Und beachten Sie, dass nur zwei Variablen festgelegt bleiben:
$ echo "one=$one two=$two three=$three four=$four"
one=a1 two=a2 three= four=
Einzelheiten:
for d in "$@"
Dies führt eine Schleife über jedes Argument in der Befehlszeile aus.
[ -d "${!d}" ] || unset "$d"
Hier
d
bezieht sich auf den Namen einer Variablen.${!d}
bezieht sich auf den Wert der Variablen mit dem Namend
. Dies prüft, ob der Wert der Variablen mit dem Namend
ein Verzeichnis ist. Wenn dies nicht der Fall ist, wird der[
Test als „false“ ausgewertet und dieunset "$d"
Klausel wird ausgeführt.