Comme tout est fichier sous Linux, tout est chaîne sous bash.
Oui! Techniquement, il n'y a pas de types de données dans Bash. Essentiellement, les variables Bash ne sont que des chaînes de caractères.
Et cela crée un problème lorsque vous essayez d'effectuer des opérations arithmétiques dans bash. Les nombres que vous essayez d'ajouter vous donnent des résultats bizarres.
[email protected]:~$ sum=3+6
[email protected]:~$ echo $sum
3+6
Pour convertir des chaînes en entiers dans bash, enveloppez-les dans $((X)). Comme ceci :
$((string))
Si la chaîne a un numéro identifiable, elle sera traitée comme un numéro. L'exemple que j'ai montré ci-dessus peut être corrigé comme :
[email protected]:~$ sum=$((3+6))
[email protected]:~$ echo $sum
9
Tout ce que vous faites dans $((...)) est considéré comme une opération arithmétique. Voyons un peu plus en détail la conversion des chaînes en nombres afin que vous puissiez utiliser les calculs arithmétiques en bash.
Convertir des variables de chaîne en nombres
Déclarons quelques "nombres" qui sont essentiellement des chaînes de caractères.
[email protected]:~$ a=11
[email protected]:~$ b=3
Vous pouvez vérifier le numéro attribué :
[email protected]:~$ echo $a
11
[email protected]:~$ echo $b
3
Essayons maintenant d'additionner les deux nombres et de stocker la valeur dans une troisième variable c
:
[email protected]:~$ c=$a+$b
[email protected]:~$ echo $c
11+3
Comme vous pouvez le voir sur la sortie ci-dessus, c est également traité comme une chaîne.
Pour réussir l'addition, vous devez la "convertir" par une expansion arithmétique :
[email protected]:~$ c=$(($a+$b))
[email protected]:~$ echo $c
14
Notez que c
est toujours en fait une chaîne, jusqu'à ce que vous réutilisiez implicitement le même développement arithmétique pour une autre opération dont je parlerai plus tard.
[email protected]:~$ c=$((5))
Ce qui précède est équivalent à :
[email protected]:~$ c=5
Utilisons une troisième variable d
pour une autre opération :
[email protected]:~$ d=10
Toutes ces déclarations implicites sont toujours des chaînes. C'est la même chose que la façon dont j'avais défini a
et b
plus tôt.
Passons maintenant à la seconde opération :
[email protected]:~$ e=$(($a+$b*$c-$d))
[email protected]:~$ echo $e
16
Dans l'expression ci-dessus, le produit de b et c est calculé en premier et enfin l'addition et la soustraction suivent.
Comme je l'ai mentionné précédemment, tout ce que vous faites entre $((...)) est considéré comme une opération arithmétique.
Toute cette conversion fonctionne pour les entiers. Cela ne fonctionnera pas avec des virgules flottantes, c'est-à-dire des nombres avec des virgules décimales.Essayez de mélanger des chaînes et des nombres réels
Mélanger des chaînes et des nombres entiers est toujours plus sûr que de mélanger du coca et de la menthe. Cela produit cependant un résultat étrange.
[email protected]:~$ sum=$((3+hello))
[email protected]:~$ echo $sum
3
Cela ne fonctionnera que lorsqu'il y a des nombres (sous forme de chaîne). S'il s'agit d'une chaîne de caractères pure, elle ne sera pas convertie par magie en certains nombres. Au lieu de cela, il est ignoré comme vous pouvez le voir dans l'exemple ci-dessus.
Méthode alternative :utilisez expr
Vous pouvez également utiliser le expr
outil pour faire l'évaluation, mais notez qu'il ne s'agit pas d'une procédure Bash "native", car vous devez disposer de coreutils
installé (par défaut sur Ubuntu) en tant que package séparé.
[email protected]:~$ expr $a + $b \* $c - $d
16
J'espère que ce petit tutoriel rapide vous a aidé à évaluer les chaînes bash en tant que nombres. Si vous avez des questions ou des suggestions, n'hésitez pas à laisser un commentaire ci-dessous.