Получение целочисленного значения из команды ping для скрипта - PullRequest
1 голос
/ 02 февраля 2012

Когда я запускаю ping -c 1 -q ipaddress | awk -F"/" '{print $6}', я получаю значение 0.123 ($MAXTIME для этого пинга)

Но когда я пытаюсь использовать его (как целочисленное значение), происходит сбой с этими:

#!/bin/bash

MAXTIME=`ping -c 1 -q 172.200.201.18 | awk -F"/" '{print $6}' | xargs`

if [ $MAXTIME > 0.4 ]
then 
  echo "ALERT ALERT ALERT - Slow time"
  echo "Actual max time $MAXTIME is greater than 0.400 ms"
  echo "Napping..."                
  sleep 10
else
  echo "Fast ping - OK"
  echo "Napping..."                
  sleep 10
fi

Я получаю «ошибку» на выходе:

ALERT ALERT ALERT - Slow time
Actual max time 0.193 is greater than 0.400 ms
Napping...

Если я изменю оператор на [ $MAXTIME > 0.1 ]:

ALERT ALERT ALERT - Slow time
Actual max time 0.258 is greater than 0.100 ms
Napping...

Если я изменю операторна [ $MAXTIME > 1 ]:

ALERT ALERT ALERT - Slow time
Actual max time 0.324 is greater than 1.000 ms
Napping...

Похоже, логика неисправна (поскольку она всегда возвращает истину) и, возможно, $MAXTIME не является числовым значением?Как сделать это числовое значение для использования в операторе if / then?

1 Ответ

1 голос
/ 02 февраля 2012

В вашем коде оператор > интерпретируется как перенаправление. Поэтому, если вы посмотрите на свой каталог, вы найдете пустые файлы с именами файлов: 0.4, 0.1 и 1 из-за ваших тестов из вашего вопроса.

Для значений с плавающей точкой (ваш случай)

if expr "$MAXTIME" '<' 0.4    >/dev/null

Для целочисленных значений вы также можете использовать:

if [  "$MAXTIME" -lt 4  ]    #the most portable way
if (( "$MAXTIME"   > 4 ))    #(if you use bash) this one is the most readable
if [[  $MAXTIME  -lt 4 ]]    #(if you use bash) double-quotes (") are not required

ИНФОРМАЦИЯ: Двойные кавычки " предотвращают присутствие пробелов или любых других специальных символов в $MAXTIME. Это может произойти, например, если ваш сценарий используется на компьютере с другой версией ping, которая ведет себя не так.

...