シェルコマンドを変数に出力するにはどうすればよいですか?

シェルコマンドを変数に出力するにはどうすればよいですか?

簡単なスクリプトを書こうとしています:

stat=$(du /home/test/)
for i in "$stat"; do
folder=$("$i" | awk '{print $2}')
mail -s $folder [email protected]
done

シェルでスクリプトを実行すると、出力は次のようになります。

4       /home/test/.config/mc/mcedit
12      /home/test/.config/mc
16      /home/test/.config

次に、ループの前にスクリプトに echo を挿入すると、出力は次のようになります。

4 /home/test/.config/mc/mcedit 12 /home/test/.config/mc 16 /home/test/.config

これは二重引用符がないためです。二重引用符を使用すると、出力はシェルの場合と同じになります。したがって、ループ サイクル変数 $folder 内の変数に二重引用符を使用すると、期待どおりに機能しません。代わりに、リストのすべての値が含まれます。

これを解決するにはどうすればよいですか?

答え1

forループではなく 1 つのループを使用して、目的を達成する方法は次のとおりですwhile

stat=$(du /home/test/)
echo "$stat" | while read i; do
    folder=$(echo "$i" | awk '{print $2}')
    echo "mail content" | mail -s $folder [email protected]
done

もちろん、Archemar がすでにコメントしているように、du出力をループに直接パイプしない理由はありません。

du /home/test/ | while read i; do
    folder=$(echo "$i" | awk '{print $2}')
    echo "mail content" | mail -s $folder [email protected]
done

Awk実際には必要ありません。スクリプトは次のように簡略化できます。

du /home/test/ | while read size folder; do
    echo "mail content" | mail -s "$folder" [email protected]
done

計算するように設計されているディレクトリ サイズを使用していないようなのでdu、代わりに以下を使用できますfind

find /home/test -type d | while read folder; do
    echo "mail content" | mail -s "$folder" [email protected]
done

関連情報