複数行変数のユーザー権限をチェックするシェル

複数行変数のユーザー権限をチェックするシェル

ある時点で、複数のフォルダーのユーザー権限を確認する必要があるスクリプトを作成しようとしています。パスは変数に保存され、各パスは新しい行に格納されます。

これまでのところ、私はこれを持っています:

output=$PATH
output=$(echo "$output" | tr ':' '\n' | sort )                                                                                                                                                         
arr=($(echo "$output"))                                                                                                                                                                                                           
for i in "$arr"                                                                                                                                                                                                                   
do                                                                                                                                                                                                                                
    echo "$i"                                                                                                                                                                                                                     
    if ! [[ -x $i ]]; then                                                                                                                                                                                                        
        echo "You are missing execute Permission on
        echo "$i"                                                                                                                                                                                  
    fi                                                                                                                                                                                                                            
done 

出力にはいくつかのパスが含まれますが、私の場合は変数の内容です$PATH

最初の行では、複数行の変数を配列に変換し、すべての配列要素を反復処理します。

コードを実行すると、最初のエントリに対してのみ機能し、ループを終了する前にecho "$i"のみ表示されます。/bin

したがって、複数行の変数を配列に変換しなかったと思われます。

答え1

交換する:

    for i in "$arr"

と:

    for i in "${arr[@]}"

$arr配列の最初の要素のみを参照します。 {$arr[@]}各要素は個別の単語としてすべての要素に展開されます。

また、bash 4.0 以降をお持ちの場合は、以下をarr1 つの手順で作成できます。

mapfile -t arr <<<"${PATH//:/$'\n'}"

関連情報