簡単なスクリプトを作成しようとしています。
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