磁盘空间使用脚本出错

时间:2015-12-09 04:20:24

标签: bash shell disk

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

  

disk_space.sh:第32行:[:使用:预期的整数表达式

# 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

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

2 个答案:

答案 0 :(得分:1)

set -x置于脚本的顶部,以便在执行之前回显每一行是调试shell脚本的好方法 - 您几乎肯定会找到其中一个变量(在{中使用) {1}}命令)未按预期设置。

这是一个很好的一般性建议但是,对于这个问题,你已经解决了这个问题,将这条线放在生成问题的线之前可能已经足够好了(当然也不那么冗长) :

[

如果您这样做,您会发现您要检查的值根本不是数值。这是因为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 对其进行过滤即可:

awk

df -h | awk 'NR>1{print $1" "$5}' | while read output; do ... 仅处理记录号码2,依此类推,跳过第一个记录。

答案 1 :(得分:1)

您的useSp值为"使用" [非数字],所以-ge试图将字符串与整数进行比较[并抱怨]。

<强>更新

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

修复现有脚本是[见下面的修复]。但是,当你发现时,bash中的这种字符串操作可能有点冒险。

另一个原因是,由于您已在[多个地方]使用awk,因此请重新编写脚本以执行awk 脚本文件中的大部分工作。例如:

df -h | awk -f myawkscript.awk

但是,awk有点古老,所以,最终,一种较新的语言,例如perlpython将是长期的方式。强大的字符串操作和计算。它们被编译为VM,因此运行速度更快。而且,他们有很好的诊断信息。 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;