将浮点型变量转换为整数?

16

下面展示的shell脚本将在页面加载超过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'

加载页面 http://192.168.50.1/mantisbt/view.php?id=1 花费了超过6秒的时间。

4个回答

31

假设$myduration是一个十进制或整数

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

7
您可以这样做:
float=1.23
int=${float%.*}

我正在Bash中使用这个。

2

虽然不是很清楚,但我认为您想知道如何在bash中将浮点数(myduration)转换为整数。根据您想要四舍五入的方式,以下代码可能会有所帮助。

#!/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

天花板函数实际上是错误的,因为<code>./int.sh 12.0</code>将返回13.0,而根据天花板函数的定义(不小于x的最小整数),它应该返回12。 - dm76

2

从变量中删除页面内容:

当我尝试您的命令时,myduration 包含了我在测试中使用的 URL 页面的 HTML 内容以及时间值。通过添加 -s 来抑制进度条,并添加 -o /dev/nullcurl 的选项中,我能够去掉重定向到 /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

mult1000函数非常误导人:$(mult1000 1.2) != "1200"。 - glenn jackman
它可能需要一个更好的名称,但是它确实可以与mult1000 1.200一起使用,就像我在关于尾随零的评论中所指出的那样。如果需要的话,很容易让它与你的示例一起工作。 - Dennis Williamson
我的简单函数也不能正确处理小于1的值,例如“0.234”。 - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接