Dans le script shell bash comment convertir une chaîne en un nombre

Hé, je voudrais convertir une chaîne en nombre

x="0.80"

#I would like to convert x to 0.80 to compare like such:
if[ $x -gt 0.70 ]; then

echo $x >> you_made_it.txt 

fi 

pour le moment, j'obtiens l'expression entière d'erreur attendue parce que j'essaie de comparer une chaîne.

merci

11
demandé sur PJT 2009-11-24 02:49:39

7 réponses

Pour une raison quelconque, cette solution fait appel à moi:

if ! echo "$x $y -p" | dc | grep > /dev/null ^-; then
  echo "$x > $y"
else
  echo "$x < $y"
fi

vous aurez besoin d'être sûr que $x et $y sont valides (eg contient seulement des nombres et zéro ou un ".') et, selon l'âge de votre dc, vous devrez peut-être spécifier quelque chose comme '10k' pour le faire reconnaître les valeurs non entières.

2
répondu William Pursell 2009-11-24 08:23:53

vous pouvez utiliser bc

$ echo "0.8 > 0.7" | bc
1
$ echo "0.8 < 0.7" | bc
0
$ echo ".08 > 0.7" | bc
0

Vous pouvez donc vérifier 0 ou 1 dans votre script.

14
répondu ghostdog74 2009-11-24 00:35:00

Bash ne comprend pas les nombres à virgule flottante. Il ne comprend que les entiers.

Vous pouvez soit passer à un langage de script plus puissant (Perl, Python, Ruby...) ou de faire tous les calculs à l'aide de bc ou similaire.

2
répondu Warren Young 2009-11-23 23:52:14

utiliser awk

x="0.80"
y="0.70"
result=$(awk -vx=$x -vy=$y 'BEGIN{ print x>=y?1:0}')
if [ "$result" -eq 1 ];then
    echo "x more than y"
fi
1
répondu ghostdog74 2009-11-23 23:56:13

si vos valeurs sont garanties pour être dans la même forme et gamme, vous pouvez faire des comparaisons de chaîne:

if [[ $x > 0.70 ]]
then
    echo "It's true"
fi

Ce sera un échec si x est ".8" (pas zéro), par exemple.

cependant, alors que Bash ne comprend pas les décimales, son builtin printf peut les formater. Tu pourrais t'en servir pour normaliser tes valeurs.

$ x=.8
$ x=$(printf %.2 $x)
$ echo $x
0.80
1
répondu Dennis Williamson 2016-03-02 14:44:27

le langage bash est mieux caractérisé comme un macro processeur complet, comme tel il n'y a pas de différence entre les nombres et les chaînes. Le problème est que test (1) fonctionne sur des entiers.

0
répondu DigitalRoss 2009-11-23 23:53:00

Voici ma solution simple:

 BaseLine=70.0         
 if [ $string \> $BaseLine ]
 then
      echo $string
 else
      echo "TOO SMALL"
 fi
0
répondu Haimei 2016-10-11 19:20:39