わかりました。次の情報を入手しました。
check="${PATH//:/'\n'}"
上記は、各パスを単純化された方法で取り、それを変数としてきれいにフォーマットします。では、各行が存在することを確認し、echoと組み合わせて各行を宣言するかどうかを確認します(echoを使用するようです)。
おそらくforまたはwhileループが関連していることを知っていますが、どうすればよいかわかりません。
強く打つ答えだけをしてください。
答え1
while read -d: dir
do
[ -d "$dir" ] || echo "Missing: $dir"
done <<<"${PATH%:}:"
read -d: dir
入力を変数として読み、dir
その時点の入力を削除します:
。
[ -d "$dir" ]
ディレクトリが存在するかテスト
||
次の文は、前の文がfalseを返した場合にのみ実行されます。
<<<"${PATH%:}:"
以下を使用してループに入力を提供します。ここにある文字列。この形式を"${PATH%:}:"
使用すると、:
PATH文字列に従います。これは2段階で行われる。初めて使用サフィックスの削除、、、は${PATH%:}
PATHから末尾(:
ある場合)を削除します。第二に、コロンを追加します。
答え2
これは、この記事が公開されたときに存在していた3つの回答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:
入力を中断するので、:
Johnの答えと同様に、名前にスペースが含まれているディレクトリを正しく処理します。
read -a path_components
入力内容を読むㅏ配列;
"${path_components[@]"
配列メンバーのリストに展開されます。echo "$dir"
参照$dir
してください-
または.を含めます\
。 (もちろん、.のディレクトリ名にはこれらの名前はありません。$PATH
)。printf "$dir"
が含まれていると危険です。 ________ 1この回答を書いている間、そのうちの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 ->紛失! ! !