2009-09-01 31 views
12

El script de shell que se muestra a continuación mostrará una advertencia si la página tarda más de 6 segundos en cargarse. El problema es que la variable myduration no es un número entero. ¿Cómo lo convierto a entero?¿Convertir variable de punto flotante a entero?

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' 

Se tardó más de 6 segundos para cargar la página http://192.168.50.1/mantisbt/view.php?id=1

Respuesta

18

Suponiendo $ myduration es un número decimal o entero

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

No está del todo claro, pero piensan que estás preguntando cómo convertir un valor de punto flotante (myduration) a un entero en bash. Algo como esto puede ayudarte, dependiendo de la forma en que quieras redondear tu número. el uso

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

Ejemplo:

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

la función de techo es realmente incorrecta ya que ./int.sh 12.0 devolverá 13.0 donde debería regresar 12 según la definición de la función de techo (el entero más pequeño no menos de x) – dm76

+0

@ dm76 - Sí, ese borde es un buen punto. –

2

Eliminar el contenido de la página de la variable:

Cuando traté de su comando, myduration contenía el contenido HTML de la página de la URL que utilicé en mi prueba más el valor del tiempo Al agregar -s para suprimir la barra de progreso y agregar -o /dev/null a las opciones para curl, pude eliminar la redirección a /dev/null y solo tengo el tiempo guardado en myduration.

Dado que es probable que sea corta el valor de myduration, puede utilizar la técnica de ire_and_curses muestra que a menudo producir cero como resultado de lo cual sería inferior al 1 está tratando de detectar (tenga en cuenta que su mensaje de registro dice "6 segundos", sin embargo).

resolución más fina:

Si le gustaría tener una prueba de resolución más fina, se puede multiplicar por myduration 1000 usando una técnica como esta:

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

Editar: Esta versión de mult1000 maneja correctamente valores tales como "0.234", "1", "2.", "3.5" y "6.789". Para valores con más de tres decimales, los dígitos adicionales se truncan sin redondeo, independientemente del valor ("1.1119" se convierte en "1.111").

Su guión con los cambios que he mencionado anteriormente y utilizando mult1000 (con mi propio ejemplo el tiempo):

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 

Aquí se divide en varias líneas (y simplificada) para que sea más fácil de leer aquí en esta respuesta :

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

Esa función mult1000 es muy engañosa: $ (mult1000 1.2)! = "1200". –

+0

Probablemente podría usar un nombre mejor, pero funciona con 'mult1000 1.200' como indiqué en mis comentarios sobre los ceros al final. Si eso es necesario, es bastante fácil hacerlo funcionar con tu ejemplo. –

+0

Mi función simplista tampoco maneja adecuadamente valores de menos de uno, como "0.234" –

1

Usted puede hacer esto:

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

estoy usando esto en bash.

Cuestiones relacionadas