
我正在嘗試編寫一個簡單的腳本:
stat=$(du /home/test/)
for i in "$stat"; do
folder=$("$i" | awk '{print $2}')
mail -s $folder [email protected]
done
我在 shell 中運行腳本,輸出如下:
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
這是因為沒有雙引號。雙引號的輸出與 shell 中的輸出相同。因此,在循環變數 $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
當然,正如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