
У меня есть файл, источником которого является приложение, добавляющее соответствующие каталоги в $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
(not $VAR1 $VAR2 $VAR3
), но теперь у меня есть строки, которые не расширяются.
Использование eval
могло бы решить эту проблему для меня, но другие вопросы, ответы, веб-сайты и т. д. говорят о том, что это, как правило, плохая идея.
Как можно решить эту задачу лучше, чем 30 строк 10x3?
if [ ! -d $VAR ]
unset VAR
fi
решение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
каталогом. Если это не так,[
тест оценивается как ложный иunset "$d"
выполняется предложение.