好的,我得到了这个:
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 -> 丢失!!!