
簡単なスクリプトを書こうとしています:
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