我正在尝试编写一个简单的脚本来监视磁盘使用情况。我不断收到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
。任何建议,将不胜感激。
答案 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")}'