磁盘空间使用脚本错误
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 有点古老,所以最终,一种更新的语言,如perl
或python
将是长期的方式。强大的字符串操作和计算。它们被编译成虚拟机,因此运行速度更快。而且,他们有很好的诊断信息。 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;
【讨论】:
如何忽略结果的第一行以上是关于磁盘空间使用脚本错误的主要内容,如果未能解决你的问题,请参考以下文章