脚本中的整数预期错误

时间:2018-08-24 21:07:15

标签: bash scripting

我正在尝试编写一个简单的脚本来监视磁盘使用情况。我不断收到integer expression expected errors at line 5。 (THRESHOLD的值被故意设置为较低以进行测试。)

这是我的剧本

#!/bin/bash
CURRENT=$(df -hP | grep / | awk '{ print $5}' | sed 's/%//g')
THRESHOLD=10

if [ "$CURRENT" -gt "$THRESHOLD" ] ; then
    mail -s 'Disk Space Alert' john.kenny@ngc.com << EOF
Your root partition remaining free space is critically low. Used: $CURRENT%
EOF
fi

我的屏幕输出看起来像这样

./monitor_disk_space.sh: line 5: [: 7
0
22
1
1
1
1
1
1: integer expression expected

我是bash脚本的新手,尤其是awk。任何建议,将不胜感激。

3 个答案:

答案 0 :(得分:0)

如您所见,您正在从管道中获取一串用换行符分隔的值。该字符串本身不是整数,因此无法与$THRESHOLD进行比较。

假设您要发送消息,如果任何文件系统已满$THRESHOLD%,则可以使用

df -hP |  awk '/\// { sub("%", "", $5); print $5 }' |
while read number; do
    if [ "$number" -gt "$THRESHOLD" ]; then
        mail ...
        break
    fi
done

这会将值一个一个地传递到一个循环中,将其与$THRESHOLD进行比较。如果值更大,则发送邮件,并退出循环(通过break)。

我还自由地将您的管道缩短为df + awk,因为awk不仅能够胜任grep和{{ 1}}。

如果只想检查根分区,请在上面的管道中使用sed

答案 1 :(得分:0)

CURRENT=$(df -hP | grep / | awk '{ print $5}' | sed 's/%//g')

df -hp显示磁盘使用情况摘要。

grep /过滤出标题行。

awk '{print $5}'打印第5列,这是每个文件系统的使用百分比。

sed 's/%//g'删除%字符。 (只有一个,因此g是不必要的。我可能使用过tr -d %,但这并不重要。)

$(...)捕获以上内容的输出-这将是多行输出,每行应包含一个整数。

-gt运算符的每个参数都需要一个单个整数。

我认为问题出在grep /,它打印出每行包含一个/字符的行(除了标题行,可能会是所有行)。您的消息表明您对根文件系统感兴趣。

grep /更改为grep /$是一种简单的解决方案。

但是将/作为参数传递给df命令,这样甚至更简单地显示根文件系统的用法

这就是我的做法:

CURRENT=$(df / | awk 'NR == 2 { print $5 }' | tr -d %)

您可以将%字符的删除合并到awk命令中,但这会有些复杂。

答案 2 :(得分:0)

为什么不在awk中做所有事情?

$ df -hP | 
  awk -v th=10 '/\// {if($5+0>th) 
       system("echo Your ... " $5 " | mail -s \"Disk Space Alert\" xxx@example.com")}'