while循环只运行一次

while循环只运行一次

我正在编写一个简单的 bash 脚本来检查系统上的磁盘使用情况。 while 循环应该只打印 85% 或以上的分区。 90% 以上有两个分区,但只有第一个分区被打印到输出。

代码:

#!/bin/bash
admin="[email protected]"
threshold="85"

df -h | tail -n +2 | awk '{print $1 " " $5}' | sed 's/.$//' | while read i; do
  part=$(echo $i | awk '{print $1}')
  util=$(echo $i | awk '{print $2}')
    if [ $util -ge $threshold ]; then
      echo $part is ${util}% full. An email has been sent to your administrator.
      mail -s "Critical: $part is ${util}% full. Clear space immeadiately!" $admin
    fi
done

输出:

/dev/mapper/rootvg-root is 92% full. An email has been sent to your administrator.

但是,您可以看到 /dev/mapper/rootvg-apps 也已满 98%:

/dev/mapper/rootvg-apps            20G   20G  445M  98% /apps
/dev/mapper/rootvg-tmp            6.0G  2.4G  3.7G  39% /tmp
/dev/mapper/rootvg-var_log        6.0G   71M  6.0G   2% /var/log
/dev/xvda1                        497M  142M  356M  29% /boot

答案1

我认为你的df -h输出有问题。

尝试用df -Ph

更新:

根据手册页,-P引用 POSIX 输出格式

-P, --portability
    use the POSIX output format

而且,如果您的分区具有更长的长度,并且在使用命令(不带-P)进行文本处理时,您的预期行输出将分为两行。

期望(示例):

/dev/mapper/rootvg-tmp/tmp1   86
/dev/mapper/rootvg-tmp/tmp2   90
/tmp   90

实际输出(示例):

/dev/mapper/rootvg-tmp/tmp1
86
/dev/mapper/rootvg-tmp/tmp2
90
/tmp   90

因此,在这种情况下,脚本中的条件将与前两个分区不匹配,因为'{print $2}'将不匹配且$util -ge $threshold为 false。

华泰

相关内容