diff --git a/page_wiki b/page_wiki new file mode 100644 index 0000000..144e3b4 --- /dev/null +++ b/page_wiki @@ -0,0 +1,355 @@ +======C18 : Bash : Structures conditionnelles, boucles et calculs====== + +=====Objectifs :===== + * Savoir réaliser des opérations simples en bash + * Être capable d’utiliser dans vos scripts les instructions IF, WHILE et FOR + +=====Cours===== + +==== 1 - Arithmétique en bash ==== +===Introduction=== +Soyons clairs tout de suite : + +__**Bash n'est PAS un langage pensé pour manipuler des nombres !**__ (vous vous rappellerez peut-être que je vous avais indiqué que, pour Bash, **toute variable est une chaine de caractères** ?) + +Ceci étant dit, vouloir coder n’importe quoi d’un peu évolué sans jamais utiliser de nombres est une illusion, aussi va-t-il falloir apprendre comment ça marche. + +Si vous tapez : + +echo 1+2 + +Vous obtiendrez + +1+2 + + +Eh oui, par défaut, **tout est une chaine de caractère en bas**h, et donc ma belle opération ne s’exécute pas. Il s'agit pour le langage d'une suite de caractères comme n'importe laquelle. + +===Syntaxe pour effectuer des calculs=== + +Si vous voulez que bash fasse un calcul, il faut l’entourer de **doubles parenthèses**. + +Par exemple, si je tape : + +((3+4)) + + +Il ne s’affiche rien. Rien, mais **pas non plus d’erreur**, ce qui serait arrivé si vous aviez tapé : + +3+4 + + +Et en effet, quand vous avez tapé %%((3+4))%%, tout s’est bien passé. Votre **commande** a été bien comprise par l'interpréteur. + +C’est juste que par défaut, **l’opérateur %%((%%** n’affiche rien sur la sortie standard. Si vous voulez récupérer la valeur de votre opération, ce qui sera souvent le cas, alors il faut mettre un **$ devant les doubles parenthèses**, ce qui vous donne par exemple : + +$ echo $((1+2)) +3 + +Et là c’est merveilleux, vous avez réussi votre première opération en bash. + +Ça fonctionne de la même façon pour vos **quatre opérations de base** : + ; - ; * ; / + +Toutefois, j’attire votre attention sur le fait que, si bash n’est guère fait pour manipuler des nombres, il n’est définitivement **pas pensé pour gérer les nombres réels** (vous savez, ces choses avec des virgules). + +Donc si vous vous lancez dans des divisions, **soyez certains de l’intérêt**, et il vaudrait mieux que ça tombe sur des nombres entiers sinon vous allez au-devant de surprises (essayez, vous verrez !). +===Syntaxe avancée=== +En plus des opérations classiques, vous avez accès à tout un tas d’opérateurs, et ne vous servirez sans doute jamais ou presque d’une majorité d’entre eux. Mais bon, si vous cherchez quelque chose de précis un jour : + + + * [[promo_2026:bloc1_sys_reseau:bash_operateurs | Bash : opérateurs de calcul]] + +Pour vous, dans la pratique, ça devrait se limiter à ceci (exemples ci-dessous, avec deux variables a et b) : + * Addition : %%((a+b))%% + * Soustraction : %%((a-b))%% + * Multiplication : %%((a*b))%% + * Division entière : %%((a/b))%% + * Reste de la division : %%((a%b))%% + * Mise en exposant (de la 2e variable) : %%((a**b))%% + * Incrémentation : %%((a++))%% (ajoute 1 à la valeur de a) + + +# Affectation des valeurs 4 et 5 aux variables a et b +sio@demo:~$ a=4 +sio@demo:~$ b=5 +# Exemple d'affiche du résultat d'opérations +sio@demo:~$ echo $((a+b)) +9 +sio@demo:~$ echo $((a-b)) +-1 +sio@demo:~$ echo $((a*b)) +20 +sio@demo:~$ echo $((a/b)) +0 +sio@demo:~$ echo $((a%b)) +4 +sio@demo:~$ echo $((a**b)) +1024 +sio@demo:~$ echo $((b++)) +6 +# Comme l'on vient d'augmenter la valeur de b : +sio@demo:~$ echo $b +6 +# Calcul avec un opérateur d'affectation (affecte le résultat à la première variable du calcul) : +sio@demo:~$ ((a*=b)) +sio@demo:~$ echo $a +24 + + +==== 2 - Structures conditionnelles ==== +Comme tout langage de programmation, Bash dispose de structures de contrôle. La première que nous allons voire est la commande if. Au premier abord, la syntaxe est simple : + +if condition ; then + instructions +else + instructions +fi + + +Vous pouvez également utiliser elif pour else if (si condition de if non validée, deuxième condition) : + +if condition ;then + instructions +elif condition ; then + instructions +else + instructions +fi + + +On peut enchainer plusieurs elif si besoin, mais ayez bien conscience que **si une condition est validée, les suivantes ne seront pas vérifiées**. Il faut donc bien réfléchir à l’ordre dans le cas des conditions multiples. + +Il doit y avoir **exactement un fi par if**, pas besoin de mettre de fi pour un elif. + +**Après chaque condition**, il doit y avoir un **then**. Il n’est absolument pas obligatoire d’inclure de clauses else ou elif. + +:!:Il faut bien écrire if, then, else, elif, et fi en minuscules.:!: + +C’est pour les conditions que les choses se compliquent un peu. Il faut séparer deux cas : + +===A – Conditions sur les entiers=== +Si vos conditions portent sur des **nombres entiers**, elles doivent être e**ntourées de double parenthèses** comme pour tout calcul, comme on a vu précédemment. Cela donne par exemple ceci : + +read number +if (( $number >= 50 )) ; then + echo "nombre saisi supérieur ou égal à 50" +fi + + +Les opérateurs utilisables sur les nombres sont les suivants : +|Egal |==| +|Différent |!=| +|Strictement supérieur |>| +|Strictement inférieur|<| +|Supérieur ou égal|>=| +|Inférieur ou égal|<=| +Attention, **pas de $ devant ces doubles parenthèses-ci**, ce qui vous intéresse n’est pas la valeur de votre calcul mais le code de retour de l’expression, qui déclenchera la validation ou non du test IF. +===B – Autres conditions=== +Si ce que vous voulez tester n’est pas à proprement parler un calcul sur des nombres entiers (comme tout ce qu’on a fait jusque-là), alors il faudra utiliser les **doubles crochets**. + +:!:Des doubles crochets doivent être **séparés de la condition à évaluer par un espace**, sans quoi rien ne marche.:!: + +Ca donne par exemple des choses comme ça : +Script : + +#!/bin/bash +read text +if [[ $text < "o" ]] ;then + echo "ce texte commence par une des 13 premières lettres de l'alphabet +else + echo "ce texte commence par une des 13 dernières lettres de l'alphabet +fi + + +Les opérateurs utilisables sur les nombres sont les suivants : +|Egal |==| +|Différent |!=| +|Postérieur dans l’ordre alphabétique |>| +|Antérieur dans l’ordre alphabétique |<| +:!:Les opérateurs de comparaison de chaines doivent être encadrés par des espaces, sans quoi des choses étonnantes se produisent.:!: +==== 3 - Les boucles ==== +En programmation, une boucle est une structure logique définissant la **répétition d’instructions** jusqu’à **validation d’une condition.** +===A – Boucle WHILE=== +La boucle **while** (« tant que ») permet de répéter une série d’instructions tant qu’une **condition** vérifiée entre chaque exécution n’est **pas validée**. Sa structure est la suivante : + +while condition +do + instructions +done + + +Les conditions marchent **exactement pareil que pour if**. Par exemple : +Script : + +#!/bin/bash +i=0 +while (( $i < 4 )) +do + ((i++)) + echo "Et de $i !" +done + +Exécution : + +Et de 1 ! +Et de 2 ! +Et de 3 ! +Et de 4 ! + + +Au passage, notez **l’instruction %%((i++))%%**. C’est ce que l’on appelle une **incrémentation** : on augmente la valeur de la variable i de +1 à chaque fois que cette instruction est répétée (cela aurait pu s’écrire %%((i=$i+1))%% mais c’est plus long). + +Les incrémentations sont à la base de la logique qui régit la majorité des boucles : on fait évoluer une variable / un compteur jusqu’à ce que la condition posée soit validée. + +===B – Boucle FOR=== +La boucle for (« jusqu’à ce que ») permet de répéter une série un **nombre défini de foi**s, la plupart du temps **via un compteur**. En bash, toutefois, elle est un peu spéciale. Contrairement à la plupart des autres langages, une boucle for va donner à son compteur les valeurs contenues dans une **liste de mots successifs**. +Sa structure est la suivante : + +for i in listedemots +do + instructions +done + + +Par exemple, ce script : + +for i in "a" "b" "c" "d" "e" +do + echo $i +done + +Donnera ceci : + +a +b +c +d +e + +(Au passage, il n’est pas impératif de mettre vos mots entre guillemets) + +Il est bien entendu possible de faire des boucles for davantage similaires aux autres langages, en proposant à la place de la liste de mots un **intervalle d’entiers** dont la syntaxe sera **{a..b} SANS ESPACES**. + +Ainsi, on aura pour ce script : + +for i in {1..4} +do + echo $i +done + +Cette exécution : + +1 +2 +3 +4 + +Vous pouvez bien sûr utiliser des substitutions de commandes là-dedans : + +for i in $(ls) +do + echo $i +done + +Ainsi, ce script va lister le contenu du dossier courant. Pratique ! + +file1 +dir1 +dir2 + +===C - Pour aller plus loin=== +A noter que les **boucles** peuvent être utilisées pour **parcourir des fichiers** et effectuer ainsi des opérations plus complexes, ou en tout cas plus lisibles, qu'avec des suites de pipe. Pour plus d'infos : + + * [[promo_2026:bloc1_sys_reseau:shell_scripting | Shell : Scripts]] + +=====Diaporama===== + +==== 1 - Arithmétique en bash ==== +===Introduction=== +__**Bash n'est PAS un langage pensé pour manipuler des nombres !**__ . +===== ===== +===Syntaxe pour effectuer des calculs=== + +Si vous voulez que bash fasse un calcul, il faut l’entourer de **doubles parenthèses**. +===== ===== +===Syntaxe avancée=== +Multitude d’opérateurs : + + + * [[promo_2026:bloc1_sys_reseau:bash_operateurs | Bash : opérateurs de calcul]] + +Pour vous, dans la pratique, ça devrait se limiter à ceci : + * Addition : %%((a+b))%% + * Soustraction : %%((a-b))%% + * Multiplication : %%((a*b))%% + * Division entière : %%((a/b))%% + * Reste de la division : %%((a%b))%% + * Mise en exposant (de la 2e variable) : %%((a**b))%% + * Incrémentation : %%((a++))%% (ajoute 1 à la valeur de a) +===== ===== +==== 2 - Structures conditionnelles ==== + + +if condition ; then + instructions +else + instructions +fi + +===== ===== +Vous pouvez également utiliser elif pour else if : + +if condition ;then + instructions +elif condition ; then + instructions +else + instructions +fi + +===== ===== + +===A – Conditions sur les entiers=== +**Nombres entiers** = conditions **entourées de double parenthèses** +===== ===== +Les opérateurs utilisables sur les nombres sont les suivants : +|Egal |==| +|Différent |!=| +|Strictement supérieur |>| +|Strictement inférieur|<| +|Supérieur ou égal|>=| +|Inférieur ou égal|<=| +===== ===== +===B – Autres conditions=== +**doubles crochets** pour tout ce qui n'est pas nombres entiers +===== ===== + +Les opérateurs utilisables sur les nombres sont les suivants : +|Egal |==| +|Différent |!=| +|Postérieur dans l’ordre alphabétique |>| +|Antérieur dans l’ordre alphabétique |<| +===== ===== +==== 3 - Les boucles ==== +===A – Boucle WHILE=== + +while condition +do + instructions +done + +===== ===== + +===B – Boucle FOR=== +Un peu spéciale : liste de **"mots" successifs** plutôt qu'un compteur : + +for i in listedemots +do + instructions +done + +===== ===== +===C - Pour aller plus loin=== +A noter que les **boucles** peuvent être utilisées pour **parcourir des fichiers** et effectuer ainsi des opérations plus complexes, ou en tout cas plus lisibles, qu'avec des suites de pipe. Pour plus d'infos : + + * [[promo_2026:bloc1_sys_reseau:shell_scripting | Shell : Scripts]] \ No newline at end of file