【问题标题】:Comparing floating-point numbers in bash [duplicate]比较bash中的浮点数[重复]
【发布时间】:2017-02-10 16:57:29
【问题描述】:

在我用于服务器监控的自定义 bash 脚本中,实际上是为了强制我的 CentOS 服务器采取一些措施并在资源超载的时间超过预期时提醒我,我收到以下错误

第 17 行:[: 5.74: 需要整数表达式 *

现在,根据定义,所有 iostat 结果都是浮点数,我已经在 iostat 命令 (WAIT) 中使用了awk,那么如何让我的 bash 脚本期待一个而不是整数?

** 值 5.74 代表当前 iostat 结果

#!/bin/bash

if [[ "`pidof -x $(basename $0) -o %PPID`" ]]; then
#       echo "Script is already running with PID `pidof -x $(basename $0) -o %PPID`"
        exit
fi

UPTIME=`cat /proc/uptime | awk '{print $1}' | cut -d'.' -f1`
WAIT=`iostat -c | head -4 |tail -1 | awk '{print $4}' |cut -d',' -f1`
LOAD=`cat /proc/loadavg |awk '{print $2}' | cut -d'.' -f1`

if [ "$UPTIME" -gt 600 ]
then
        if [ "$WAIT" -gt 50 ]
        then
                if [ "$LOAD" -gt 4 ]
                then
                        #action to take (reboot, restart service, save state sleep retry)
                        MAIL_TXT="System Status: iowait:"$WAIT" loadavg5:"$LOAD" uptime:"$UPTIME"!"
                        echo $MAIL_TXT | mail -s "Server Alert Status" "mymail@foe.foe"
                        /etc/init.d/httpd stop
#                       /etc/init.d/mysql stop
                        sleep 10
#                       /etc/init.d/mysql start
                        /etc/init.d/httpd start
                fi
        fi
fi

CentOS 6.8 版(最终版)2.6.32-642.13.1.el6.x86_64

【问题讨论】:

  • Bash 只有整数数学;你需要使用bash以外的工具(比如awk)来做浮点数。
  • 但是,这更容易(容易得多!),因为您要与整数常量进行比较。
  • 顺便说一句,在 bash 中做浮点数学一般是BashFAQ #22
  • ...另外,不需要cat | awk | cut -- awk 可以完成所有三个工具的工作。 awk '{ print int($1) }' < /proc/uptime。使用cat foo | bar 通常比bar <foo 效率低——实际上,如果读取其输出的内容类似于sort 可以启动多个线程来处理,那么使用cat 会使事情效率降低很多当给定一个可查找的句柄时,文件的不同部分是并行的,因为根据定义,管道只能从前面读取(所以你不能让多个线程同时读取不同的部分)。
  • 为了获取 iowait 百分比为整数,我可能会使用 iostat -c | awk 'NR == 4 { print int($4 * 100) }'

标签: linux bash shell monitoring iostat


【解决方案1】:

通常,您需要使用原生 shell 数学以外的东西,如 BashFAQ #22 中所述。但是,由于您是在与整数进行比较,所以这很容易:您可以在小数点处截断。

[ "${UPTIME%%.*}" -gt 600 ] # truncates your UPTIME at the decimal point
[ "${WAIT%%.*}" -gt 50 ]    # likewise

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2015-09-06
    • 2023-04-05
    相关资源
    最近更新 更多