Aufheben der Festlegung von Bash-Variablen, die auf nicht vorhandene Verzeichnisse verweisen

Aufheben der Festlegung von Bash-Variablen, die auf nicht vorhandene Verzeichnisse verweisen

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 evalkö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 dbezieht sich auf den Namen einer Variablen. ${!d}bezieht sich auf den Wert der Variablen mit dem Namen d. Dies prüft, ob der Wert der Variablen mit dem Namen dein Verzeichnis ist. Wenn dies nicht der Fall ist, wird der [Test als „false“ ausgewertet und die unset "$d"Klausel wird ausgeführt.

verwandte Informationen