backup.sh脚本报‘integer expression expected’错误的原因及解决方法
问题原因与修复方案
错误原因
你的脚本触发错误是因为df -H的输出包含表头行(比如默认第一行是Use% Filesystem),当while read读取这一行时,usage变量被赋值为字符串Use,而非数字。而[ "$usage" -ge "$alert" ]中的-ge是整数比较运算符,无法处理字符串与整数的比较,因此抛出integer expression expected错误。
修复方法
方法1:跳过df的表头行(用tail)
在df -H后添加tail -n +2,直接跳过第一行表头:
#!/bin/bash alert=90 backup_date=$(date +'%m/%d/%y %H:%M:%S') df -H | tail -n +2 | awk '{print $5 " " $1}' | while read output; do #echo "Disk Detail: $output" usage=$(echo $output | awk '{print $1}' | cut -d'%' -f1) file_sys=$(echo $output | awk '{print $2}') #echo $usage if [ "$usage" -ge "$alert" ] then echo "CRITICAL FOR $file_sys" fi done
方法2:在awk中直接跳过表头(更高效)
利用awk的NR>1条件(行号大于1时才执行操作),省去额外的tail命令:
#!/bin/bash alert=90 backup_date=$(date +'%m/%d/%y %H:%M:%S') df -H | awk 'NR>1 {print $5 " " $1}' | while read output; do usage=$(echo $output | awk '{print $1}' | cut -d'%' -f1) file_sys=$(echo $output | awk '{print $2}') if [ "$usage" -ge "$alert" ] then echo "CRITICAL FOR $file_sys" fi done
方法3:合并逻辑到awk中(最简洁高效)
把所有判断逻辑放到awk里,减少管道和子进程调用,优化脚本性能:
#!/bin/bash alert=90 df -H | awk -v alert="$alert" 'NR>1 { # 提取百分比数字(去掉末尾的%) usage = substr($5, 1, length($5)-1) if (usage >= alert) { print "CRITICAL FOR " $1 } }'
内容的提问来源于stack exchange,提问作者Rohit_B
相关产品推荐
相关产品推荐

