2009-09-01 145 views
12

如果頁面加載時間超過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' 

花了超過6秒加載頁面http://192.168.50.1/mantisbt/view.php?id=1

回答

18

假定$ myduration是一個十進制或整數

$ myduration=6.5 
$ myduration=$(printf "%.0f" $myduration) 
$ echo $myduration 
6 
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 
+0

上限函數實際上是錯誤的,因爲./int.sh 12.0將返回13.0根據上限函數的定義返回12(最小整數不小於x) – dm76 2014-12-12 14:45:22

+0

@ dm76 - 是的,該邊界情況是一個好的觀點。 – 2014-12-12 16:11:14

2

從變量消除頁面內容:

當我想你的命令,myduration包含頁面的HTML內容,在我使用的URL我的測試加上時間值。通過添加-s來抑制進度條並將-o /dev/null添加到curl的選項中,我可以將重定向移除到/dev/null,並且只有在myduration中保存的時間。

由於myduration值很可能是短,就可以使用該技術ire_and_curses顯示哪會經常產生零,其結果是將小於1,你是爲測試(請注意,您的日誌消息說但是「6秒」)。

更高的分辨率:

如果你想有一個更精細的分辨率測試,可以使用的技術像這樣乘以1000 myduration

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 
+0

mult1000功能嚴重誤導:$(mult1000 1.2)!=「1200」。 – 2009-09-01 15:39:38

+0

它可能會使用一個更好的名稱,但它可以與'mult1000 1.200'一起使用,正如我在關於尾隨零的說明中所指出的那樣。如果需要的話,很容易使它適用於你的例子。 – 2009-09-01 15:47:09

+0

我的簡單功能也不能正確處理小於1的值,例如「0.234」 – 2009-09-01 16:00:17

1

你可以這樣做:

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

我用這對慶典。