【问题标题】:integer expression expected error.整数表达式预期错误。
【发布时间】:2014-08-04 22:09:59
【问题描述】:

我不知道为什么会出现这个错误 --> : integer expression expected: [: 82 值 82 来自 CURRENT。我正在尝试获取磁盘空间使用情况并分配给名为 CURRENT 的变量,然后通过电子邮件发送出去。我不知道我哪里出错了?任何帮助表示赞赏。

#!/bin/bash
ADMIN=email@email.com
THRESOLD=80
CURRENT=$(df -H | grep '/dev/mapper/cvs-cvs' | awk '{ print $5}' | cut -d'%' -f1)
if  [ $CURRENT -ge $THRESOLD ]; then 
    echo "My CVS disk space usage is $CURRENT %" | mailx -s "Disk Space Usage" $ADMIN
fi

【问题讨论】:

  • 运行bash -x script.sh
  • set -vx 是 shell 调试器/详细模式。在您怀疑代码行之前添加它,然后查看从 CURRENT 和 THRESHOLD 替换的值。祝你好运。

标签: linux bash shell unix sh


【解决方案1】:

可能您的脚本是 DOS 格式,分配包括 \r 附加到数字的额外值会导致错误。尝试先使用以下任一命令进行转换:

sed -i 's|\r||' script
dos2unix script

【讨论】:

  • 在我看来很像。错误消息: integer expression expected: [: 82 是一个赠品——: integer expression expected 部分应该在行尾,而不是开头,但由于错误的字符串是82\r,它会在开头结束。
【解决方案2】:

您的 CURRENT 值似乎没有从命令替换输出中分配给整数。

我建议在您想要的目录上运行df,然后解析输出。

#!/bin/bash
ADMIN=email@email.com
THRESOLD=80
read -ra DF_OUT < <(df -H /dev/mapper/cvs-cvs 2>&1|tail -n 1)
if [[ ${DF_OUT[@]} != "df:"* ]]; then
    CURRENT=${DF_OUT[4]/\%/}
    if [ $CURRENT -ge $THRESOLD ]; then 
        echo "My CVS disk space usage is $CURRENT %" | mailx -s "Disk Space Usage" $ADMIN 
    fi
else
    echo -e "df encountered the following error:\n$DF_OUT"
fi

这首先检查df 输出上的错误,然后再继续解析结果以了解磁盘使用情况。

正如其他人所建议的,将-x 与脚本一起使用有助于诊断问题。

【讨论】:

  • 您遇到的错误是什么?您是否按照@konsolebox 在他的解决方案中的建议删除了\r 字符?如果您的脚本按原样工作,您可以使用它,我的解决方案只是一个设计差异,以验证 df 输出没有任何错误。
  • 您的脚本很好,但对我不起作用。 konsolebox 解决方案对我有用。编写脚本后,您必须执行 sed -i 's|\r||' script.sh 并删除 \r 并正常执行。感谢帮助。我赞成你的回答。
【解决方案3】:

试试

#!/bin/bash
ADMIN=email@email.com
let "THRESOLD=80"
declare -i CURRENT
let CURRENT=$(df -H | grep '/dev/sda1' | awk '{ print $5}' | cut -d'%' -f1)
if (($CURRENT >= $THRESOLD )) ; then
    echo "My CVS disk space usage is $CURRENT %" | mailx -s "Disk Space Usage" $ADMIN
fi

【讨论】:

  • 这是我得到的错误 --> sh Disk_Space_Emailer.sh ") 语法错误:算术运算符无效(错误标记是“':不是有效的标识符 4:声明:`CURRENT”)语法错误:无效的算术运算符(错误标记是“Disk_Space_Emailer.sh:第 6 行:((:> =:语法错误:操作数预期(错误标记是“>=”)
  • 你用什么编辑器来编辑你的脚本?什么操作系统
  • sublimetext,你推荐哪个编辑器?视窗 7
  • ?那么,如果在 win7 上编辑,你在哪里运行 bash 脚本?赛格温?许多 Windows 编辑器使用 \n\r 来终止行,如果您使用 \r 运行 bash 脚本,您将收到意外错误,并且可能会花费数小时尝试调试。如上所述,您想要更改编辑器上的设置以使用 linux \n 行终止而不是 \n\r。 sublimetext.com/docs/file-type-preferences 为 bash 脚本搜索你想要 'unix' 的默认行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多