取消设置指向不存在目录的 bash 变量

取消设置指向不存在目录的 bash 变量

我有一个由应用程序提供的文件,将相关目录添加到 $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"执行该子句。

相关内容