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
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.
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.
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.
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
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
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.
Voici ma solution simple:
BaseLine=70.0 if [ $string \> $BaseLine ] then echo $string else echo "TOO SMALL" fi