Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:programmation:shells:page-man-bash-iv-symboles-dans-les-calculs-mathematiques [26/02/2023 12:56] ubub [Les opérateurs bit-à-bit] |
doc:programmation:shells:page-man-bash-iv-symboles-dans-les-calculs-mathematiques [26/02/2023 21:22] agp91 [Les opérateurs bit-à-bit] |
||
---|---|---|---|
Ligne 29: | Ligne 29: | ||
Les commandes **let** et **<nowiki>((...))</nowiki>** sont les seules commandes internes que bash dispose pour réaliser des opérations mathématiques.\\ | Les commandes **let** et **<nowiki>((...))</nowiki>** sont les seules commandes internes que bash dispose pour réaliser des opérations mathématiques.\\ | ||
- | A travers elles, bash est limité à opérer que sur des entiers signés (positifs ou négatifs).\\ | + | A travers elles, bash est limité à n'opérer que sur des entiers signés (positifs ou négatifs).\\ |
Le résultat de l'évaluation d'une expression sera toujours un entier décimal signé. | Le résultat de l'évaluation d'une expression sera toujours un entier décimal signé. | ||
Ligne 53: | Ligne 53: | ||
</file> | </file> | ||
\\ | \\ | ||
- | Pour des raisons de rétrocompatibilités, elle est toujours active dans nos bash modernes.\\ | + | Pour des raisons de rétrocompatibilité, elle est toujours active dans nos bash modernes.\\ |
Mais viendra un jour où, **$[...]** ne sera plus. | Mais viendra un jour où, **$[...]** ne sera plus. | ||
</note> | </note> | ||
Ligne 363: | Ligne 363: | ||
| //expr1// **''<nowiki><<</nowiki>''** //expr2//| Décalage binaire à gauche | Renvoie le décalage de //expr2// bit(s) à gauche de //expr1//\\ (//expr2// 0 ajoutés(s) à droite d'//expr1//) | | | //expr1// **''<nowiki><<</nowiki>''** //expr2//| Décalage binaire à gauche | Renvoie le décalage de //expr2// bit(s) à gauche de //expr1//\\ (//expr2// 0 ajoutés(s) à droite d'//expr1//) | | ||
| //expr1// **''<nowiki>>></nowiki>''** //expr2//| Décalage binaire à droite | Renvoie le décalage de //expr2// bit(s) à droite de //expr1//\\ (//expr2// bit(s) tronqué(s) à droite d'//expr1//) | | | //expr1// **''<nowiki>>></nowiki>''** //expr2//| Décalage binaire à droite | Renvoie le décalage de //expr2// bit(s) à droite de //expr1//\\ (//expr2// bit(s) tronqué(s) à droite d'//expr1//) | | ||
- | | //epr//, //expr1//, //expr2// sont sujets aux développements||| | + | | //expr1//, //expr2// et //expr3//, sont sujettes au remplacement des paramètres (et des variables), à la substitution de commandes et à la suppression des protections. ||| |
Exemples | Exemples | ||
Ligne 380: | Ligne 380: | ||
* [[atelier:chantier:bash:operations-les-nombres-binaires|Opérations sur les nombres binaires]] | * [[atelier:chantier:bash:operations-les-nombres-binaires|Opérations sur les nombres binaires]] | ||
- | ===== Opérateurs, priorités ===== | + | ===== Les opérateurs conditionnels ===== |
+ | |||
+ | Les opérateurs conditionnels permettent de réaliser des opérations sous conditions.\\ | ||
+ | Les opérations sélectionnées sont déterminées selon une structure, **si** ... **alors** ... **sinon** ..., mais en plus succin. | ||
+ | |||
+ | | Les opérateurs conditionnels ||| | ||
+ | ^ opérateurs ^ Désignations ^ Explications ^ | ||
+ | | //expr1// **''?''** //expr2// **'':''** //expr3// | Opérateur\\ conditionnel | //epxr1// est comprise comme un booléen : **Vrai** (**!=0**) ou **faux** (**=0**)\\ Si //expr1// est vrai **''?''** (alors) //expr2// **'':''** (sinon) //expr3//. | | ||
+ | | //expr1//, //expr2// et //expr3//, sont sujettes au remplacement des paramètres (et des variables), à la substitution de commandes et à la suppression des protections. ||| | ||
+ | |||
+ | Exemples : | ||
+ | |||
+ | <code user> | ||
+ | echo $((24<42 ? 5 : 10 )) | ||
+ | let "24>42 ? (a=5) : (a=10)" | ||
+ | echo $a | ||
+ | |||
+ | unset a | ||
+ | </code><code> | ||
+ | 5 | ||
+ | 10 | ||
+ | </code> | ||
+ | |||
+ | Les conditions peuvent s'imbriquer : | ||
+ | |||
+ | <code user> | ||
+ | a=42 b=10 | ||
+ | echo $((a ? b > 0 ? 100 : -100 : 24 )) | ||
+ | b=-10 | ||
+ | echo $((a ? b > 0 ? 100 : -100 : 24 )) | ||
+ | a=0 | ||
+ | echo $((a ? b > 0 ? 100 : -100 : 24 )) | ||
+ | |||
+ | unset a b | ||
+ | </code><code> | ||
+ | 100 | ||
+ | -100 | ||
+ | 24 | ||
+ | </code> | ||
+ | |||
+ | Cela risque rapidement de devenir illisible, pour plus de clarté, nous pouvons utiliser des parenthèses. | ||
+ | |||
+ | <code user> | ||
+ | echo $((24<42 ? (b > 0 ? 100 :-100) : 24 )) | ||
+ | </code><code> | ||
+ | 24 | ||
+ | </code> | ||
+ | |||
+ | <note important> | ||
+ | Les opérateurs conditionnels sont deux et ne peuvent s'utiliser seuls.\\ | ||
+ | \\ | ||
+ | <code user> | ||
+ | ((24<42 ? 5)) | ||
+ | echo $? | ||
+ | ((24<42 : 5)) | ||
+ | echo $? | ||
+ | </code><code> | ||
+ | bash: ((: 24<42 ? 5 : « : » attendu pour une expression conditionnelle (le symbole erroné est « 5 ») | ||
+ | 1 | ||
+ | bash: ((: 24<42 : 5 : erreur de syntaxe dans l'expression (le symbole erroné est « : 5 ») | ||
+ | 1 | ||
+ | </code> | ||
+ | </note> | ||
+ | |||
+ | ===== Priorités des opérateurs ===== | ||
+ | |||
+ | La priorité des opérateurs précise l'ordre dans lequel les opérations sont effectués dans une expression complexe.\\ | ||
+ | L'associativité permet de définir l'ordre des opérations pour les opérateurs de même priorité.\\ | ||
+ | La priorité et l'associativité des opérateurs des commande **let** et **<nowiki>((...))</nowiki>** sont identiques au langage C. | ||
+ | |||
+ | | Priorités et associativité des opérateurs ||| | ||
+ | ^ Opérateurs ^ Désignations ^ Associativités ^ | ||
+ | | Les priorités sont classé ci-dessous par ordre décroissant.\\ Sur une même ligne, les opérateurs ont même priorité. ||| | ||
+ | | **''(''**...**'')''** | Parenthèses || | ||
+ | | expr**''++''** expr**''--''** | Post-incrément et post-décrément de variables | -> | | ||
+ | | **''-''** **''+''** | Moins et plus unaires | <- | | ||
+ | | **''++''**expr **''--''**expr | Pré-incrément et pré-décrément de variables | <- | | ||
+ | | **''!''** **''~''** | Négations logique et binaire | <- | | ||
+ | | **''<nowiki>**</nowiki>''** | Exponentiation (puissance) | | | ||
+ | | **''*''** **''/''** **''%''** | Multiplication, division, modulo | -> | | ||
+ | | **''+''** **''-''** | Addition, soustraction | -> | | ||
+ | | **''<nowiki><<</nowiki>''** **''<nowiki>>></nowiki>''** | Décalage arithmétique à gauche et à droite | -> | | ||
+ | | **''<nowiki><=</nowiki>''** **''<nowiki>>=</nowiki>''** **''<''** ***''>''** | Relationnels | -> | | ||
+ | | **''<nowiki>==</nowiki>''** **''<nowiki>!=</nowiki>''** | Egalité et différence | -> | | ||
+ | | **''&''** | ET binaire | -> | | ||
+ | | **''<nowiki>^</nowiki>''** | OU exclusif binaire | -> | | ||
+ | | **''<nowiki>|</nowiki>''** | OU binaire | -> | | ||
+ | | **''<nowiki>&&</nowiki>''** | ET logique | -> | | ||
+ | | **''<nowiki>||</nowiki>''** | OU logique | -> | | ||
+ | | **''?''** **'':''** | Opérateur conditionnel | <- | | ||
+ | | **''=''** **''<nowiki>*=</nowiki>''** **''<nowiki>/=</nowiki>''** **''<nowiki>%=</nowiki>''** **''<nowiki>+=</nowiki>''** **''<nowiki>-=</nowiki>''** **''<nowiki><<=</nowiki>''** **''<nowiki>>>=</nowiki>''** **''<nowiki>&=</nowiki>''** **''<nowiki>^=</nowiki>''** **''<nowiki>|=</nowiki>''** | Affectations | <- | | ||
+ | | **'',''** | Virgule | | | ||
+ | | Sources : Les priorités proviennent de page du manuel de bash (section ÉVALUATION ARITHMÉTIQUE), les associativités du C. ||| | ||
+ | |||
+ | |||
+ | Les parenthèses ont la priorité la plus haute, elles permettent d'outre passer toutes les autres. | ||
+ | |||
+ | Exemples : | ||
+ | |||
+ | <code user> | ||
+ | echo $(( 18 + 3 * 2 )) | ||
+ | |||
+ | echo $(( (18 + 3) * 2 )) | ||
+ | </code><code> | ||
+ | 24 | ||
+ | 42 | ||
+ | </code> | ||
===== Écriture utile pour les boucles ===== | ===== Écriture utile pour les boucles ===== | ||
===Post-incrémentation et pré-incrémentation :=== | ===Post-incrémentation et pré-incrémentation :=== | ||
Ligne 422: | Ligne 528: | ||
<note tip> | <note tip> | ||
En bref,\\ | En bref,\\ | ||
- | __**Post-incrémentation/décrémentation**__ : Les signes d'incrémentation (**''++''**) ou de décrémentation (**''<nowiki>--</nowiki>''**) sont placés **après** une valeur à incrémentée (+1) ou à décrémenter (-1) ; cette valeur est conservée dans "y" puis elle est **incrémentée (+1)** ou **décrémentée (-1)**.\\ | + | __**Post-incrémentation/décrémentation**__ : Les signes d'incrémentation (**''++''**) ou de décrémentation (**''<nowiki>--</nowiki>''**) sont placés **après** une valeur à incrémenter (+1) ou à décrémenter (-1) ; cette valeur est conservée dans "y" puis elle est **incrémentée (+1)** ou **décrémentée (-1)**.\\ |
- | __**Pré-incrémentation/décrémentation**__ : Les signes d'incrémentation (**''++''**) ou de décrémentation (**''<nowiki>--</nowiki>''**) sont placés **avant** une valeur à incrémentée ou à décrémenter ; cette valeur est **incrémentée (+1)** ou **décrémentée (-1)** puis elle est conservée dans "y". | + | __**Pré-incrémentation/décrémentation**__ : Les signes d'incrémentation (**''++''**) ou de décrémentation (**''<nowiki>--</nowiki>''**) sont placés **avant** une valeur à incrémenter ou à décrémenter ; cette valeur est **incrémentée (+1)** ou **décrémentée (-1)** puis elle est conservée dans "y". |
</note> | </note> | ||
=====Tuto précédent ===== | =====Tuto précédent ===== |