Pages : 1
#1 Le 25/02/2008, à 04:39
- jcvittet
test if [ $variable -gt valeur ]
Dans le test if [ $variable -gt valeur ]
valeur peut elle avoir des décimales ?
merci
#2 Le 25/02/2008, à 06:53
- Laurent82
Re : test if [ $variable -gt valeur ]
en bash avec des doubles crochets :
if [[ 3.34 > 3.33 ]] ; then echo OK ; fi
tu n'as pas posté dans le bon salon
#3 Le 26/02/2008, à 14:24
- hells_dark
Re : test if [ $variable -gt valeur ]
Même si c'est pas le bon forum..
Je capte pas bien l'histoire des doubles crochets..
Parfois ça marche sans, et parfois même, ça ne marche pas avec..
Il faut les utiliser quand exactement ?
Edit : je viens de lire qu'il fallait mettre des doubles crochets quand le test portait sur des variables oO
Dernière modification par hells_dark (Le 26/02/2008, à 14:39)
"You caught me at a strange time in my life."
devianArt - site perso
Hors ligne
#4 Le 26/02/2008, à 15:33
- Alain.g
Re : test if [ $variable -gt valeur ]
Le problème vient plutôt de l'opérateur -gt (-lt etc...) qui ne permet que de comparer des entiers.
On peut très bien utiliser le simple crochet [ , mais dans ce cas l'opérateur ">" doit être échappé :
if [ 3.14 \> 3.13 ] ; then echo OK ; fi
___
je viens de lire qu'il fallait mettre des doubles crochets quand le test portait sur des variables
Je ne sais pas où tu as lu ça mais c'est faux. on peut très bien faire des tests sur des variables avec [ (équivalent de la commande "test" en interne)
[[ est en quelques sortes une version étendue de [ , qui offre plus de possibilités.
Par exemple utiliser des métacaractères du shell (* ? [a-z] ..)
[[ abc = *a* ]] && echo OK
voir des regex depuis bash 3 avec l'opérateur =~
exemple (bidon)
[[ abc123 =~ ^[a-z]{3}[123]+$ ]] && echo OK
ou encore d'utiliser les opérateurs && ou || à l'intérieur :
[[ abc = *a* || abc = *1* ]] && echo OK
Dernière modification par Alain.g (Le 26/02/2008, à 15:38)
Xubuntu Karmic !
Hors ligne
#5 Le 26/02/2008, à 17:03
- hells_dark
Re : test if [ $variable -gt valeur ]
Haaaaa !
Merci beaucoup Alain.g, ça c'est clair
"You caught me at a strange time in my life."
devianArt - site perso
Hors ligne
#6 Le 26/02/2008, à 20:07
- jeromeg
Re : test if [ $variable -gt valeur ]
Hop, déplacé dans la section Programmation, la section Trucs et Astuces sert à donner des astuces.
Hors ligne
#7 Le 28/02/2008, à 15:16
- kaworu
Re : test if [ $variable -gt valeur ]
Bonjour !
Le problème vient plutôt de l'opérateur -gt (-lt etc...) qui ne permet que de comparer des entiers.
On peut très bien utiliser le simple crochet [ , mais dans ce cas l'opérateur ">" doit être échappé :if [ 3.14 \> 3.13 ] ; then echo OK ; fi
Attention (!). avec test ou [ il faut utiliser les opérateurs avec des lettres (-lt,-gt,-eq...)
quand on travaille avec des nombres entiers, et les opérateurs =,<,>... seulement avec les chaînes de caractères.
En effet > fait un test littérale:
[ 17 \> 160 ] && echo OUPS
Quand on veut comparer des nombres à virgules, il faut utiliser let ou expr:
# avec let
let 'bool = 3.14 > 3.13'
if [ $bool -eq 1 ]; then echo OUF; fi
# avec expr
if expr 3.14 \> 3.13 >/dev/null; then echo OUF; fi # Ici on doit rediriger la sortie de expr vers /dev/null, sinon le script affiche 1.
if [ `expr 3.14 \> 3.13` -eq 1 ]; then echo OUF; fi
let est un built-in du shell, donc toujours présent et bien plus performant que expr (appel externe).
La dernière ligne est vraiment mauvaise, elle crée un sous-shell juste pour calculer l'expression.
Personnelement j'utiliserai let, qui est portable/performant/lisible
[[ est plus agréable à utiliser que [/test, mais ça ne marche (presque) que sous bash. Donc si on veut un script
portable il vaut mieux utiliser [ et/ou test.
"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."
Hors ligne
#8 Le 28/02/2008, à 15:32
- Alain.g
Re : test if [ $variable -gt valeur ]
Merci pour la correction kaworu
on peut également utiliser bc
Exemple en bash :
if ((`bc<<<'3.14>3.13'`)) ; then echo OK ; else echo BAD ; fi
Edit : en fait non, ce n'est pas bon avec expr, même problème qu'avec [[ :
if expr 17.14 \> 160.13 >/dev/null; then echo OUPS; fi
ne semble pas fonctionner avec let non plus
Dernière modification par Alain.g (Le 16/09/2008, à 15:42)
Xubuntu Karmic !
Hors ligne