Подтвердить что ты не робот

Преобразование переменной в целое

В приведенном ниже списке команд появится предупреждение, если на страницу загружено более 6 секунд. Проблема в том, что переменная myduration не является целым числом. Как преобразовать его в целое число?

myduration=$(curl http://192.168.50.1/mantisbt/view.php?id=1 -w %{time_total}) > /dev/null ; [[ $myduration -gt 1 ]] && echo "`date +'%y%m%d%H%M%S'` took more than 6 seconds to load the page http://192.168.50.1/mantisbt/view.php?id=1 " >> /home/shantanu/speed_report.txt
4b9b3361

Ответ 1

Предполагая, что $myduration является десятичным или целым числом

$ myduration=6.5
$ myduration=$( printf "%.0f" $myduration )
$ echo $myduration
6

Ответ 2

Устранить содержимое страницы из переменной:

Когда я попробовал вашу команду, myduration содержал содержимое HTML страницы по URL-адресу, который я использовал в своем тесте, плюс значение времени. Добавив -s для подавления индикатора выполнения и добавления -o /dev/null к параметрам curl, я смог удалить перенаправление на /dev/null и иметь только время, сохраненное в myduration.

Так как значение myduration, вероятно, будет коротким, вы можете использовать технику ire_and_curses, которая часто приводит к нулю в качестве результата, который будет меньше, чем 1, который вы тестируете (обратите внимание, что в вашем сообщении в журнале указано "6 секунд" ).

Более точное разрешение:

Если вы хотите получить более тонкое разрешение, вы можете умножить myduration на 1000 с помощью такой техники:

mult1000 () {
    local floor=${1%.*}
    [[ $floor = "0" ]] && floor=''
    local frac='0000'
    [[ $floor != $1 ]] && frac=${1#*.}$frac
    echo ${floor}${frac:0:3}
}

Изменить: эта версия mult1000 правильно обрабатывает такие значения, как "0.234", "1", "2.", "3.5", и "6.789". Для значений с более чем тремя десятичными знаками дополнительные цифры усекаются без округления независимо от значения ( "1.1119" становится "1.111" ).

Ваш script с изменениями, упомянутыми выше, и использованием mult1000 (с моим собственным примером времени):

myduration=$(curl -s -o /dev/null http://192.168.50.1/mantisbt/view.php?id=1 -w %{time_total}); [[ $(mult1000 $myduration) -gt 3500 ]] && echo "`date +'%y%m%d%H%M%S'` took more than 3.5 seconds to load the page http://192.168.50.1/mantisbt/view.php?id=1 " >> /home/shantanu/speed_report.txt

Здесь он разбит на несколько строк (и упрощен), чтобы сделать его более читаемым здесь в этом ответе:

myduration=$(curl -s -o /dev/null http://example.com -w %{time_total})
[[ $(mult1000 $myduration) -gt 3500 ]] &&
  echo "It took more than 3.5 seconds to load thttp://example.com" >> report.txt

Ответ 3

Это не совсем понятно, но я думаю, вы спрашиваете, как преобразовать значение с плавающей запятой (myduration) в целое число в bash. Что-то вроде этого может помочь вам, в зависимости от того, каким образом вы хотите округлить свой номер.

#!/bin/bash

floor_val=
ceil_val=

function floor() {
    float_in=$1
    floor_val=${float_in/.*}
}

function ceiling() {
    float_in=$1
    ceil_val=${float_in/.*}
    ceil_val=$((ceil_val+1))
}


float_val=$1
echo Passed in: $float_val
floor $float_val
ceiling $float_val

echo Result of floor: $floor_val
echo Result of ceiling: $ceil_val

Пример использования:

$ ./int.sh 12.345
Passed in: 12.345
Result of floor: 12
Result of ceiling: 13

Ответ 4

Вы можете сделать это:

float=1.23
int=${float%.*}

Я использую это на bash.