comparaison d'entiers et les nombres à virgule flottante en script shell
En shell script comment peut-on comparer (entiers et à virgule flottante) ,(flaoting point et virgule flottante),(virgule flottante et en entier) (entier et entier) avec un seul si la condition.
j'ai quelques exemples comme
set X=3.1
set Y=4.1
if [ $X < $Y ] then
echo "wassup"
endif
Mais l'exécution de l'-dessus de tâche cron n'a pas l'air de travailler.
- Double Possible de Bash: Integer expression attendue
Vous devez vous connecter pour publier un commentaire.
La façon de mener les opérations à virgule flottante en bash est d'utiliser bc qui est disponible sur presque toutes les distributions linux.
Il y a un bon article disponible sur linux journal à propos de calcul en virgule flottante dans un bash à l'aide de la colombie-britannique.
$(echo "$a > $b" | bc)
ne retourne pas de valeur. Pouvez-vous essayer le shell interne est exécuté sur son propre?echo $X
sera une ligne vide, par exemple.Bah elle-même ne s'occupe que des entiers. La colombie-britannique:
Vous n'avez pas besoin de vous soucier de l'échelle. C'est juste pour le preocision de formats de sortie:
exemple ci-dessous fonctionne sur le shell bash.
vous pouvez apprendre script shell ici
$ test "34.4" -gt "5.4" -> bash: test: 34.4: integer expression expected
bash --version
me donneGNU bash, version 4.2.8(1)-release (x86_64-pc-linux-gnu)
MODIFIER. sur la base des commentaires de cette réponse (merci à utilisateur inconnu et glenn jackman), il semble que lors de l'utilisation de
bc
pour un vrai/faux test, lesbash
test est tout simplement:(( $(echo "$X < $Y" |bc) ))
... voir les résultats du test et le script ci-dessouswheras, la comparaison de
-ne 0
est nécessaire pour l'ancien style bash[ ]
test.bash
n'intègre pas nativement manipuler des nombres à virgule flottante, mais vous pouvez faire appel à un utilitaire tel quebc
De
man bc
- Une précision arbitraire calculatrice langueRésultats du TEST:
Script de TEST:
scale
est superflu, si vous voulez juste tester pour de vrai et de faux.!=0
est superflu trop - ce qui est déjà fait.!=0
est pas superflu: bc imprime 0 ou 1 pour faux ou vrai. Dans les deux cas, le exit status est égal à zéro. Donc, vous devez comparer la sortie de la commande pour quelque chose.if (($(echo "$X > $Y" | bc))) ; then echo wassup; else echo pussaw; fi
. Raison: $(...) capture à la sortie. ((...)) évalue.