2009-09-01 11 views
12

Le script shell ci-dessous affichera un avertissement si le chargement de la page prend plus de 6 secondes. Le problème est que la variable myduration n'est pas un nombre entier. Comment puis-je le convertir en entier?Convertir une variable à virgule flottante en entier?

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' 

Il a fallu plus de 6 secondes pour charger la page http://192.168.50.1/mantisbt/view.php?id=1

Répondre

18

en supposant myDuration $ est un nombre décimal ou entier

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

Il est pas tout à fait clair, mais je pense vous demandez comment convertir une valeur en virgule flottante (myduration) à un nombre entier au bash. Quelque chose comme ça peut vous aider, selon la manière dont vous voulez arrondir votre nombre.

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

Exemple d'utilisation:

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

la fonction de plafond est réellement faux car ./int.sh 12.0 renverra 13.0 où il devrait retourner 12 selon la définition de la fonction de plafond (le plus petit nombre entier non inférieur à x) – dm76

+0

@ dm76 - Oui, ce cas de bord est un bon point. –

2

Éliminez contenu de la page de la variable:

Quand j'ai essayé votre commande, myduration contenait le contenu HTML de la page à l'URL je en mon test plus la valeur temps. En ajoutant -s pour supprimer la barre de progression et en ajoutant -o /dev/null aux options pour curl, j'ai pu supprimer la redirection vers /dev/null et n'avoir que le temps enregistré en myduration.

Puisque la valeur de myduration est susceptible d'être bref, vous pouvez utiliser la technique ire_and_curses montre qui donnent souvent zéro son résultat qui serait inférieur au 1 vous testez (notez que votre message de journal dit "6 secondes", cependant).

résolution Finer:

Si vous souhaitez avoir un test plus fine résolution, vous pouvez multiplier myduration par 1000 en utilisant une technique comme ceci:

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

Edit: Cette version de mult1000 gère correctement les valeurs telles que "0,234", "1", "2", "3,5" et "6,789". Pour les valeurs avec plus de trois décimales, les chiffres supplémentaires sont tronqués sans arrondir quelle que soit la valeur ("1.1119" devient "1.111").

Votre script avec les changements que je mentionnés ci-dessus et en utilisant mult1000 (avec mon propre exemple le temps):

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 

Ici, il est divisé en plusieurs lignes (et simplifiée) pour le rendre plus lisible dans cette réponse :

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

Cette fonction mult1000 est gravement trompeuse: $ (mult1000 1.2)! = "1200". –

+0

Il pourrait probablement utiliser un meilleur nom, mais il fonctionne avec 'mult1000 1.200' comme je l'ai indiqué dans mes remarques sur les zéros de fin. Si cela est nécessaire, il est assez facile de le faire fonctionner avec votre exemple. –

+0

Ma fonction simpliste ne gère pas correctement les valeurs inférieures à un, comme "0.234" –

1

Vous pouvez le faire:

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

J'utilise ceci sur bash.

Questions connexes