シェルコマンドを変数として出力するには?

シェルコマンドを変数として出力するには?

簡単なスクリプトを作成しようとしています。

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を使用するのではなく、目的を達成する方法は次のとおりです。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

duもちろん、Archemarがすでに述べたように、出力をループに直接パイプしない理由はありません。

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

おすすめ記事