{"id":1327,"date":"2022-10-30T20:56:11","date_gmt":"2022-10-30T19:56:11","guid":{"rendered":"https:\/\/www.webodesign.net\/?p=1327"},"modified":"2022-11-01T17:27:25","modified_gmt":"2022-11-01T16:27:25","slug":"les-scripts-shell-instructions-de-controle","status":"publish","type":"post","link":"https:\/\/www.webodesign.net\/?p=1327","title":{"rendered":"Les scripts shell &#8211; Instructions de contr\u00f4le"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-51b23e59 alignfull uagb-is-root-container\"><div class=\"uagb-container-inner-blocks-wrap\">\n<div class=\"wp-block-columns is-layout-flex wp-container-4\">\n<div class=\"wp-block-column is-layout-flow\">\n<div class=\"wp-block-group is-layout-flow\">\n<p>Lorsqu\u2019elles se terminent, toutes les commandes ex\u00e9cut\u00e9es par le shell renvoient un <strong>code de retour<\/strong> (\u00e9galement appel\u00e9 <strong>code de statut<\/strong> ou de <strong>sortie<\/strong>).<\/p>\n\n\n\n<h2 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"les-tests\">Les tests<\/h2>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-857cbfcb\"><h3 class=\"uagb-heading-text\">Les tests<\/h3><\/div>\n\n\n\n<ul><li>Si la commande s\u2019est correctement ex\u00e9cut\u00e9e, la convention veut que le code de statut ait pour valeur <strong>z\u00e9ro<\/strong>.<\/li><li>Si la commande a rencontr\u00e9 un probl\u00e8me lors de son ex\u00e9cution, son code de statut aura une valeur <strong>diff\u00e9rente de z\u00e9ro<\/strong>.<br>Les raisons peuvent \u00eatre nombreuses : manque de droits d\u2019acc\u00e8s, absence de fichier, saisie incorrecte, etc.<\/li><\/ul>\n\n\n\n<p>Il faut se r\u00e9f\u00e9rer au manuel de la commande <code>man commande<\/code> pour conna\u00eetre les diff\u00e9rentes valeurs du code de retour pr\u00e9vues par les d\u00e9veloppeurs.<\/p>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color has-medium-font-size\" style=\"line-height:2\"><strong><em>Le code de retour n\u2019est pas visible directement, mais est enregistr\u00e9 dans une variable sp\u00e9ciale<\/em><\/strong> : <code>$?<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ mkdir repertoire\n$ echo $?\n0\n$ mkdir \/repertoire\nmkdir: impossible de cr\u00e9er le r\u00e9pertoire\n$ echo $?\n1\n$ commande_qui_n_existe_pas\ncommande_qui_n_existe_pas&nbsp;: commande introuvable\n$ echo $?\n127<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td>L\u2019affichage du contenu de la variable <code>$?<\/code> avec la commande <code>echo<\/code> se fait imm\u00e9diatement apr\u00e8s la commande que l\u2019on souhaite \u00e9valuer car cette variable est mise \u00e0 jour apr\u00e8s chaque ex\u00e9cution d\u2019une commande, d\u2019une ligne de commandes ou encore d\u2019un script.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td>Puisque la valeur de <code>$?<\/code> change apr\u00e8s chaque ex\u00e9cution de commande, il est pr\u00e9f\u00e9rable de mettre sa valeur dans une variable qui sera utilis\u00e9e par la suite, pour un test ou afficher un message. <code>$ ls fichier_absent ls: impossible d&#039;acc\u00e9der \u00e0 &#039;fichier_absent&#039;: Aucun fichier ou dossier de ce type $ RETOUR=$? $ echo $? 0 $ echo $RETOUR 2<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Il est \u00e9galement possible de cr\u00e9er des codes de retour dans un script. Il suffit pour cela d\u2019ajouter un argument num\u00e9rique \u00e0 la commande <code>exit<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ bash        # pour \u00e9viter d&#039;\u00eatre d\u00e9connect\u00e9 apr\u00e8s le \u00ab exit 2 \u00bb\n$ exit 2\n$ echo $?\n2<\/code><\/pre>\n\n\n\n<p>Outre la bonne ex\u00e9cution d\u2019une commande, le shell offre la possibilit\u00e9 d\u2019ex\u00e9cuter des tests sur de nombreux motifs :<\/p>\n\n\n\n<ul><li><strong>Fichiers<\/strong> : existence, type, droits, comparaison ;<\/li><li><strong>Cha\u00eenes de caract\u00e8res<\/strong> : longueur, comparaison ;<\/li><li><strong>Num\u00e9riques entiers<\/strong> : valeur, comparaison.<\/li><\/ul>\n\n\n\n<p>Le r\u00e9sultat du test :<\/p>\n\n\n\n<ul><li><code>$?=0<\/code> : le test s\u2019est correctement ex\u00e9cut\u00e9 et est vrai ;<\/li><li><code>$?=1<\/code> : le test s\u2019est correctement ex\u00e9cut\u00e9 et est faux ;<\/li><li><code>$?=2<\/code> : le test ne s\u2019est pas correctement ex\u00e9cut\u00e9.<\/li><\/ul>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"tester-le-type-dun-fichier\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#tester-le-type-dun-fichier\"><\/a>Tester le type d\u2019un fichier<\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-83d6230f\"><h3 class=\"uagb-heading-text\">Tester le type d&rsquo;un fichier<\/h3><\/div>\n\n\n\n<pre title=\"Syntaxe de la commande test pour un fichier\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">test [-d|-e|-f|-L] fichier<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Option<\/th><th>Observation<\/th><\/tr><\/thead><tbody><tr><td><code>-e<\/code><\/td><td>Teste si le fichier existe<\/td><\/tr><tr><td><code>-f<\/code><\/td><td>Teste si le fichier existe et est de type normal<\/td><\/tr><tr><td><code>-d<\/code><\/td><td>Teste si le fichier existe et est de type r\u00e9pertoire<\/td><\/tr><tr><td><code>-L<\/code><\/td><td>Teste si le fichier existe et est de type lien symbolique<\/td><\/tr><tr><td><code>-b<\/code><\/td><td>Teste si le fichier existe et est de type sp\u00e9cial mode bloc<\/td><\/tr><tr><td><code>-c<\/code><\/td><td>Teste si le fichier existe et est de type sp\u00e9cial mode caract\u00e8re<\/td><\/tr><tr><td><code>-p<\/code><\/td><td>Teste si le fichier existe et est de type tube<\/td><\/tr><tr><td><code>-S<\/code><\/td><td>Teste si le fichier existe et est de type socket<\/td><\/tr><tr><td><code>-t<\/code><\/td><td>Teste si le fichier existe et est de type terminal<\/td><\/tr><tr><td><code>-r<\/code><\/td><td>Teste si le fichier existe et est accessible en lecture<\/td><\/tr><tr><td><code>-w<\/code><\/td><td>Teste si le fichier existe et est accessible en \u00e9criture<\/td><\/tr><tr><td><code>-x<\/code><\/td><td>Teste si le fichier existe et est est ex\u00e9cutable<\/td><\/tr><tr><td><code>-g<\/code><\/td><td>Teste si le fichier existe et est a un SGID positionn\u00e9<\/td><\/tr><tr><td><code>-u<\/code><\/td><td>Teste si le fichier existe et est a un SUID positionn\u00e9<\/td><\/tr><tr><td><code>-s<\/code><\/td><td>Teste si le fichier existe et est non vide (taille &gt; 0 octets)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"comparer-deux-fichiers\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#comparer-deux-fichiers\"><\/a>Comparer deux fichiers<\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-50ad208d\"><h3 class=\"uagb-heading-text\">Comparer deux fichiers<\/h3><\/div>\n\n\n\n<p>La commande <code>test<\/code> peut \u00e9galement comparer des fichiers :<\/p>\n\n\n\n<pre title=\"Syntaxe de la commande test pour la comparaison de fichiers\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">test fichier1 [-nt|-ot|-ef] fichier2<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Option<\/th><th>Observation<\/th><\/tr><\/thead><tbody><tr><td><code>-nt<\/code><\/td><td>Teste si le premier fichier est plus r\u00e9cent que le second<\/td><\/tr><tr><td><code>-ot<\/code><\/td><td>Teste si le premier fichier est plus ancien que le second<\/td><\/tr><tr><td><code>-ef<\/code><\/td><td>Teste si le premier fichier est un lien physique du second<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"tester-une-variable\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#tester-une-variable\"><\/a>Tester une variable<\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-345bf80a\"><h3 class=\"uagb-heading-text\">Tester une variable<\/h3><\/div>\n\n\n\n<pre title=\"Syntaxe de la commande test pour les variables\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">test [-z|-n] $variable<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Option<\/th><th>Observation<\/th><\/tr><\/thead><tbody><tr><td><code>-z<\/code><\/td><td>Teste si la variable est vide<\/td><\/tr><tr><td><code>-n<\/code><\/td><td>Teste si la variable n\u2019est pas vide<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"tester-une-cha\u00eene-de-caract\u00e8res\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#tester-une-cha\u00eene-de-caract\u00e8res\"><\/a>Tester une cha\u00eene de caract\u00e8res<\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-edba1c64\"><h3 class=\"uagb-heading-text\">Tester une cha\u00eene de caract\u00e8res<\/h3><\/div>\n\n\n\n<pre title=\"Syntaxe de la commande test pour les cha\u00eenes de caract\u00e8res\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">test cha\u00eene1 [=|!=] cha\u00eene2<\/code><\/pre>\n\n\n\n<p>Exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ test &quot;$var&quot; = &quot;Hello world !&quot;\n$ echo $?\n0<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Option<\/th><th>Observation<\/th><\/tr><\/thead><tbody><tr><td><code>=<\/code><\/td><td>Teste si la premi\u00e8re cha\u00eene de caract\u00e8res est \u00e9gale \u00e0 la seconde<\/td><\/tr><tr><td><code>!=<\/code><\/td><td>Teste si la premi\u00e8re cha\u00eene de caract\u00e8res est diff\u00e9rente de la seconde<\/td><\/tr><tr><td><code>&lt;<\/code><\/td><td>Teste si la premi\u00e8re cha\u00eene de caract\u00e8res est avant la seconde dans l\u2019ordre ASCII<\/td><\/tr><tr><td><code>&gt;<\/code><\/td><td>Teste si la premi\u00e8re cha\u00eene de caract\u00e8res est apr\u00e8s la seconde dans l\u2019ordre ASCII<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"comparaison-de-num\u00e9riques-entiers\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#comparaison-de-num\u00e9riques-entiers\"><\/a>Comparaison de num\u00e9riques entiers<\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-64c6c6d3\"><h3 class=\"uagb-heading-text\">Comparaison de num\u00e9riques entiers<\/h3><\/div>\n\n\n\n<pre title=\"Syntaxe de la commande test pour les entiers\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">test &quot;num1&quot; [-eq|-ne|-gt|-lt] &quot;num2&quot;<\/code><\/pre>\n\n\n\n<p>Exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ var=1\n$ test &quot;$var&quot; -eq &quot;1&quot;\n$ echo $?\n0\n$ var=2\n$ test &quot;$var&quot; -eq &quot;1&quot;\n$ echo $?\n1<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Option<\/th><th>Observation<\/th><\/tr><\/thead><tbody><tr><td><code>-eq<\/code><\/td><td>Teste si le premier nombre est \u00e9gal au second<\/td><\/tr><tr><td><code>-ne<\/code><\/td><td>Teste si le premier nombre est diff\u00e9rent au second<\/td><\/tr><tr><td><code>-gt<\/code><\/td><td>Teste si le premier nombre est sup\u00e9rieur au second<\/td><\/tr><tr><td><code>-lt<\/code><\/td><td>Teste si le premier nombre est inf\u00e9rieur au second<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td>Les num\u00e9riques \u00e9tant trait\u00e9s par le shell comme des caract\u00e8res (ou cha\u00eenes de caract\u00e8res) classiques, un test sur un caract\u00e8re peut renvoyer le m\u00eame r\u00e9sultat qu\u2019il soit trait\u00e9 en tant que num\u00e9rique ou non. <code>$ test &quot;1&quot; = &quot;1&quot; $ echo $? 0 $ test &quot;1&quot; -eq &quot;1&quot; $ echo $? 0<\/code> Mais le r\u00e9sultat du test n\u2019aura pas la m\u00eame signification : Dans le premier cas, il signifiera que les deux caract\u00e8res ont la m\u00eame valeur dans la table ASCII. Dans le second cas, il signifiera que les deux nombres sont \u00e9gaux.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"combinaison-de-tests\">Combinaison de tests<\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-62397bd5\"><h3 class=\"uagb-heading-text\">Combinaisons de tests<\/h3><\/div>\n\n\n\n<p>La combinaison de tests permet d\u2019effectuer plusieurs tests en une seule commande. Il est possible de tester plusieurs fois le m\u00eame argument (fichier, cha\u00eene ou num\u00e9rique) ou des arguments diff\u00e9rents.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">test option1 argument1 [-a|-o] option2 argument 2<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ ls -lad \/etc\ndrwxr-xr-x 142 root root 12288 sept. 20 09:25 \/etc\n$ test -d \/etc -a -x \/etc\n$ echo $?\n0<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Option<\/th><th>Observation<\/th><\/tr><\/thead><tbody><tr><td><code>-a<\/code><\/td><td><strong>ET<\/strong> : Le test sera vrai si tous les motifs le sont.<\/td><\/tr><tr><td><code>-o<\/code><\/td><td><strong>OU<\/strong> : Le test sera vrai si au moins un motif l\u2019est.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Les tests peuvent ainsi \u00eatre group\u00e9 avec des parenth\u00e8ses <code>( )<\/code> pour leur donner une priorit\u00e9.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">(TEST1 -a TEST2) -a TEST3<\/code><\/pre>\n\n\n\n<p>Le caract\u00e8re <code>!<\/code> permet d\u2019effectuer le test inverse de celui demand\u00e9 par l\u2019option :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ test -e \/fichier   # vrai si fichier existe\n$ ! test -e \/fichier # vrai si fichier n&#039;existe pas<\/code><\/pre>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"les-op\u00e9rations-num\u00e9riques\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#les-op\u00e9rations-num\u00e9riques\"><\/a>Les op\u00e9rations num\u00e9riques<\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-8f4bdb8e\"><h3 class=\"uagb-heading-text\">Les op\u00e9rations num\u00e9riques<\/h3><\/div>\n\n\n\n<p>La commande <code>expr<\/code> effectue une op\u00e9ration avec des entiers num\u00e9riques.<\/p>\n\n\n\n<pre title=\"Syntaxe de la commande expr\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">expr num1 [+] [-] [\\*] [\/] [%] num2<\/code><\/pre>\n\n\n\n<p>Exemple :<\/p>\n\n\n\n<pre title=\"Exemple d\u2019utilisation de la commande expr\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ expr 2 + 2\n4<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td>Attention \u00e0 bien encadrer le signe d\u2019op\u00e9ration par une espace, vous obtiendrez un message d\u2019erreur en cas d\u2019oubli.<br>Dans le cas d\u2019une multiplication, le caract\u00e8re joker <code>*<\/code> est pr\u00e9c\u00e9d\u00e9 par <code>\\<\/code> pour \u00e9viter une mauvaise interpr\u00e9tation.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Op\u00e9rateur<\/th><th>Observation<\/th><\/tr><\/thead><tbody><tr><td><code>+<\/code><\/td><td>Addition<\/td><\/tr><tr><td><code>-<\/code><\/td><td>Soustraction<\/td><\/tr><tr><td><code>\\*<\/code><\/td><td>Multiplication<\/td><\/tr><tr><td><code>\/<\/code><\/td><td>Quotient de la division<\/td><\/tr><tr><td><code>%<\/code><\/td><td>Modulo de la division<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"la-commande-typeset\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#la-commande-typeset\"><\/a>La commande <code>typeset<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-9a7bcdde\"><h3 class=\"uagb-heading-text\">La commande typeset<\/h3><\/div>\n\n\n\n<p>La commande <code>typeset -i<\/code> d\u00e9clare une variable comme un entier.<\/p>\n\n\n\n<pre title=\"Exemple d\u2019utilisation de la commande typeset\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ typeset -i var1\n$ var1=1+1\n$ var2=1+1\n$ echo $var1\n2\n$ echo $var2\n1+1<\/code><\/pre>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"la-commande-let\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#la-commande-let\"><\/a>La commande <code>let<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-aa64df8d\"><h3 class=\"uagb-heading-text\">La commande let<\/h3><\/div>\n\n\n\n<p>La commande <code>let<\/code> teste si un caract\u00e8re est num\u00e9rique.<\/p>\n\n\n\n<pre title=\"Exemple d\u2019utilisation de la commande let\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ var1=&quot;10&quot;\n$ var2=&quot;AA&quot;\n$ let $var1\n$ echo $?\n0\n$ let $var2\n$ echo $?\n1<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td>La commande <code>let<\/code> ne retourne pas un code retour coh\u00e9rent lorsqu\u2019elle \u00e9value le num\u00e9rique <code>0<\/code>. <code>$ let 0 $ echo $? 1<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>La commande <code>let<\/code> permet \u00e9galement d\u2019effectuer des op\u00e9rations math\u00e9matiques :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ let var=5+5\n$ echo $var\n10<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td><code>let<\/code> peut \u00eatre substitu\u00e9e par <code>$(( ))<\/code>. <code>$ echo $((5+2)) 7 $ echo $((5*2)) 10 $ var=$((5*3)) $ echo $var 15<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"structures-conditionnelles\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#structures-conditionnelles\"><\/a>Structures conditionnelles<\/h2>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-94cc3918\"><h3 class=\"uagb-heading-text\">Structures conditionnelles<\/h3><\/div>\n\n\n\n<p>Si la variable <code>$?<\/code> permet de conna\u00eetre le r\u00e9sultat d\u2019un test ou de l\u2019ex\u00e9cution d\u2019une commande, elle ne peut qu\u2019\u00eatre affich\u00e9e et n\u2019a aucune incidence sur le d\u00e9roulement d\u2019un script.<\/p>\n\n\n\n<p>Mais nous pouvons nous en servir dans une condition. <strong>Si<\/strong> le test est bon <strong>alors<\/strong> je fais cette action <strong>sinon<\/strong> je fais telle autre action.<\/p>\n\n\n\n<pre title=\"Syntaxe de l\u2019alternative conditionnelle if\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">if commande\nthen\n    commande si $?=0\nelse\n    commande si $?!=0\nfi<\/code><\/pre>\n\n\n\n<p>La commande plac\u00e9e apr\u00e8s le mot <code>if<\/code> peut \u00eatre n\u2019importe quelle commande puisque c\u2019est son code de retour (<code>$?<\/code>) qui sera \u00e9valu\u00e9. Il est souvent pratique d\u2019utiliser la commande <code>test<\/code> pour d\u00e9finir plusieurs actions en fonction du r\u00e9sultat de ce test (fichier existe, variable non vide, droits en \u00e9criture positionn\u00e9s).<\/p>\n\n\n\n<p>Utiliser une commande classique (<code>mkdir<\/code>, <code>tar<\/code>, \u2026) permet de d\u00e9finir les actions \u00e0 effectuer en cas de succ\u00e8s ou les messages d\u2019erreur \u00e0 afficher en cas d\u2019\u00e9chec.<\/p>\n\n\n\n<pre title=\"Exemples d\u2019utilisation de la structure conditionnelle if\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">if test -e \/etc\/passwd\nthen\n    echo &quot;Le fichier existe&quot;\nelse\n    echo &quot;Le fichier n&#039;existe pas&quot;\nfi\n\nif mkdir rep\nthen\n    cd rep\nfi<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td>La commande <code>test<\/code> peut \u00eatre substitu\u00e9e par <code>[[ condition_de_test ]]<\/code>. Ainsi : <code>if test -e \/etc\/passwd then echo &quot;Le fichier existe&quot; else echo &quot;Le fichier n&#039;existe pas&quot; fi<\/code> peut devenir : <code>if [[ -e \/etc\/passwd ]] then echo &quot;Le fichier existe&quot; else echo &quot;Le fichier n&#039;existe pas&quot; fi<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Si le bloc <code>else<\/code> commence par une nouvelle structure <code>if<\/code>, il est possible de fusionner <code>else<\/code> et <code>if<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">[\u2026]\nelse\n  if test -e \/etc\/\n[\u2026]\n\n[\u2026]\n# est \u00e9quivalent \u00e0\nelif test -e \/etc\n[\u2026]<\/code><\/pre>\n\n\n\n<p>La structure <code>if<\/code> \/ <code>then<\/code> \/ <code>else<\/code> \/ <code>fi<\/code> \u00e9value la commande plac\u00e9e apr\u00e8s <code>if<\/code> :<\/p>\n\n\n\n<ul><li>Si le code retour de cette commande est 0 (vrai) le shell ex\u00e9cutera les commandes plac\u00e9es apr\u00e8s <code>then<\/code> ;<\/li><li>Si le code retour est diff\u00e9rent de 0 (faux) le shell ex\u00e9cutera les commandes plac\u00e9es apr\u00e8s <code>else<\/code>.<\/li><\/ul>\n\n\n\n<p>Le bloc <code>else<\/code> est facultatif.<\/p>\n\n\n\n<p>Il existe un besoin d\u2019effectuer certaines actions uniquement si l\u2019\u00e9valuation de la commande est vraie et n\u2019avoir rien \u00e0 faire si elle est fausse.<\/p>\n\n\n\n<p>Le mot <code>fi<\/code> ferme la structure.<\/p>\n\n\n\n<p>Lorsqu\u2019il n\u2019y a qu\u2019une seule commande \u00e0 ex\u00e9cuter dans le bloc <code>then<\/code>, il est possible d\u2019utiliser une syntaxe plus simple.<\/p>\n\n\n\n<p>La commande \u00e0 ex\u00e9cuter si <code>$?<\/code> est vrai est plac\u00e9e apr\u00e8s <code>&amp;&amp;<\/code> tandis que la commande \u00e0 ex\u00e9cuter si <code>$?<\/code> est faux est plac\u00e9e apr\u00e8s <code>||<\/code> (<em>facultatif<\/em>).<\/p>\n\n\n\n<pre title=\"Par exemple :\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ test -e \/etc\/passwd &amp;&amp; echo &quot;Le fichier existe&quot; || echo &quot;Le fichier n&#039;existe pas&quot;\n$ mkdir repert &amp;&amp; echo &quot;Le r\u00e9pertoire est cr\u00e9\u00e9&quot;<\/code><\/pre>\n\n\n\n<p>Il est possible d\u2019\u00e9valuer et de remplacer une variable avec une structure plus l\u00e9g\u00e8re que <code>if<\/code>.<\/p>\n\n\n\n<p>Cette syntaxe met en \u0153uvre les accolades :<\/p>\n\n\n\n<ul><li>Affiche une valeur de remplacement si la variable est vide :<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">${variable:-valeur}<\/code><\/pre>\n\n\n\n<ul><li>Affiche une valeur de remplacement si la variable n\u2019est pas vide :<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">${variable:+valeur}<\/code><\/pre>\n\n\n\n<ul><li>Affecte une nouvelle valeur \u00e0 la variable si elle est vide :<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">${variable:=valeur}<\/code><\/pre>\n\n\n\n<pre title=\"Exemples :\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ nom=&quot;&quot;\n$ echo ${nom:-linux}\nlinux\n$ echo $nom\n\n$ echo ${nom:=linux}\nlinux\n$ echo $nom\nlinux\n$ echo ${nom:+tux}\ntux\n$ echo $nom\nlinux<\/code><\/pre>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"structure-alternative-conditionnelle-case\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#structure-alternative-conditionnelle-case\"><\/a>Structure alternative conditionnelle <code>case<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-e5a893c1\"><h3 class=\"uagb-heading-text\">Structure alternative conditionnelle case<\/h3><\/div>\n\n\n\n<p>Une succession de structures <code>if<\/code> peut vite devenir lourde et complexe. Lorsqu\u2019elle concerne l\u2019\u00e9valuation d\u2019une m\u00eame variable, il est possible d\u2019utiliser une structure conditionnelle \u00e0 plusieurs branches. Les valeurs de la variable peuvent \u00eatre pr\u00e9cis\u00e9es ou appartenir \u00e0 une liste de possibilit\u00e9s.<\/p>\n\n\n\n<p>Les <strong>caract\u00e8res jokers sont utilisables<\/strong>.<\/p>\n\n\n\n<p>La structure <code>case \u2026 in<\/code> \/ <code>esac<\/code> \u00e9value la variable plac\u00e9e apr\u00e8s <code>case<\/code> et la compare aux valeurs d\u00e9finies.<\/p>\n\n\n\n<p>\u00c0 la premi\u00e8re \u00e9galit\u00e9 trouv\u00e9e, les commandes plac\u00e9es entre <code>)<\/code> et <code>;;<\/code> sont ex\u00e9cut\u00e9es.<\/p>\n\n\n\n<p>La variable \u00e9valu\u00e9e et les valeurs propos\u00e9es peuvent \u00eatre des cha\u00eenes de caract\u00e8res ou des r\u00e9sultats de sous-ex\u00e9cutions de commandes.<\/p>\n\n\n\n<p>Plac\u00e9 en fin de structure, le choix <code>*<\/code> indique les actions \u00e0 ex\u00e9cuter pour toutes les valeurs qui n\u2019ont pas \u00e9t\u00e9 pr\u00e9c\u00e9demment test\u00e9es.<\/p>\n\n\n\n<pre title=\"Syntaxe de l\u2019alternative conditionnelle case\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">case $variable in\n  valeur1)\n    commandes si $variable = valeur1\n    ;;\n  valeur2)\n    commandes si $variable = valeur2\n    ;;\n  [..]\n  *)\n    commandes pour toutes les valeurs de $variable != de valeur1 et valeur2\n    ;;\nesac<\/code><\/pre>\n\n\n\n<p>Lorsque la valeur est sujette \u00e0 variation, il est conseill\u00e9 d\u2019utiliser les caract\u00e8res jokers <code>[]<\/code> pour sp\u00e9cifier les possibilit\u00e9s :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">[Oo][Uu][Ii])\n  echo &quot;oui&quot;\n  ;;<\/code><\/pre>\n\n\n\n<p>Le caract\u00e8re <code>|<\/code> permet aussi de sp\u00e9cifier une valeur ou une autre :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">&quot;oui&quot; | &quot;OUI&quot;)\n  echo &quot;oui&quot;\n  ;;<\/code><\/pre>\n\n\n\n<h2 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"boucles\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#boucles\"><\/a>Boucles<\/h2>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-cc886ee4\"><h3 class=\"uagb-heading-text\">Boucles<\/h3><\/div>\n\n\n\n<p>Le shell bash permet l\u2019utilisation de <strong>boucles<\/strong>. Ces structures permettent l\u2019ex\u00e9cution d\u2019un <strong>bloc de commandes plusieurs fois<\/strong> (de 0 \u00e0 l\u2019infini) selon une valeur d\u00e9finie statiquement, dynamiquement ou sur condition :<\/p>\n\n\n\n<ul><li><code>while<\/code><\/li><li><code>until<\/code><\/li><li><code>for<\/code><\/li><li><code>select<\/code><\/li><\/ul>\n\n\n\n<p>Quelle que soit la boucle utilis\u00e9e, les commandes \u00e0 r\u00e9p\u00e9ter se <strong>placent entre les mots <code>do<\/code> et <code>done<\/code><\/strong>.<\/p>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"la-structure-boucle-conditionnelle-while\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#la-structure-boucle-conditionnelle-while\"><\/a>La structure boucle conditionnelle <code>while<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-6b184662\"><h3 class=\"uagb-heading-text\">La commande boucle conditionnelle while<\/h3><\/div>\n\n\n\n<p>La structure <code>while<\/code> \/ <code>do<\/code> \/ <code>done<\/code> \u00e9value la commande plac\u00e9e apr\u00e8s <code>while<\/code>.<\/p>\n\n\n\n<p>Si cette commande est vrai <code>($? = 0)<\/code>, les commandes plac\u00e9es entre <code>do<\/code> et <code>done<\/code> sont ex\u00e9cut\u00e9es. Le script retourne ensuite au d\u00e9but \u00e9valuer de nouveau la commande.<\/p>\n\n\n\n<p>Lorsque la commande \u00e9valu\u00e9e est fausse <code>($? != 0)<\/code>, le shell reprend l\u2019ex\u00e9cution du script \u00e0 la premi\u00e8re commande apr\u00e8s <code>done<\/code>.<\/p>\n\n\n\n<pre title=\"Syntaxe de la structure boucle conditionnelle while\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">while commande\ndo\n  commande si $? = 0\ndone<\/code><\/pre>\n\n\n\n<pre title=\"Exemple d\u2019utilisation de la structure conditionnelle while\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">while test -e \/etc\/passwd\ndo\n  echo &quot;Le fichier existe&quot;\ndone<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td>Si la commande \u00e9valu\u00e9e ne varie pas, la boucle sera infinie et le shell n\u2019ex\u00e9cutera jamais les commandes plac\u00e9es \u00e0 la suite du script. Cela peut \u00eatre volontaire, mais aussi \u00eatre une erreur. Il faut donc <strong>faire tr\u00e8s attention \u00e0 la commande qui r\u00e9git la boucle et trouver un moyen d\u2019en sortir<\/strong>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Pour sortir d\u2019une boucle <code>while<\/code>, il faut faire en sorte que la commande \u00e9valu\u00e9e ne soit plus vraie, ce qui n\u2019est pas toujours possible.<\/p>\n\n\n\n<p>Il existe des commandes qui permettent de modifier le comportement d\u2019une boucle :<\/p>\n\n\n\n<ul><li><code>exit<\/code><\/li><li><code>break<\/code><\/li><li><code>continue<\/code><\/li><\/ul>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"la-commande-exit\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#la-commande-exit\"><\/a>La commande <code>exit<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-5450b6bf\"><h3 class=\"uagb-heading-text\">La commande exit<\/h3><\/div>\n\n\n\n<p>La commande <code>exit<\/code> termine l\u2019ex\u00e9cution du script.<\/p>\n\n\n\n<pre title=\"Syntaxe de la commande exit\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">exit [n]<\/code><\/pre>\n\n\n\n<pre title=\"Exemple d\u2019utilisaton de la commande exit\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ bash        # pour \u00e9viter d&#039;\u00eatre d\u00e9connect\u00e9 apr\u00e8s le \u00ab exit 1 \u00bb\n$ exit 1\n$ echo $?\n1<\/code><\/pre>\n\n\n\n<p>La commande <code>exit<\/code> met fin au script imm\u00e9diatement. Il est possible de pr\u00e9ciser le code de retour du script en le pr\u00e9cisant en argument (<em>de 0 \u00e0 255<\/em>). Sans argument pr\u00e9cis\u00e9, c\u2019est le code de retour de la derni\u00e8re commande du script qui sera transmise \u00e0 la variable <code>$?<\/code>.<\/p>\n\n\n\n<p>Cette commande est utile dans le cas d\u2019un menu proposant la sortie du script dans les choix possibles.<\/p>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"la-commande-break-continue\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#la-commande-break-continue\"><\/a>La commande <code>break<\/code> \/ <code>continue<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-a6b78642\"><h3 class=\"uagb-heading-text\">La commande break \/ continue<\/h3><\/div>\n\n\n\n<p>La commande <code>break<\/code> permet d\u2019interrompre la boucle en allant \u00e0 la premi\u00e8re commande apr\u00e8s <code>done<\/code>.<\/p>\n\n\n\n<p>La commande <code>continue<\/code> permet de relancer la boucle en revenant \u00e0 la premi\u00e8re commande apr\u00e8s <code>do<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">while test -d \/\ndo\n  echo &quot;Voulez-vous continuer ? (oui\/non)&quot;\n  read rep\n  test $rep = &quot;oui&quot; &amp;&amp; continue\n  test $rep = &quot;non&quot; &amp;&amp; break\ndone<\/code><\/pre>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"les-commandes-true-false\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#les-commandes-true-false\"><\/a>Les commandes <code>true<\/code> \/ <code>false<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-7c00deb5\"><h3 class=\"uagb-heading-text\">Les commandes true \/ false<\/h3><\/div>\n\n\n\n<p>La commande <code>true<\/code> renvoie toujours vrai tandis que la commande <code>false<\/code> renvoie toujours faux.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ true\n$ echo $?\n0\n$ false\n$ echo $?\n1<\/code><\/pre>\n\n\n\n<p>Utilis\u00e9es comme condition d\u2019une boucle, elles permettent soit d\u2019ex\u00e9cuter une boucle infinie soit de d\u00e9sactiver cette boucle.<\/p>\n\n\n\n<pre title=\"Exemple :\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">while true\ndo\n  echo &quot;Voulez-vous continuer ? (oui\/non)&quot;\n  read rep\n  test $rep = &quot;oui&quot; &amp;&amp; continue\n  test $rep = &quot;non&quot; &amp;&amp; break\ndone<\/code><\/pre>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"la-structure-boucle-conditionnelle-until\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#la-structure-boucle-conditionnelle-until\"><\/a>La structure boucle conditionnelle <code>until<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-800437e7\"><h3 class=\"uagb-heading-text\">La structure boucle conditionnelle until<\/h3><\/div>\n\n\n\n<p>La structure <code>until<\/code> \/ <code>do<\/code> \/ <code>done<\/code> \u00e9value la commande plac\u00e9e apr\u00e8s <code>until<\/code>.<\/p>\n\n\n\n<p>Si cette commande est fausse <code>($? != 0)<\/code>, les commandes plac\u00e9es entre <code>do<\/code> et <code>done<\/code> sont ex\u00e9cut\u00e9es. Le script retourne ensuite au d\u00e9but \u00e9valuer de nouveau la commande.<\/p>\n\n\n\n<p>Lorsque la commande \u00e9valu\u00e9e est vraie <code>($? = 0)<\/code>, le shell reprend l\u2019ex\u00e9cution du script \u00e0 la premi\u00e8re commande apr\u00e8s <code>done<\/code>.<\/p>\n\n\n\n<pre title=\"Syntaxe de la structure boucle conditionnelle until\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">until commande\ndo\n  commande si $? != 0\ndone<\/code><\/pre>\n\n\n\n<pre title=\"Exemple d\u2019utilisation de la structure conditionnelle until\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">until test -e \/etc\/passwd\ndo\n  echo &quot;Le fichier n&#039;existe pas&quot;\ndone<\/code><\/pre>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"la-structure-choix-alternatif-select\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#la-structure-choix-alternatif-select\"><\/a>La structure choix alternatif <code>select<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-85a4d716\"><h3 class=\"uagb-heading-text\">La structure choix alternatif <strong>select<\/strong><\/h3><\/div>\n\n\n\n<p>La structure <code>select<\/code> \/ <code>do<\/code> \/ <code>done<\/code> permet d\u2019afficher rapidement un menu avec plusieurs choix et une demande de saisie.<\/p>\n\n\n\n<p>\u00c0 chaque \u00e9l\u00e9ment de la liste correspond un choix num\u00e9rot\u00e9. \u00c0 la saisie, la valeur choisie est affect\u00e9e \u00e0 la variable plac\u00e9e apr\u00e8s <code>select<\/code> (<em>cr\u00e9\u00e9e \u00e0 cette occasion<\/em>).<\/p>\n\n\n\n<p>Elle ex\u00e9cute ensuite les commandes plac\u00e9es entre <code>do<\/code> et <code>done<\/code> avec cette valeur.<\/p>\n\n\n\n<ul><li>La variable <code>PS3<\/code> contient le message d\u2019invitation \u00e0 entrer le choix ;<\/li><li>La variable <code>REPLY<\/code> va permettre de r\u00e9cup\u00e9rer le num\u00e9ro du choix.<\/li><\/ul>\n\n\n\n<p>Il faut une commande <code>break<\/code> pour sortir de la boucle.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><\/td><td>La structure <code>select<\/code> est tr\u00e8s utile pour de petits menus simples et rapides. Pour personnaliser un affichage plus complet, il faudra utiliser les commandes <code>echo<\/code> et <code>read<\/code> dans une boucle <code>while<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre title=\"Syntaxe de la structure boucle conditionnelle select\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">PS3=&quot;Votre choix :&quot;\nselect variable in var1 var2 var3\ndo\n  commandes\ndone<\/code><\/pre>\n\n\n\n<pre title=\"Exemple d\u2019utilisation de la structure conditionnelle select\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">PS3=&quot;Votre choix : &quot;\nselect choix in caf\u00e9 th\u00e9 chocolat\ndo\n  echo &quot;Vous avez choisi le $REPLY : $choix&quot;\ndone<\/code><\/pre>\n\n\n\n<p>ce qui donne \u00e0 l\u2019ex\u00e9cution :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">1) Caf\u00e9\n2) Th\u00e9\n3) Chocolat\nVotre choix : 2\nVous avez choisi le choix 2 : th\u00e9\nVotre choix :<\/code><\/pre>\n\n\n\n<h3 class=\"uag-hide-desktop uag-hide-tab uag-hide-mob wp-block-heading\" id=\"la-structure-boucle-sur-liste-de-valeurs-for\"><a href=\"https:\/\/www.formatux.fr\/formatux-bash\/module-020-mecanismes-base\/index.html#la-structure-boucle-sur-liste-de-valeurs-for\"><\/a>La structure boucle sur liste de valeurs <code>for<\/code><\/h3>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-fba99c2b\"><h3 class=\"uagb-heading-text\">La structure boucle sur liste de valeurs <strong>for<\/strong><\/h3><\/div>\n\n\n\n<p>La structure <code>for<\/code> \/ <code>do<\/code> \/ <code>done<\/code> affecte le premier \u00e9l\u00e9ment de la liste \u00e0 la variable plac\u00e9e apr\u00e8s <code>for<\/code> (<em>cr\u00e9\u00e9e \u00e0 cette occasion<\/em>).<\/p>\n\n\n\n<p>Elle ex\u00e9cute ensuite les commandes plac\u00e9es entre <code>do<\/code> et <code>done<\/code> avec cette valeur. Le script retourne ensuite au d\u00e9but affecter l\u2019\u00e9l\u00e9ment suivant de la liste \u00e0 la variable de travail.<\/p>\n\n\n\n<p>Lorsque le dernier \u00e9l\u00e9ment a \u00e9t\u00e9 utilis\u00e9, le shell reprend l\u2019ex\u00e9cution \u00e0 la premi\u00e8re commande apr\u00e8s <code>done<\/code>.<\/p>\n\n\n\n<pre title=\"Syntaxe de la structure boucle sur liste de valeurs for\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">for variable in liste\ndo\n  commandes\ndone<\/code><\/pre>\n\n\n\n<pre title=\"Exemple d\u2019utilisation de la structure conditionnelle for\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">for fichier in \/home \/etc\/passwd \/root\/fic.txt\ndo\n  file $fichier\ndone<\/code><\/pre>\n\n\n\n<p>Toute commande produisant une liste de valeurs peut \u00eatre plac\u00e9e \u00e0 la suite du <code>in<\/code> \u00e0 l\u2019aide d\u2019une sous-ex\u00e9cution.<\/p>\n\n\n\n<ul><li>Avec la variable <code>IFS<\/code> contenant <code>$&#039; \\t\\n&#039;<\/code>, la boucle <code>for<\/code> prendra <strong>chaque mot<\/strong> du r\u00e9sultat de cette commande comme liste d\u2019\u00e9l\u00e9ments sur laquelle boucler .<\/li><li>Avec la variable <code>IFS<\/code> contenant <code>$&#039;\\t\\n&#039;<\/code> (c\u2019est-\u00e0-dire sans espace), la boucle <code>for<\/code> prendra <strong>chaque ligne<\/strong> du r\u00e9sultat de cette commande.<\/li><\/ul>\n\n\n\n<p>Cela peut \u00eatre les fichiers d\u2019un r\u00e9pertoire. Dans ce cas, la variable prendra comme valeur chacun des mots des noms des fichiers pr\u00e9sents :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">for fichier in $(ls -d \/tmp\/*)\ndo\n  echo $fichier\ndone<\/code><\/pre>\n\n\n\n<p>Cela peut \u00eatre un fichier. Dans ce cas, la variable prendra comme valeur chaque mot contenu dans le fichier parcouru, du d\u00e9but \u00e0 la fin :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ cat mon_fichier.txt\npremi\u00e8re ligne\nseconde ligne\ntroisi\u00e8me ligne\n$ for LIGNE in $(cat mon_fichier.txt); do echo $LIGNE; done\npremi\u00e8re\nligne\nseconde\nligne\ntroisi\u00e8me\nligne<\/code><\/pre>\n\n\n\n<p>Pour lire ligne par ligne un fichier, il faut modifier la valeur de la variable d\u2019environnement <code>IFS<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ IFS=$&#039;\\t\\n&#039;\n$ for LIGNE in $(cat mon_fichier.txt); do echo $LIGNE; done\npremi\u00e8re ligne\nseconde ligne\ntroisi\u00e8me ligne<\/code><\/pre>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow\" style=\"flex-basis:170px\">\n\n<div class=\"cleanlogin-container\">\t\t\n\n\t<form class=\"cleanlogin-form\" method=\"post\" action=\"https:\/\/www.webodesign.net\/?page_id=2385\" onsubmit=\"submit.disabled = true; return true;\">\n\t\t\t\n\t\t<fieldset>\n\n\t\t\t\t\t\t<div class=\"cleanlogin-field\">\n                <label for=\"log\">Identifiant<\/label>\n\t\t\t\t<input class=\"cleanlogin-field-username\" type=\"text\" name=\"log\" placeholder=\"Identifiant\" aria-label=\"Identifiant\">\n\t\t\t<\/div>\n\t\t\t\n\t\t\t<div class=\"cleanlogin-field\">\n                <label for=\"pwd\">Mot de passe<\/label>\n\t\t\t\t<input class=\"cleanlogin-field-password\" type=\"password\" id=\"pwd\" name=\"pwd\" placeholder=\"Mot de passe\" aria-label=\"Mot de passe\">\n                <i class=\"bi bi-eye-slash\" id=\"togglePassword\"><\/i>\n\t\t\t<\/div>\n\n\t\t\t\t\t\n\t\t\t<input type=\"hidden\" name=\"clean_login_wpnonce\" value=\"e994c14fba\">\n            \n\t\t\t\t\t<\/fieldset>\n\t\t\n\t\t<fieldset>\n\t\t\t<input class=\"cleanlogin-field\" type=\"submit\" value=\"Se connecter\" name=\"submit\">\n\t\t\t<input type=\"hidden\" name=\"action\" value=\"login\">\n\t\t\t\n\t\t\t<div class=\"cleanlogin-field cleanlogin-field-remember\">\n\t\t\t\t<input type=\"checkbox\" id=\"rememberme\" name=\"rememberme\" value=\"forever\">\n\t\t\t\t<label for=\"rememberme\">Se souvenir de moi\u00a0?<\/label>\n\t\t\t<\/div>\n\t\t<\/fieldset>\n\n\t\t\n\t\t<div class=\"cleanlogin-form-bottom\">\n\t\t\t\n            \n\t\t\t\t\t\t\t\t\t\n\t\t<\/div>\n\t\t\n\t<\/form>\n\n<\/div>\n\n<script>\nconst togglePassword = document.querySelector('#togglePassword');\nconst password = document.querySelector('#pwd');\n\ntogglePassword.addEventListener('click', function (e) {\n    const type = password.getAttribute('type') === 'password' ? 'text' : 'password';\n    password.setAttribute('type', type);\n    this.classList.toggle('bi-eye');\n});\n<\/script>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-c5439e46 alignfull uagb-is-root-container\"><div class=\"uagb-container-inner-blocks-wrap\">\n<div class=\"wp-block-columns is-layout-flex wp-container-11\">\n<div class=\"wp-block-column is-layout-flow\">\n<div class=\"wp-block-group is-layout-flow\">\n<p><\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-9ad01464\"><h3 class=\"uagb-heading-text\">Premi\u00e8res configurations syst\u00e8me<\/h3><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-00820887\"><h3 class=\"uagb-heading-text\">Premier contacts<\/h3><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-c62696df\"><h3 class=\"uagb-heading-text\">Premier contacts<\/h3><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-d63b6952\"><h3 class=\"uagb-heading-text\">Comment fonctionne un VPS<\/h3><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-48706c59\"><h3 class=\"uagb-heading-text\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-primary-color\">Instalation de la commande sudo<\/mark><\/h3><\/div>\n\n\n\n<p><\/p>\n\n\n\n<pre title=\"Script pour la cr\u00e9ation d'un utilisateur\" class=\"wp-block-code has-background-color has-text-color\" style=\"border-radius:20px;border-width:2px\"><code lang=\"bash\" class=\"language-bash line-numbers\">remi ALL=(ALL) NOPASSWD:ALL\n%sudo   ALL=(ALL:ALL) NOPASSWD:ALL\npuis on sauvegarde(Ctrl+o)\/quit(Ctrl+x)\n# On termine en red\u00e9marrant le service sudo:\n\/etc\/init.d\/sudo restart\n<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-uagb-blockquote uagb-block-af155a07 uagb-blockquote__skin-quotation uagb-blockquote__align-left uagb-blockquote__style-style_2 uagb-blockquote__stack-img-none\"><blockquote class=\"uagb-blockquote\"><span class=\"uagb-blockquote__icon\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 32 32\"><path d=\"M7.031 14c3.866 0 7 3.134 7 7s-3.134 7-7 7-7-3.134-7-7l-0.031-1c0-7.732 6.268-14 14-14v4c-2.671 0-5.182 1.040-7.071 2.929-0.364 0.364-0.695 0.751-0.995 1.157 0.357-0.056 0.724-0.086 1.097-0.086zM25.031 14c3.866 0 7 3.134 7 7s-3.134 7-7 7-7-3.134-7-7l-0.031-1c0-7.732 6.268-14 14-14v4c-2.671 0-5.182 1.040-7.071 2.929-0.364 0.364-0.695 0.751-0.995 1.157 0.358-0.056 0.724-0.086 1.097-0.086z\"><\/path><\/svg><\/span><div class=\"uagb-blockquote__content\">apt update, upgrade, dist-upgrade et full-upgrade : quelles sont les diff\u00e9rences ? quel terme utiliser en fonction de se que l&rsquo;on cherche \u00e0 faire : Lire l&rsquo;article suivant&#8230;<br>E t en prime un lien vers un article de l&rsquo;h\u00e9bergeur Contabo intitul\u00e9 : <a rel=\"noreferrer noopener\" href=\"https:\/\/contabo.com\/blog\/debian-ubuntu-upgrade\/\" data-type=\"URL\" data-id=\"https:\/\/contabo.com\/blog\/debian-ubuntu-upgrade\/\" target=\"_blank\">\u00ab\u00a0Debian et Ubuntu Upgrade\u00a0\u00bb<\/a><\/div><footer><div class=\"uagb-blockquote__author-wrap uagb-blockquote__author-at-left\"><cite class=\"uagb-blockquote__author\">Author Name<\/cite><\/div><\/footer><\/blockquote><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-uagb-icon-list uagb-block-6741e2eb\"><div class=\"uagb-icon-list__wrap\">\n<div class=\"wp-block-uagb-icon-list-child uagb-block-f51f6452\"><span class=\"uagb-icon-list__source-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 256 512\"><path d=\"M256 448c0 17.67-14.33 32-32 32H32c-17.67 0-32-14.33-32-32s14.33-32 32-32h64V123.8L49.75 154.6C35.02 164.5 15.19 160.4 5.375 145.8C-4.422 131.1-.4531 111.2 14.25 101.4l96-64c9.828-6.547 22.45-7.187 32.84-1.594C153.5 41.37 160 52.22 160 64.01v352h64C241.7 416 256 430.3 256 448z\"><\/path><\/svg><\/span><span class=\"uagb-icon-list__label\">Une adresse IP qui identifie votre <em>h\u00f4te<\/em> sur le r\u00e9seau o\u00f9 il est connect\u00e9.<br>La commande \u00ab\u00a0<strong>ip address\u00a0\u00bb<\/strong> ou \u00ab\u00a0<strong>ip a<\/strong>\u00a0\u00bb en raccourci, permet d&rsquo;afficher les interfaces r\u00e9seau avec les adresses IP associ\u00e9es.<\/span><\/div>\n<\/div><\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-group has-foreground-color has-text-color has-background is-layout-flow\" style=\"background-color:#cacaca;border-radius:20px;margin-top:10px;margin-bottom:10px;padding-top:3px;padding-right:3px;padding-bottom:3px;padding-left:3px\">\n<div class=\"wp-block-uagb-icon-list uagb-block-3c95a0ee\"><div class=\"uagb-icon-list__wrap\">\n<div class=\"wp-block-uagb-icon-list-child uagb-block-5850da75\"><span class=\"uagb-icon-list__source-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 31.1c-141.4 0-255.1 93.12-255.1 208c0 49.62 21.35 94.98 56.97 130.7c-12.5 50.37-54.27 95.27-54.77 95.77c-2.25 2.25-2.875 5.734-1.5 8.734c1.249 3 4.021 4.766 7.271 4.766c66.25 0 115.1-31.76 140.6-51.39c32.63 12.25 69.02 19.39 107.4 19.39c141.4 0 255.1-93.13 255.1-207.1S397.4 31.1 256 31.1zM127.1 271.1c-17.75 0-32-14.25-32-31.1s14.25-32 32-32s32 14.25 32 32S145.7 271.1 127.1 271.1zM256 271.1c-17.75 0-31.1-14.25-31.1-31.1s14.25-32 31.1-32s31.1 14.25 31.1 32S273.8 271.1 256 271.1zM383.1 271.1c-17.75 0-32-14.25-32-31.1s14.25-32 32-32s32 14.25 32 32S401.7 271.1 383.1 271.1z\"><\/path><\/svg><\/span><span class=\"uagb-icon-list__label\">La commande retourne l&rsquo;interface \u00ab\u00a0<em>lo<\/em>\u00a0\u00bb qui correspond \u00e0 l&rsquo;interface de \u00ab\u00a0<em>loopback<\/em>\u00a0\u00bb (boucle locale), ainsi que l&rsquo;interface \u00ab\u00a0eth0\u00a0\u00bb correspondante \u00e0 la carte r\u00e9seau connect\u00e9e \u00e0 mon r\u00e9seau local. On peut voir que l&rsquo;adresse IP actuelle sur cette carte est \u00ab\u00a0<em>38.242.201.85\/20<\/em>\u00ab\u00a0.<\/span><\/div>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-icon-list uagb-block-e64b7a84\"><div class=\"uagb-icon-list__wrap\">\n<div class=\"wp-block-uagb-icon-list-child uagb-block-d3a2d4cc\"><span class=\"uagb-icon-list__source-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 320 512\"><path d=\"M320 448c0 17.67-14.33 32-32 32H32c-13.08 0-24.83-7.953-29.7-20.09c-4.859-12.12-1.859-26 7.594-35.03l193.6-185.1c31.36-30.17 33.95-80 5.812-113.4c-14.91-17.69-35.86-28.12-58.97-29.38C127.4 95.83 105.3 103.9 88.53 119.9L53.52 151.7c-13.08 11.91-33.33 10.89-45.2-2.172C-3.563 136.5-2.594 116.2 10.48 104.3l34.45-31.3c28.67-27.34 68.39-42.11 108.9-39.88c40.33 2.188 78.39 21.16 104.4 52.03c49.8 59.05 45.2 147.3-10.45 200.8l-136 130H288C305.7 416 320 430.3 320 448z\"><\/path><\/svg><\/span><span class=\"uagb-icon-list__label\">Un masque de sous-r\u00e9seau qui indique la partie de votre adresse qui caract\u00e9rise le r\u00e9seau local sur lequel votre h\u00f4te est connect\u00e9, et lui permet de d\u00e9terminer, pour n&rsquo;importe quelle adresse IP, si celle-ci fait ou non partie du r\u00e9seau local<\/span><\/div>\n\n\n\n<div class=\"wp-block-uagb-icon-list-child uagb-block-6524a27a\"><span class=\"uagb-icon-list__source-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 320 512\"><path d=\"M320 344c0 74.98-61.02 136-136 136H103.6c-46.34 0-87.31-29.53-101.1-73.48c-5.594-16.77 3.484-34.88 20.25-40.47c16.75-5.609 34.89 3.484 40.47 20.25c5.922 17.77 22.48 29.7 41.23 29.7H184c39.7 0 72-32.3 72-72s-32.3-72-72-72H80c-13.2 0-25.05-8.094-29.83-20.41C45.39 239.3 48.66 225.3 58.38 216.4l131.4-120.4H32c-17.67 0-32-14.33-32-32s14.33-32 32-32h240c13.2 0 25.05 8.094 29.83 20.41c4.781 12.3 1.516 26.27-8.203 35.19l-131.4 120.4H184C258.1 208 320 269 320 344z\"><\/path><\/svg><\/span><span class=\"uagb-icon-list__label\">Une passerelle par d\u00e9faut qui indique l&rsquo;adresse IP \u00e0 laquelle il faut transmettre les paquets IP destin\u00e9s \u00e0 des h\u00f4tes situ\u00e9s hors du r\u00e9seau local, pour qu&rsquo;ils soient <em>rout\u00e9s<\/em> vers le r\u00e9seau local de leur destinataire.<br>Afin de conna\u00eetre la passerelle par d\u00e9faut utilis\u00e9e actuellement par notre machine, plusieurs solutions sont possibles. La commande suivante retourne les routes locales, ainsi que la route par d\u00e9faut, ce qui donne l&rsquo;adresse IP de la passerelle.<br><strong>ip route show<\/strong><\/span><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-border-color has-background-color has-text-color has-background is-layout-flow\" style=\"background-color:#282c34;border-color:#cccccc;border-radius:20px;border-width:5px;font-size:17px;margin-bottom:15px;padding-top:3px;padding-right:3px;padding-bottom:3px;padding-left:3px\">\n<div class=\"wp-block-uagb-icon-list uagb-block-db9663b7\"><div class=\"uagb-icon-list__wrap\">\n<div class=\"wp-block-uagb-icon-list-child uagb-block-7f5c54c5\"><span class=\"uagb-icon-list__source-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\"><path d=\"M160 416H96c-17.67 0-32-14.33-32-32V128c0-17.67 14.33-32 32-32h64c17.67 0 32-14.33 32-32S177.7 32 160 32H96C42.98 32 0 74.98 0 128v256c0 53.02 42.98 96 96 96h64c17.67 0 32-14.33 32-32S177.7 416 160 416zM502.6 233.4l-128-128c-12.51-12.51-32.76-12.49-45.25 0c-12.5 12.5-12.5 32.75 0 45.25L402.8 224H192C174.3 224 160 238.3 160 256s14.31 32 32 32h210.8l-73.38 73.38c-12.5 12.5-12.5 32.75 0 45.25s32.75 12.5 45.25 0l128-128C515.1 266.1 515.1 245.9 502.6 233.4z\"><\/path><\/svg><\/span><span class=\"uagb-icon-list__label\">robert@vmi000000:~$ ip route show<br>default via 38.242.192.1 dev eth0 onlink<br>38.242.192.0\/20 via <strong>38.242.192.1<\/strong> dev eth0<\/span><\/div>\n\n\n\n<div class=\"wp-block-uagb-icon-list-child uagb-block-80e8d2ef\"><span class=\"uagb-icon-list__source-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 31.1c-141.4 0-255.1 93.12-255.1 208c0 49.62 21.35 94.98 56.97 130.7c-12.5 50.37-54.27 95.27-54.77 95.77c-2.25 2.25-2.875 5.734-1.5 8.734c1.249 3 4.021 4.766 7.271 4.766c66.25 0 115.1-31.76 140.6-51.39c32.63 12.25 69.02 19.39 107.4 19.39c141.4 0 255.1-93.13 255.1-207.1S397.4 31.1 256 31.1zM127.1 271.1c-17.75 0-32-14.25-32-31.1s14.25-32 32-32s32 14.25 32 32S145.7 271.1 127.1 271.1zM256 271.1c-17.75 0-31.1-14.25-31.1-31.1s14.25-32 31.1-32s31.1 14.25 31.1 32S273.8 271.1 256 271.1zM383.1 271.1c-17.75 0-32-14.25-32-31.1s14.25-32 32-32s32 14.25 32 32S401.7 271.1 383.1 271.1z\"><\/path><\/svg><\/span><span class=\"uagb-icon-list__label\">Dans mon cas, la passerelle est \u00ab\u00a038.242.201.1\u00a0\u00bb.<\/span><\/div>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-icon-list uagb-block-69bffadf\"><div class=\"uagb-icon-list__wrap\">\n<div class=\"wp-block-uagb-icon-list-child uagb-block-9c538b95\"><span class=\"uagb-icon-list__source-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 384 512\"><path d=\"M384 334.2c0 17.67-14.33 32-32 32h-32v81.78c0 17.67-14.33 32-32 32s-32-14.33-32-32v-81.78H32c-10.97 0-21.17-5.625-27.05-14.89c-5.859-9.266-6.562-20.89-1.875-30.81l128-270.2C138.6 34.33 157.8 27.56 173.7 35.09c15.97 7.562 22.78 26.66 15.22 42.63L82.56 302.2H256V160c0-17.67 14.33-32 32-32s32 14.33 32 32v142.2h32C369.7 302.2 384 316.6 384 334.2z\"><\/path><\/svg><\/span><span class=\"uagb-icon-list__label\">Une ou plusieurs adresses de serveurs DNS auxquels le syst\u00e8me ira demander les correspondances entre noms de domaine (<em>www.webOdesign<\/em>.net) et adresses IP (38.242.201.85).<br>Pour la trouver, il faut regarder le contenu du fichier \u00ab\u00a0<em><strong>\/etc\/resolv.conf<\/strong><\/em>\u00ab\u00a0<\/span><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group is-layout-constrained\" style=\"font-size:14px;margin-bottom:10px;padding-top:0px;padding-bottom:5px\">\n<pre class=\"wp-block-code has-background-color has-text-color uag-hide-tab uag-hide-mob\" style=\"border-radius:15px;border-width:5px;padding-top:5px;padding-bottom:5px\"><code lang=\"bash\" class=\"language-bash\">robert@vmi000000:~$ sudo cat \/etc\/resolv.conf\nDynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)\nDO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN\n127.0.0.53 is the systemd-resolved stub resolver.\nrun &quot;resolvectl status&quot; to see details about the actual nameservers.\nnameserver 161.97.189.51\nnameserver 161.97.189.52<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-background-color has-text-color uag-hide-desktop\" style=\"border-radius:15px;border-width:5px;padding-top:5px;padding-bottom:5px\"><code lang=\"bash\" class=\"language-bash\">robert@vmi000000:~$ sudo cat \/etc\/resolv.conf\nrun &quot;resolvectl status&quot; see details about nameservers.\nnameserver 161.97.189.51\nnameserver 161.97.189.52<\/code><\/pre>\n<\/div>\n\n\n\n<p><\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow\" style=\"flex-basis:170px\">\n<p><\/p>\n\n\n\n<p><\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p><strong>Objectifs p\u00e9dagogiques<\/strong><br \/><em>Dans ce chapitre, vous allez apprendre \u00e0 utiliser des structures de tests, des structures conditionnelles et des boucles :<\/em><br \/>   &#8211; Tester des variables, des fichiers ;<br \/>   &#8211; Utiliser une structure conditionnelle ;<br \/>   &#8211; Faire des boucles <code>while<\/code>, <code>until<\/code>, <code>select<\/code>, <code>for<\/code>.<\/p>\n<p>[\u00e9tiquettes : script, shell, bash, structure, boucle]<\/p>\n","protected":false},"author":3,"featured_media":1399,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"qubely_global_settings":"","qubely_interactions":"","_uag_custom_page_level_css":""},"categories":[18,21],"tags":[],"qubely_featured_image_url":{"full":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"landscape":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"portraits":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",540,281,false],"thumbnail":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell-150x150.png",150,150,true],"medium":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell-300x156.png",300,156,true],"medium_large":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell-768x400.png",768,400,true],"large":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"1536x1536":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"2048x2048":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"qubely_landscape":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"qubely_portrait":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",540,281,false],"qubely_thumbnail":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",140,73,false]},"qubely_author":{"display_name":"R\u00e9mi","author_link":"https:\/\/www.webodesign.net\/?author=3"},"qubely_comment":0,"qubely_category":"<a href=\"https:\/\/www.webodesign.net\/?cat=18\" rel=\"category\">Formations<\/a> <a href=\"https:\/\/www.webodesign.net\/?cat=21\" rel=\"category\">Formations Linux<\/a>","qubely_excerpt":"Objectifs p\u00e9dagogiquesDans ce chapitre, vous allez apprendre \u00e0 utiliser des structures de tests, des structures conditionnelles et des boucles : - Tester des variables, des fichiers ; - Utiliser une structure conditionnelle ; - Faire des boucles while, until, select, for.[\u00e9tiquettes : script, shell, bash, structure, boucle]","uagb_featured_image_src":{"full":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"thumbnail":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell-150x150.png",150,150,true],"medium":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell-300x156.png",300,156,true],"medium_large":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell-768x400.png",768,400,true],"large":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"1536x1536":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"2048x2048":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"qubely_landscape":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",940,490,false],"qubely_portrait":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",540,281,false],"qubely_thumbnail":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2022\/10\/les-scripts-shell.png",140,73,false]},"uagb_author_info":{"display_name":"R\u00e9mi","author_link":"https:\/\/www.webodesign.net\/?author=3"},"uagb_comment_info":0,"uagb_excerpt":"Objectifs p\u00e9dagogiquesDans ce chapitre, vous allez apprendre \u00e0 utiliser des structures de tests, des structures conditionnelles et des boucles : - Tester des variables, des fichiers ; - Utiliser une structure conditionnelle ; - Faire des boucles while, until, select, for.[\u00e9tiquettes : script, shell, bash, structure, boucle]","_links":{"self":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/posts\/1327"}],"collection":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1327"}],"version-history":[{"count":17,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/posts\/1327\/revisions"}],"predecessor-version":[{"id":1507,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/posts\/1327\/revisions\/1507"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/media\/1399"}],"wp:attachment":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}