如何检查有效的 $PATH 目录,并输出它们以判断每个目录是否有效?

如何检查有效的 $PATH 目录,并输出它们以判断每个目录是否有效?

好的,我得到了这个:

check="${PATH//:/'\n'}"

上面以简化的方式获取了每条路径,并将其很好地格式化为变量。现在我如何检查每一行是否存在,并结合回显来声明每一行(我想我会使用回显。)?

我知道它可能涉及 for 或 while 循环,但我不知道如何做到这一点。

巴什请只回答。

答案1

while read -d: dir
do
    [ -d "$dir" ] || echo "Missing: $dir"
done <<<"${PATH%:}:"

read -d: dir将输入读入变量dir,破坏 处的输入:

[ -d "$dir" ]测试目录是否存在

||仅当前面的语句返回 false 时才执行后面的语句。

<<<"${PATH%:}:"使用a向循环提供输入这里的字符串。该表单"${PATH%:}:"确保:遵循 PATH 字符串。这是分两步完成的。第一个用途后缀去除, ${PATH%:}, 从 PATH 中删除尾随(:如果有)。其次,添加一个冒号。

答案2

这结合了本文发布时存在的三个答案1的最佳部分(如果您想查看这些答案,请按“最旧”对答案进行排序),并添加了略有不同的方法John1024 在做什么:

IFS=: read -a path_components <<< "$PATH"
for dir in "${path_components[@]}"
do
    printf "%s\t-> " "$dir"
    if [ -d "$dir" ]
    then
        echo "Exists."
    else
        echo "Missing!!!!"
    fi
done

IFS=:本质上与 John 做同样的事情read -d:;它会在以下位置中断输入:(而不是在空格或制表符处);因此,就像约翰的回答一样,这可以正确处理名称中带有空格的目录。  read -a path_components将输入读入A阵列; "${path_components[@]"展开为数组成员的列表。请注意,echo "$dir"如果$dir-或包含一个\. (诚​​然,这些对于 . 中的目录名来说很少见$PATH)  如果包含.printf "$dir"则可能很危险。 _______ 1其中一个在我撰写此答案时已被删除$dir%

答案3

你也可以尝试一下这个方法:

#!/bin/bash

arr=$(echo $PATH | tr ":" "\n")

for x in $arr
do
    echo -n "$x"
     if [ -d "$x" ];then
        echo " -> Exists"
     else
         echo -e " -> \e[31mMissing!!!!\e[0m"
     fi
done

arr=$(echo $PATH | tr ":" "\n")目录拆分为变量,然后echo -e在显示中添加红色以引起注意。

输出将如下所示:

/usr/lib/qt-3.3/bin -> 存在

/usr/local/sbin -> 存在

/usr/local/bin -> 存在

/sbin->存在

/bin -> 存在

/usr/sbin -> 存在

/usr/bin -> 存在

/root/bin -> 丢失!!!

相关内容