有効な$PATHディレクトリを確認して出力して、各ディレクトリが有効であることをどのように確認しますか?

有効な$PATHディレクトリを確認して出力して、各ディレクトリが有効であることをどのように確認しますか?

わかりました。次の情報を入手しました。

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 ->紛失! ! !

関連情報