我想创建一个脚本来读取此文件: active_users包含用户名:email@email.com,然后搜索每个用户的磁盘使用情况,如果磁盘使用量大于限制1)向用户发送电子邮件2)将用户名和这些文件保存到文件 - > users_over_quota.My问题即使我在active_users中只有一个用户我的输出文件 - > files_over_quota重复记录。我认为它需要空白的eof行。我怎么能阻止它?。这就是我到目前为止所做的:
#!/bin/bash
filename='active_users'
while read -r line; do
name=$(echo $line | awk -F ":" '{print $1}')
email=$(echo $line | awk -F ":" '{print $2}')
mailto=$email
subject="/home/$name disk usage"
echo "USERNAME:$name" >>files_over_quota
find /home/$name -type f -size +500M -exec basename {} \; >> files_over_quota
#grep -v '^$' active_users >>files_over_quota
#mail -s "$subject" $email < /dev/null
echo "Username and files over limit were saved !"
done <$filename
答案 0 :(得分:1)
这是您提供的代码的替代版本。它将跳过$filename
中的空白行。
#!/bin/bash
filename='active_users'
while IFS=":" read -r name email ; do
case ${name:-emptyLine} in
emptyLine ) continue ;;
esac
mailto="$email"
subject="/home/$name disk usage"
echo "USERNAME:$name" > "$name".files_over_quota
find /home/"$name" -type f -size +500M -exec basename {} \; >> files_over_quota
#grep -v '^$' active_users >> "$name".files_over_quota
mail -s "$subject" $email < "$name".files_over_quota
echo "Username and files over limit were saved !"
done <"$filename"
它还为每个用户保留单独的文件,因此当您发送电子邮件时,不会为所有用户输出。
另请注意,我已经&#34;归零&#34;使用
处理顶部的overQuota文件 echo "USERNAME:$name" > $name.files_over_quota
否则,overQuota文件将永远变大。
在循环处理中,
请注意,在这种情况下,使用$name
告诉$email
将输入行拆分为基于字段的字段,可以更轻松地填充IFS=:"
和read
:
。
并且您可以使用短case
语句捕获空行。 shell将转换${name:-
emptyLine} to just the string
emptyLine if there is no value found in
$ name`。
我没有看到你使用mailto
,所以也许你可以删除它。
我已使用dbl-quotes在代码中附加了大多数变量,因为http://shellcheck.net提醒了我这一点。 :-) 我没有简单的方法来测试这个,所以如果你遇到错误,请告诉我。
IHTH