Cette commande interne est utilisée pour effectuer des opérations arithmétiques.
Syntaxe : (( expr_arith ))
Son fonctionnement est le suivant : expr_arith est évaluée ; si cette évaluation donne une valeur différente de 0, alors le code de retour de la commande interne (( est égal à 0 sinon le code de retour est égal à 1.
Il est donc important de distinguer deux aspects de la commande interne (( expr_arith )) :
la valeur de expr_arith issue de son évaluation et
le code de retour de (( expr_arith )).
Attention : la valeur de expr_arith n'est pas affichée sur la sortie standard.
$ (( -5 )) => la valeur de l'expression arithmétique est égale à -5 (c.-à-d. $ => différente de 0), donc le code de retour de (( est égal à 0 $ echo $? 0 $ $ (( 0 )) => la valeur de l'expression arithmétique est 0, donc le code de retour $ => de (( est égal à 1 $ echo $? 1 $
Les opérateurs permettant de construire des expressions arithmétiques évaluables par bash sont issus du langage C (ex : = + - > <=).
$ declare -i a=2 b $ (( b = a + 7 )) $
Le format d'écriture est libre à l'intérieur de la commande ((. En particulier, plusieurs caractères espace ou tabulation peuvent séparer les deux membres d'une affectation.
Il est inutile d'utiliser le caractère de substitution $ devant le nom d'une variable car il n'y a pas d'ambiguïté dans l'interprétation ; par contre, lorsqu'une expression contient des paramètres de position, le caractère $ doit être utilisé.
$ date sam. 22 janv. 2022 14:22:27 CET $ $ set $(date) $ $ (( b = $2 +1 )) => incrémentation du jour courant $ $ echo $b 23 $
Code de retour de (( et structures de contrôle :
Le code de retour d'une commande interne (( est souvent exploité dans une structure de contrôle if ou while.
Le programme shell dix ci-dessous affiche les dix chiffres :
#!/bin/bash declare -i i=0 while (( i < 10 )) do echo $i (( i = i + 1 )) # ou (( i++ )) done
Son fonctionnement est le suivant : l’expression i < 10 est évaluée, sa valeur est vraie, le code de retour de (( i < 10 )) est égal à 0, le corps de l’itération est exécuté. Après affichage de la valeur 9, la valeur de i devient égale à 10. L’expression i < 10 est évaluée, sa valeur est maintenant fausse, le code de retour de (( i < 10 )) est égal à 1, l’itération se termine.
$ dix 0 1 2 3 4 5 6 7 8 9 $