Сравнение чисел с плавающей точкой в bash
В моем собственном скрипте bash для мониторинга сервера, который фактически заставил мой сервер CentOS предпринять некоторые действия и предупредить меня, если ресурсы перегружены дольше, чем ожидалось, я получаю следующую ошибку
строка 17: [: 5.74: ожидается целочисленное выражение *
Теперь по определению все результаты iostat являются числами с плавающей точкой, и я уже использовал awk
в моей команде iostat (WAIT), как я могу заставить мой сценарий 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
1 ответ
Обычно вам нужно использовать что-то кроме родной математики оболочки, как описано в BashFAQ # 22. Однако, поскольку вы сравниваете с целыми числами, это легко: вы можете просто усечь в десятичной точке.
[ "${UPTIME%%.*}" -gt 600 ] # truncates your UPTIME at the decimal point
[ "${WAIT%%.*}" -gt 50 ] # likewise