磁盘空间使用脚本错误

Posted

技术标签:

【中文标题】磁盘空间使用脚本错误【英文标题】:Error on a disk space usage script 【发布时间】:2016-03-14 05:51:53 【问题描述】:

我尝试修改一个检查磁盘空间使用情况的小脚本,但遇到以下错误:

disk_space.sh: line 32: [: Use: integer expression expected

# Set alert limit, 90% we remove % for comparison
alert=90

# $1 is the partition name
# $5 is the used percentage
# Print the df -h, then loop and read the result 
df -h | awk ' print $1 " " $5 ' | while read output;
do

#echo $output

# Get partition name
partition=$(echo $output | awk ' print $1 ')
#echo 'Partition: ' $partition

# Used space with percentage
useSpPer=$(echo $output | awk ' print $2')
#echo 'Used space %: ' $useSpPer

#used space (remove percentage)
useSp=$(echo -n $useSpPer | head -c -1)
#echo 'Used space digit: ' $useSp

# Recap
#echo $useSp ' has ' $partition

# -ge is greatter than or equal
if [ $useSp -ge $alert ]; then # THIS LINE 32
echo $partition 'is running out of space with '$useSpPer

#else 
#echo 'Down'

fi
done

如果有人有想法,请提前感谢并感谢

【问题讨论】:

【参考方案1】:

set -x 放在脚本的顶部,以便它在执行前回显每一行是调试shell 脚本的好方法——您几乎肯定会发现其中一个变量(在[ 命令中使用)未按预期设置。

这是一个很好的一般性建议,但是,对于您已将问题定位的问题,将这一行放在产生问题的行之前可能就足够了(当然也不那么冗长):

echo "DEBUG [$useSp]"

如果你这样做,你会发现你检查的值根本不是一个数值。那是因为df -h 的输出看起来像这样:

Filesystem  Size  Used  Avail  Use%  Mounted on
/dev/sda1    48G  4.9G    40G   11%  /
/dev/sr0     71m   71M      0  100%  /media/cdrom0

这意味着,对于第一行,您会将单词 Use 与您的限制进行比较,而 [ 将无法很好地处理:

pax> if [ 20 -gt 10 ]; then echo yes; fi
yes
pax> if [ Use -gt 10 ]; then echo yes; fi
bash: [: Use: integer expression expected

修复相当简单。由于您不想对第一行做任何事情,您可以使用 existing awk 将其过滤掉:

df -h | awk 'NR>1print $1" "$5' | while read output;
do
    ...

NR>1 只处理第二个记录,以此类推,跳过第一个。

【讨论】:

这是结果:DEBUG [Use] [90] disk_space.sh: line 33: [: Use: integer expression expected DEBUG [78] [90] DEBUG [78] [90] DEBUG [ 1] [90] DEBUG [2] [90] DEBUG [0] [90] DEBUG [0] [90] DEBUG [99] [90] /dev/sda2 空间不足 99% 如何删除字符串为 USE 的行【参考方案2】:

您的useSp 值为“使用”[非数字],因此-ge 正在尝试将字符串与整数进行比较[并抱怨]。


更新:

根据您的要求,有几种方法可以修复您的脚本。

修复现有脚本是其中之一 [请参阅下面的修复]。但是,如您所见,这种在 bash 中的字符串操作可能有点冒险。

另一个是,因为您已经在 [在多个地方] 使用 awk,请重新编码脚本以在 awk 脚本 文件中完成大部分工作。例如:

df -h | awk -f myawkscript.awk

但是,awk 有点古老,所以最终,一种更新的语言,如perlpython 将是长期的方式。强大的字符串操作和计算。它们被编译成虚拟机,因此运行速度更快。而且,他们有很好的诊断信息。 IMO,与其学习更多 awk,不如开始学习 perl/python [因为,从专业上讲,需要使用这些语言进行编程]

但是,为了立即修复您现有的脚本: 老:df -h | awk ' print $1 " " $5 ' | while read output; 新:df -h | tail -n +2 | awk ' print $1 " " $5 ' | while read output;

【讨论】:

如何忽略结果的第一行

以上是关于磁盘空间使用脚本错误的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本完成用户磁盘空间监测报告

Linux之Shell脚本实战监控系统的磁盘空间使用率

sh 如果HP SmartArray磁盘出现问题,此脚本将发送错误电子邮件

linux shell脚本检测硬盘磁盘空间 邮件报警

Linux下Shell脚本实战之监测磁盘空间

浏览器 打不开qq空间 错误提示不支持js脚本