将浮点变量转换为整数?

时间:2009-09-01 12:47:39

标签: bash floating-point integer

如果页面加载时间超过6秒,则下面显示的shell脚本将显示警告。问题是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'

加载页面http://192.168.50.1/mantisbt/view.php?id=1

花费的时间超过6秒

4 个答案:

答案 0 :(得分:20)

假设$ myduration是十进制或整数

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

答案 1 :(得分:2)

从变量中删除页面内容:

当我尝试你的命令时,myduration包含我在测试中使用的URL加上时间值的页面的HTML内容。通过添加-s来取消进度条并将-o /dev/null添加到curl的选项中,我可以将重定向移除到/dev/null并且只保留myduration的时间{1}}。

由于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

答案 2 :(得分:1)

目前还不完全清楚,但我想你问的是如何将浮点值(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

答案 3 :(得分:1)

你可以这样做:

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

我在bash上使用它。