我有一个由应用程序提供的文件,将相关目录添加到 $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 行 10x3 更好的方法解决这个问题?
if [ ! -d $VAR ]
unset VAR
fi
答案1
这是一个函数:
_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }
下面是它的使用情况。首先,我们有两个目录:
$ ls -d */
a1/ a2/
我们定义了四个 shell 变量,它们可能会或可能不会计算到目录:
$ 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
为目录。如果不是,则[
测试结果为 false 并unset "$d"
执行该子句。