我正在尝试编写一个简单的脚本:
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