2

У меня есть файл, который поставляется приложением, добавляя соответствующие каталоги в $ 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 (не $VAR1 $VAR2 $VAR3), но теперь у меня есть строки, которые не раскрываются.

Использование eval может решить эту проблему для меня, но другие вопросы, ответы, веб-сайты и т.д. Предполагают, что это вообще плохая идея.

Как я могу решить эту проблему лучше, чем 30 строк 10х3?

if [ ! -d $VAR ]
    unset VAR
fi

1 ответ1

1

Вот функция:

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

Здесь это используется. Для начала у нас есть два каталога:

$ ls -d */
a1/  a2/

Мы определяем четыре переменные оболочки, которые могут или не могут вычисляться в каталогах:

$ 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 каталогом. Если это не так, [ test оценивается как false и выполняется unset "$d" .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .