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 [25/02/2023 14:02] agp91 [Opérateurs binaires] |
doc:programmation:shells:page-man-bash-iv-symboles-dans-les-calculs-mathematiques [26/02/2023 01:57] agp91 [Les opérateurs relationnels] |
||
---|---|---|---|
Ligne 172: | Ligne 172: | ||
* **[[doc:programmation:shells:script-bash-variables-arguments-parametres?&#variables-numeriques-et-calculs|variables numériques et calculs]]** | * **[[doc:programmation:shells:script-bash-variables-arguments-parametres?&#variables-numeriques-et-calculs|variables numériques et calculs]]** | ||
- | ===== Les opérateurs relationnels ===== | + | ===== L'opérateur virgule ===== |
- | Les opérateurs relationnels permettent la comparaison entre deux epressions numériques.\\ | + | L'opérateur virgule, permet de séparer des opérations. |
- | Voir [[doc:programmation:shells:page-man-bash-iii-les-operateurs-de-comparaison-numerique#comparaison-numerique-avec|Comparaison numérique avec ((...))]] | + | |
+ | | L'opérateur virgule ||| | ||
+ | ^ Opérateur ^ Désignation ^ Résultat ^ | ||
+ | |Opérateur binaire ||| | ||
+ | | //expr1// **'',''** //expr2// | Virgule | Sépare les opération //expr1// et //expr2// pour les réaliser à la suite. | | ||
+ | |||
+ | Exemples : | ||
+ | |||
+ | <code user> | ||
+ | echo $(( 5+5 , 10+5 , 21+21)) | ||
+ | </code><code> | ||
+ | 42 | ||
+ | </code> | ||
+ | Seule la dernière opération est retournée. | ||
+ | |||
+ | C'est plus utile avec des affectations : | ||
+ | <code user> | ||
+ | echo $(( a=5+5 , b=10+5 , 21+21)) | ||
+ | echo a=$a b=$b | ||
+ | unset a b | ||
+ | </code><code> | ||
+ | 42 | ||
+ | a=10 b=15 | ||
+ | </code> | ||
+ | ===== Les opérateurs logiques ===== | ||
+ | |||
+ | Les opérateurs logiques, réalisent des opérations sur des booléens.\\ | ||
+ | L'algèbre de boole énumère que deux états : **vrai** et **faux**.\\ | ||
+ | Les commandes **let** et **<nowiki>((..))</nowiki>** suivent le standard C : | ||
+ | |||
+ | * **0** est compris comme **faux**. | ||
+ | * Tout autres valeurs (positive ou négatives), souvent **1**, sont comprise comme **vrai**. | ||
+ | |||
+ | ... Dans bash, c'est le contraire (voir la note plus haut). | ||
+ | |||
+ | Trois opérateurs logiques sont disponibles : 1 unaire et deux binaires. | ||
+ | |||
+ | <note important>Les opérateurs logiques ne doivent être confondus avec les opérateurs bit-à-bit.</note> | ||
+ | |||
+ | | Liste des opérateurs logiques ||| | ||
+ | ^ Opérateurs ^ Désignations ^ Résultats ^ | ||
+ | | Opérateur unaire ||| | ||
+ | | **''!(''** //expr// **'')''** | Négation logique | Retourne l'inverse de //expr//\\ !(1) = 0 (NON vrai = faux)\\ !(0) = 1 (NON faux = vrai)| | ||
+ | | Opérateurs binaires ||| | ||
+ | | //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) | | ||
+ | | //epr//, //expr1//, //expr2// sont sujets aux développements||| | ||
+ | |||
+ | Exemples : | ||
+ | |||
+ | <code user> | ||
+ | echo "!(0) = $((!(0)))" | ||
+ | echo "!(5+5) = $((!(5+5)))" | ||
+ | echo $((!1)) | ||
+ | </code><code> | ||
+ | !(0) = 1 | ||
+ | !(5+5) = 0 | ||
+ | bash: !1: event not found | ||
+ | </code> | ||
+ | |||
+ | <note>L'opérateur de négation logique s'utilise uniquement avec des parenthèses : **!(//expr//)**.</note> | ||
+ | |||
+ | Les opérations logiques peuvent se suivre : | ||
+ | |||
+ | <code user> | ||
+ | echo $(( 1 && 1)) | ||
+ | echo $(( 1 && 0)) | ||
+ | echo $(( 1 && 1 && 0)) # vrai && vrai && faux, retourne faux | ||
+ | </code><code> | ||
+ | 1 | ||
+ | 0 | ||
+ | 0 | ||
+ | </code> | ||
+ | |||
+ | Les opérateurs **<nowiki>&&</nowiki>** et **<nowiki>||</nowiki>**, étudient leur opérande de droite (//expr2//) que si cela est pertinent : | ||
+ | |||
+ | <code user> | ||
+ | a=1 | ||
+ | echo $((0 && (a=10) )) a=$a # Le second opérande (a=10) n'est pas étudié car cela n'est pas pertinent | ||
+ | # avec 0 (faux) et l'opérateur &&, le résultat sera toujours faux. | ||
+ | |||
+ | echo $((1 && (a=10) )) a=$a # Le second opérande (a=10) est étudié car cela est pertinent | ||
+ | # avec 1 (vrai) et l'opérateur &&, le résultat pourra être vrai. | ||
+ | unset a | ||
+ | </code><code> | ||
+ | 0 a=1 | ||
+ | 1 a=10 | ||
+ | </code> | ||
+ | |||
+ | <note>Nous avons placer l'affection **a=10** entre parenthèse **(a=10)** pour la protéger contre la priorités des opérateurs.\\ | ||
+ | \\ | ||
+ | Si non, l'opérateur **<nowiki>&&</nowiki>** étant prioritaire à l'opérateur **=**, les opérations effectués sont **<nowiki>0 && a</nowiki>**, puis **=10**, ce qui va générer une erreur. | ||
+ | \\ | ||
+ | <code user> | ||
+ | echo $((1 && a=10 )) a=$a | ||
+ | </code><code> | ||
+ | bash: 0 && a=10 : tentative d'affectation à une non-variable (le symbole erroné est « =10 ») | ||
+ | </code> | ||
+ | |||
+ | Voir plus bas. | ||
+ | </note> | ||
+ | |||
+ | S'il n'est pas pertinent d'étudier l'opérande de droite et qu'il existe un autre opérateur, alors les opération se poursuive. | ||
+ | <code user> | ||
+ | a=0 | ||
+ | echo $((a && (a=10) || (a=20) )) a=$a # Avec a=0 (faux) et l'opérateur && il n'est pertinent d'étudier le second opérande | ||
+ | # L'opération se reporte sur l'opérateur ||, étant pertinent, son opérande de droite est étudié. | ||
+ | a=1 | ||
+ | echo $((a && (a=10) || (a=20) )) a=$a | ||
+ | unset a | ||
+ | </code><code> | ||
+ | 1 a=20 | ||
+ | 1 a=10 | ||
+ | </code> | ||
+ | |||
+ | <note important> | ||
+ | Le opération logiques retournent une valeur booléenne.\\ | ||
+ | (**vrai** en cas de succès **faux** en cas d'échec).\\ | ||
+ | \\ | ||
+ | Les commandes **let** et **<nowiki>((..))</nowiki>** suivent le standard C.\\ | ||
+ | Elles numérisent **faux** avec **0** et **vrai** avec une valeur **non nulle**.\\ | ||
+ | \\ | ||
+ | Avec bash c'est l'inverse, **faux** est une valeur **non nulle** et **vrai** correspond à **0**.\\ | ||
+ | \\ | ||
+ | Il en résulte que le code retour renvoyé est l'inverse du résultat des comparaisons effectuées par **let** ou **<nowiki>((..))</nowiki>** | ||
+ | <code user> | ||
+ | echo $(( !(0) )) | ||
+ | (( !(0) )); echo $? | ||
+ | </code><code> | ||
+ | 1 | ||
+ | 0 | ||
+ | </code> | ||
+ | </note> | ||
===== Les opérateurs bit-à-bit ===== | ===== Les opérateurs bit-à-bit ===== | ||
- | 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'abords 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> | ||
| Liste des opérateurs bit-à-bit ||| | | Liste des opérateurs bit-à-bit ||| | ||
Ligne 192: | Ligne 325: | ||
| //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 | 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 à 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 | Retourne 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||| | ||
Exemples | Exemples | ||
Ligne 206: | Ligne 340: | ||
Voir aussi : | Voir aussi : | ||
- | * [[atelier:chantier:bash:les-operations-binaires|Les opérations binaire]] | + | * [[atelier:chantier:bash:operations-les-nombres-binaires|Opérations sur les nombres binaires]] |
+ | ===== Opérateurs, priorités ===== | ||
===== Écriture utile pour les boucles ===== | ===== Écriture utile pour les boucles ===== | ||
===Post-incrémentation et pré-incrémentation :=== | ===Post-incrémentation et pré-incrémentation :=== |