Je commence à apprendre à écrire des scripts pour le terminal bash, mais je ne peux pas trouver comment faire fonctionner correctement les comparaisons. Le script que j'utilise est:
echo "enter two numbers";
read a b;
echo "a=$a";
echo "b=$b";
if [ $a \> $b ];
then
echo "a is greater than b";
else
echo "b is greater than a";
fi;
Le problème est qu'il compare le nombre à partir du premier chiffre, c'est-à-dire que 9 est supérieur à 10, mais 1 est supérieur à 09.
Comment puis-je convertir les nombres en un type pour faire une vraie comparaison?
;
fin de ligne est superflue. Ne pas faire de mal, juste un gaspillage de touches (sauf si vous aimez taper des points-virgules).10#$number
ainsinumber=09; echo "$((10#$number))"
sera généré9
tandis queecho $((number))
produira une erreur "valeur trop grande pour la base".>
opérateur fait dans la[
commande est de comparer l'ordre dans lequel les deux chaînes doivent être triées, plutôt que l'ordre dans lequel elles seraient triées sous forme de nombres. Vous pouvez trouver plus d'informations dansman test
.Réponses:
En bash, vous devriez faire votre vérification dans un contexte arithmétique :
Pour les shells POSIX qui ne prennent pas en charge
(())
, vous pouvez utiliser-lt
et-gt
.Vous pouvez obtenir une liste complète des opérateurs de comparaison avec
help test
ouman test
.la source
"$a" -gt "$b"
c'est la bonne réponse. Voici une bonne liste d'opérateurs de test: Constructions de test .test
un programme tel quel[
.help test
Donne donc des informations à ce sujet. Pour savoir ce que les intégrés ([[
et((
) faites, vous devez utiliserhelp bash
et accéder à cette partie.Clair et simple
Vous pouvez consulter cette feuille de triche si vous voulez plus de comparaisons de nombres dans le monde merveilleux de Bash Scripting.
En bref, les entiers ne peuvent être comparés qu'à:
la source
"$a"
et"$b"
ne sont pas strictement nécessaires , mais ils sont de bonnes pratiques. Les accolades ne font rien d'utile ici."
obligatoires ou sont-ils[ $a -eq $b ]
également très bien?if [[ $a -eq $b ]];then
Il y a aussi une bonne chose que certaines personnes ne connaissent peut-être pas:
Ce code imprime le plus petit nombre de
a
etb
la source
b
sia == b
.echo "The smaller number is $(( a < b ? a : b ))."
a < b
c'est toujours vrai sia == b
. Je ne connais pas tous les caprices des conditionnels de Bash, mais il y a presque certainement des situations où cela ferait une différence.a == b
, est alorsa < b
évalué à faux, c'est pourquoi il s'imprimeb
.Dans Bash, je préfère faire cela car il s'adresse plutôt à une opération conditionnelle contrairement à l'utilisation
(( ))
qui est plus arithmétique.A moins que je fasse des trucs complexes comme
Mais chacun a ses propres préférences. Ce qui est triste, c'est que certaines personnes imposent leurs normes officieuses.
Mise à jour:
Vous pouvez également le faire:
Ce qui vous permet d'ajouter autre chose que vous pourriez faire en
[[ ]]
plus des trucs arithmétiques.la source
[[ ]]
force un contexte arithmétique comme(( ))
, oùN
est traité comme s'il l'était$N
, mais je ne pense pas que ce soit correct. Ou, si ce n'était pas l'intention, l'utilisation deN
etM
prête à confusion.[[
commande,Arg1
etArg2
sont évalués comme des expressions arithmétiques [...]".NUMBER=0.0; while [[ "$NUMBER" -lt "1.0" ]]; do
et ça ditbash: [[: 0.0: syntax error: invalid arithmetic operator (error token is ".0")
Ce code peut également comparer des flottants. Il utilise awk (ce n'est pas du pur bash), mais cela ne devrait pas poser de problème, car awk est une commande POSIX standard qui est très probablement livrée par défaut avec votre système d'exploitation.
Pour raccourcir son utilisation, utilisez cette fonction:
la source
bash
ne parviens pas à les comparer correctement (essayezif (( 18446744073692774399 < 8589934592 )); then echo 'integer overflow'; fi
).awk
fonctionne comme un charme (if awk "BEGIN {return_code=(18446744073692774399 > 8589934592) ? 0 : 1; exit} END {exit return_code}"; then echo 'no integer overflow'; fi
).Si vous avez des flottants, vous pouvez écrire une fonction puis l'utiliser, par exemple
la source
Le support (par exemple,
[[ $a -gt $b ]]
ou(( $a > $b ))
) n'est pas suffisant si vous souhaitez également utiliser des nombres flottants; il signale une erreur de syntaxe. Si vous souhaitez comparer des nombres flottants ou un nombre flottant à un entier, vous pouvez utiliser(( $(bc <<< "...") ))
.Par exemple,
Vous pouvez inclure plusieurs comparaisons dans l'instruction if. Par exemple,
C'est utile si vous voulez vérifier si une variable numérique (entière ou non) se trouve dans une plage numérique.
la source
if [ "$(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b; fi
if [ $(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b"; fi
? (Je pense que votre commande a été mal écrite.) Si oui, cela fonctionne aussi. La commande Bash Calculator (bc) est une commande de calculatrice de base. Quelques autres exemples d'utilisation trouvés ici et ici . Je ne sais pas pourquoi mon exemple de commande n'a pas fonctionné pour vous.J'ai résolu cela en utilisant une petite fonction pour convertir les chaînes de version en valeurs entières simples qui peuvent être comparées:
Cela fait deux hypothèses importantes:
Par exemple
Exemple testant si
npm
commande répond aux exigences minimales ...la source