You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:39:21