logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
doc:programmation:shells:page-man-bash-iv-symboles-dans-les-calculs-mathematiques [26/02/2023 12:46]
ubub [Les opérateurs logiques]
doc:programmation:shells:page-man-bash-iv-symboles-dans-les-calculs-mathematiques [26/04/2023 19:29] (Version actuelle)
bendia [Les opérateurs bit-à-bit] Supression lien vers tuto en chantier inexistant
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 78: Ligne 78:
     * De la base 11 à la base 36, les lettres minuscules ou majuscules peuvent être utilisées indifféremment.     * De la base 11 à la base 36, les lettres minuscules ou majuscules peuvent être utilisées indifféremment.
     * De la base 37 à la base 64, les lettres minuscules, majuscules, @ et _ sont à utiliser dans cet ordre.     * De la base 37 à la base 64, les lettres minuscules, majuscules, @ et _ sont à utiliser dans cet ordre.
 +
 +Exemple :
 +<code user>
 +echo $(( 2#101010 )) # Nombre binaire (base 2)
 +</​code><​code>​
 +42
 +</​code>​
 ===== Les opérateurs arithmétiques ===== ===== Les opérateurs arithmétiques =====
  
Ligne 85: Ligne 92:
 ^  Opérateurs ​ ^  Désignations ​ ^  Résultats ​ ^ ^  Opérateurs ​ ^  Désignations ​ ^  Résultats ​ ^
 | Opérateurs unaires ||| | Opérateurs unaires |||
-| **''​+''​** //expr// | Signe positif | Valeur de //expr// + **''​+''​** //​expr// ​   Signe positif ​    | Valeur de //​expr// ​ 
-| **''​-''​** //expr// | Signe négatif | Opposé de //expr// |+ **''​-''​** //​expr// ​   Signe négatif ​    | Opposé de //​expr// ​  |
 | Opérateurs binaires ||| | Opérateurs binaires |||
-| //expr1// **''​+''​** //expr2// | Addition | //expr2// ajouté à //expr1// + //expr1// **''​+''​** //​expr2// ​   Addition ​  | //expr2// ajouté à //​expr1// ​ 
-| //expr1// **''​-''​** //expr2// | Soustraction | //expr2// retiré de //expr1// + //expr1// **''​-''​** //​expr2// ​   Soustraction ​  | //expr2// retiré de //​expr1// ​ 
-| //expr1// **''​*''​** //expr2// | Multiplication| //expr1// multiplié par //expr2// + //expr1// **''​*''​** //​expr2// ​   Multiplication ​  | //expr1// multiplié par //​expr2// ​ 
-| //expr1// **''/''​** //expr2// | Division | //expr1// divisé par //expr2// + //expr1// **''/''​** //​expr2// ​   Division ​  | //expr1// divisé par //​expr2// ​ 
-| //expr1// **''​%''​** //expr2// | Modulo | Reste de la division de //expr1// par //​expr2//​ | + //expr1// **''​%''​** //​expr2// ​   Modulo ​  | Reste de la division de //expr1// par //​expr2// ​ 
-| //expr1// **''<​nowiki>​**</​nowiki>''​** //expr2//| Puissance ​ | //expr1// multiplié par lui-même //expr2// fois | + //expr1// **''<​nowiki>​**</​nowiki>''​** //​expr2// ​   Puissance ​  | //expr1// multiplié par lui-même //expr2// fois  
- +|  //expr//, //expr1// et //expr2//, sont sujettes au remplacement des paramètres (et des variables), à la substitution de commandes et à la suppression des protections. |||Exemples :
-Exemples :+
  
 <code user> <code user>
Ligne 150: Ligne 156:
 |  //var// **''​|=''​** //​expr// ​ |  Affectation par le OU binaire ​ |  //var// = //var// <​nowiki>​|</​nowiki>​ //​expr// ​ | |  //var// **''​|=''​** //​expr// ​ |  Affectation par le OU binaire ​ |  //var// = //var// <​nowiki>​|</​nowiki>​ //​expr// ​ |
 |  //var// **''​^=''​** //​expr// ​ |  Affectation par le OU exclusif binaire ​ |  //var// = //var// <​nowiki>​^</​nowiki>​ //​expr// ​ | |  //var// **''​^=''​** //​expr// ​ |  Affectation par le OU exclusif binaire ​ |  //var// = //var// <​nowiki>​^</​nowiki>​ //​expr// ​ |
- +| //expr//, est sujette au remplacement des paramètres (et des variables), à la substitution de commandes et à la suppression des protections. |||Exemples :
-Exemples :+
  
 <code user> <code user>
Ligne 240: Ligne 245:
 |  //expr1// **''<​nowiki>&&</​nowiki>''​** //​expr2// ​ |  ET logique ​ | 1 <​nowiki>&&</​nowiki>​ 1 = 1 (vrai ET vrai = vrai)\\ 1 <​nowiki>&&</​nowiki>​ 0 = 0 (vrai ET faux = faux)\\ 0 <​nowiki>&&</​nowiki>​ 1 = 0 (faux ET vrai = faux)\\ 1 <​nowiki>&&</​nowiki>​ 1 = 0 (faux ET faux = faux) | |  //expr1// **''<​nowiki>&&</​nowiki>''​** //​expr2// ​ |  ET logique ​ | 1 <​nowiki>&&</​nowiki>​ 1 = 1 (vrai ET vrai = vrai)\\ 1 <​nowiki>&&</​nowiki>​ 0 = 0 (vrai ET faux = faux)\\ 0 <​nowiki>&&</​nowiki>​ 1 = 0 (faux ET vrai = faux)\\ 1 <​nowiki>&&</​nowiki>​ 1 = 0 (faux ET faux = faux) |
 |  //expr1// **''<​nowiki>​||</​nowiki>''​** //​expr2// ​ |  OU logique ​ | 1 <​nowiki>&&</​nowiki>​ 1 = 1 (vrai OU vrai = vrai)\\ 1 <​nowiki>&&</​nowiki>​ 0 = 1 (vrai OU faux = vrai)\\ 0 <​nowiki>&&</​nowiki>​ 1 = 1 (faux OU vrai = vrai)\\ 0 <​nowiki>&&</​nowiki>​ 0 = 0 (faux OU faux = faux) | |  //expr1// **''<​nowiki>​||</​nowiki>''​** //​expr2// ​ |  OU logique ​ | 1 <​nowiki>&&</​nowiki>​ 1 = 1 (vrai OU vrai = vrai)\\ 1 <​nowiki>&&</​nowiki>​ 0 = 1 (vrai OU faux = vrai)\\ 0 <​nowiki>&&</​nowiki>​ 1 = 1 (faux OU vrai = vrai)\\ 0 <​nowiki>&&</​nowiki>​ 0 = 0 (faux OU faux = faux) |
-| //epr//, //expr1////expr2// sont sujets aux développements|||+| //expr//, //​expr1// ​et //expr2//sont sujettes au remplacement des paramètres (et des variables), à la substitution de commandes et à la suppression des protections. ​|||
  
 Exemples : Exemples :
Ligne 349: Ligne 354:
  
 Les opérateurs bit-bit, opèrent sur des nombres binaires (une suite de 0 ou de 1).\\  Les opérateurs bit-bit, opèrent sur des nombres binaires (une suite de 0 ou de 1).\\ 
-Les nombres sont d'abords ​convertis en binaire, l’opération est appliquée, puis le résultat est reconverti en décimal.+Les nombres sont d'abord convertis en binaire, l’opération est appliquée, puis le résultat est reconverti en décimal.
  
-<note important>​Les opérateurs bit-à-bit ne doivent être confondus avec les opérateurs logiques</​note>​+<note important>​Les opérateurs bit-à-bit ne doivent ​pas être confondus avec les opérateurs logiques</​note>​
  
 |  Liste des opérateurs bit-à-bit ​ ||| |  Liste des opérateurs bit-à-bit ​ |||
 ^  Opérateurs ​ ^  Désignations ​ ^  Résultats ​ ^ ^  Opérateurs ​ ^  Désignations ​ ^  Résultats ​ ^
 | Opérateur unaire ||| | Opérateur unaire |||
-| **''​~''​** //expr// | Négation binaire | ​Retourne ​le complément à 1 de //expr//\\ (~1 -> 0 ; ~0 -> 1) |+| **''​~''​** //expr// | Négation binaire | ​Renvoie ​le complément à 1 de //expr//\\ (~1 -> 0 ; ~0 -> 1) |
 | Opérateurs binaires ||| | Opérateurs binaires |||
-| //expr1// **''&''​** //expr2// | ET binaire | ​Retourne ​le ET bit-à-bit ​ entre //expr1// et //expr2//\\ (1 ET 1 -> 1 ; 0 ET 0 -> 0 ; 1 ET 0 -> 0 ; 0 ET 1 -> 0) | +| //expr1// **''&''​** //expr2// | ET binaire | ​Renvoie ​le ET bit-à-bit ​ entre //expr1// et //expr2//\\ (1 ET 1 -> 1 ; 0 ET 0 -> 0 ; 1 ET 0 -> 0 ; 0 ET 1 -> 0) | 
-| //expr1// **''​|''​** //expr2// | OU binaire | ​Retourne ​le OU bit-à-bit entre //expr1// et //expr2//\\ (1 OU 1 -> 1 ; 0 OU 0 -> 0 ; 1 OU 0 -> 1 ; 0 OU 1 -> 1) | +| //expr1// **''​|''​** //expr2// | OU binaire | ​Renvoie ​le OU bit-à-bit entre //expr1// et //expr2//\\ (1 OU 1 -> 1 ; 0 OU 0 -> 0 ; 1 OU 0 -> 1 ; 0 OU 1 -> 1) | 
-| //expr1// **''​^''​** //expr2// | OU binaire exclusif (XOR) | ​Retourne ​le OU bit-à-bit exclusif entre //expr1// et //expr2//\\ (1 XOR 1 -> 0 ; 0 XOR 0 -> 0 ; 1 XOR 0 -> 1 ; 0 XOR 1 -> 1) | +| //expr1// **''​^''​** //expr2// | OU binaire exclusif (XOR) | ​Renvoie ​le OU bit-à-bit exclusif entre //expr1// et //expr2//\\ (1 XOR 1 -> 0 ; 0 XOR 0 -> 0 ; 1 XOR 0 -> 1 ; 0 XOR 1 -> 1) | 
-| //expr1// **''<​nowiki><<</​nowiki>''​** //expr2//| Décalage binaire à gauche | ​Retourne ​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 | ​Retourne ​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|||+| //expr//, //​expr1// ​et //expr2//sont sujettes au remplacement des paramètres (et des variables), à la substitution de commandes et à la suppression des protections. ​|||
  
 Exemples Exemples
Ligne 376: Ligne 381:
 </​code>​ </​code>​
  
-Voir aussi :+===== Les opérateurs conditionnels =====
  
-  ​[[atelier:​chantier:​bash:​operations-les-nombres-binaires|Opérations sur les nombres binaires]]+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.
  
-===== Opérateurs, priorités =====+|  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>​ 
 +
 +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 illisiblepour plus de clarté, nous pouvons utiliser des parenthèses. 
 + 
 +<code user> 
 +echo $(( a ? (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 ») 
 +
 +bash: ((: 24<42 : 5 : erreur de syntaxe dans l'​expression (le symbole erroné est « : 5 ») 
 +
 +</​code>​ 
 +</​note>​ 
 + 
 +===== Priorités des opérateurs ===== 
 + 
 +La priorité des opérateurs précise l'​ordre dans lequel les opérations sont effectuées 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 langage 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 529:
 <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 =====
doc/programmation/shells/page-man-bash-iv-symboles-dans-les-calculs-mathematiques.1677411996.txt.gz · Dernière modification: 26/02/2023 12:46 par ubub

Pied de page des forums

Propulsé par FluxBB