Преобразовать переменную с плавающей точкой в ​​целое число? - PullRequest
12 голосов
/ 01 сентября 2009

Сценарий оболочки, показанный ниже, покажет предупреждение, если загрузка страницы занимает более 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'

Загрузка страницы заняла более 6 секунд http://192.168.50.1/mantisbt/view.php?id=1

Ответы [ 4 ]

20 голосов
/ 02 сентября 2009

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

$ myduration=6.5
$ myduration=$( printf "%.0f" $myduration )
$ echo $myduration
6
2 голосов
/ 01 сентября 2009

Исключить содержимое страницы из переменной:

Когда я попробовал вашу команду, 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»).

Ваш скрипт с изменениями, которые я упомянул выше и использующими 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
1 голос
/ 17 апреля 2015

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

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

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

1 голос
/ 01 сентября 2009

Это не совсем понятно, но я думаю вы спрашиваете, как преобразовать значение с плавающей точкой (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...