<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sleg</id>
	<title>Lea Linux - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sleg"/>
	<link rel="alternate" type="text/html" href="https://lea-linux.org/documentations/Sp%C3%A9cial:Contributions/Sleg"/>
	<updated>2026-04-19T08:53:14Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Bac_%C3%A0_sable&amp;diff=9381</id>
		<title>Bac à sable</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Bac_%C3%A0_sable&amp;diff=9381"/>
		<updated>2005-10-17T19:14:00Z</updated>

		<summary type="html">&lt;p&gt;Sleg : /* essai d&amp;#039;ajout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Information =&lt;br /&gt;
Cette page est le bac à sable de Léa : utilisez le pour faire vos expérimentations. N&#039;hésitez pas à y faire n&#039;importe quoi.&lt;br /&gt;
&lt;br /&gt;
== essai d&#039;ajout ==&lt;br /&gt;
&lt;br /&gt;
un ajout via &amp;quot;action=edit/section=new/&lt;/div&gt;</summary>
		<author><name>Sleg</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Script_shell&amp;diff=7864</id>
		<title>Script shell</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Script_shell&amp;diff=7864"/>
		<updated>2005-10-13T20:54:55Z</updated>

		<summary type="html">&lt;p&gt;Sleg : /* Copyright */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Développer sous Linux]]&lt;br /&gt;
= Programmation de Script: Une introduction =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;Programmation de Script: Une introduction&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;par Fred, correction et ajouts de Marc&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leadesc&amp;quot;&amp;gt;Comment écrire de petits scripts permettant d&#039;automatiser la réalisation de taches répétitives.&amp;lt;/div&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Vous aurez envie d&#039;écrire un script (petit programme écrit avec un langage simple : shell, perl ou autre) dès que vous aurez tapé dans un terminal quatre fois la même série de commandes et que vous vous apercevrez que vous êtes ammené à le refaire de nombreuses fois. &amp;lt;br /&amp;gt;Un script est une suite d&#039;instructions élémentaires qui sont éxécutées de façon séquencielle (les unes après les autres) par le langage de script. &amp;lt;br /&amp;gt;Dans cet article nous nous limiterons à l&#039;utilisation du shell comme langage, et en particulier à du shell &amp;lt;tt&amp;gt;bash&amp;lt;/tt&amp;gt;. En guise de première introduction, vous pouvez lire ce qui concerne les commandes du shell dans l&#039;article [http://lea-linux.org/admin/shell.php3 Le Shell et les Commandes]. Attention, n&#039;espérez pas que le présent document constitue un manuel complet de programmation ! C&#039;est une courte introduction qui nous l&#039;espérons, vous permettra d&#039;écrire de petits scripts qui vous rendront de précieux services.&lt;br /&gt;
&lt;br /&gt;
== Notions de base ==&lt;br /&gt;
&lt;br /&gt;
=== Mon premier script. ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer, il faut savoir qu&#039;un script est un fichier texte standard pouvant être créé par n&#039;importe quel éditeur : [http://lea-linux.org/software/vi.php3 vi], [http://lea-linux.org/software/emacs.php3 emacs], kedit, gnotepad, ou autre. D&#039;autre part, conventionnellement, un script commence par une ligne de commentaire contenant le nom du langage à utiliser pour interpréter ce script, soit dans notre cas : &amp;lt;tt&amp;gt;/bin/sh&amp;lt;/tt&amp;gt; (on parle alors de &amp;quot;script shell&amp;quot;). Donc un script shell élémentaire pourrait être :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Note&amp;lt;/u&amp;gt; : &amp;lt;tt&amp;gt;&amp;quot;#!&amp;quot;&amp;lt;/tt&amp;gt; se prononce &amp;quot;&#039;&#039;she bang&#039;&#039;&amp;quot;, soit &amp;quot;chi-bang&amp;quot;. &amp;lt;br /&amp;gt;Évidemment un tel script ne fait rien ! Changeons cela. La commande qui affiche quelque chose à l&#039;écran est &amp;lt;tt&amp;gt;echo&amp;lt;/tt&amp;gt;. Donc pour créer le script &amp;lt;tt&amp;gt;bonjour_monde&amp;lt;/tt&amp;gt; nous pouvons écrire :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo &amp;quot;Bonjour, Monde !&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo &amp;quot;un premier script est né.&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comment on l&#039;éxécute ? C&#039;est simple il suffit de faire :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;[user@becane user]$ &#039;&#039;&#039;sh bonjour_monde&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;Bonjour, Monde !&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;un premier script est né.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;[user@becane user]$ &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;_&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C&#039;est pas cool, vous préféreriez taper quelque chose comme :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;[user@becane user]$ &#039;&#039;&#039;./bonjour_monde&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;Bonjour, Monde !&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;un premier script est né.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;[user@becane user]$ _&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C&#039;est possible si vous avez au préalable rendu votre script exécutable par la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;[user@becane user]$ &#039;&#039;&#039;chmod +x bonjour_monde&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;[user@becane user]$ &#039;&#039;&#039;./bonjour_monde&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;Bonjour, Monde !&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;un premier script est né.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;[user@becane user]$ _&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Résumons&amp;lt;/u&amp;gt; : un script shell commence par : &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, il contient des commandes du shell et est rendu exécutable par &amp;lt;tt&amp;gt;chmod +x&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Quelques conseils concernant les commentaires ===&lt;br /&gt;
&lt;br /&gt;
Dans un shell-script, est considéré comme un commentaire tout ce qui suit le caractère # et ce, jusqu&#039;à la fin de la ligne. &amp;lt;br /&amp;gt;Usez et abusez des commentaires : lorsque vous relirez un script 6 mois après l&#039;avoir écrit, vous serez bien content de l&#039;avoir documenté. Un programme n&#039;est jamais trop documenté. Par contre, il peut être mal documenté ! Un commentaire est bon lorsqu&#039;il décrit pourquoi on fait quelque chose, pas quand il décrit ce que l&#039;on fait. Exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# pour i parcourant tous les fichiers,&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;for i in * ; do&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# copier le fichier vers .bak&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; cp $i $i.bak&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# fin pour&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;done&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que fait le script ? Les commentaires ne l&#039;expliquent pas ! Ce sont de mauvais commentaire. Par contre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# on veut faire un copie de tous les fichiers&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;for i in * ; do&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# sous le nom *.bak&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; cp $i $i.bak&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;done&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Là, au moins, on sait ce qu&#039;il se passe. (Il n&#039;est pas encore important de connaître les commandes de ces deux fichiers.)&lt;br /&gt;
&lt;br /&gt;
=== Le passage de paramètres ===&lt;br /&gt;
&lt;br /&gt;
Un script ne sera, en général, que d&#039;une utilisation marginale si vous ne pouvez pas modifier son comportement d&#039;une manière ou d&#039;une autre. On obtient cet effet en &amp;quot;passant&amp;quot; un (ou plusieurs) paramètre(s) au script via la ligne de commande. Voyons comment faire cela. Soit le script &amp;lt;tt&amp;gt;essai01&amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;: &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre \$1 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre \$2 est \&amp;quot;$2\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre \$3 est \&amp;quot;$3\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que fait-il ? Il affiche, les uns après les autres les trois premiers paramètres du script, donc si l&#039;on tappe :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;$ &#039;&#039;&#039;./essai01 paramètre un&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre $1 est &amp;quot;paramètre&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre $2 est &amp;quot;un&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre $3 est &amp;quot;&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$ _&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donc, les variables &amp;lt;tt&amp;gt;$1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;$2&amp;lt;/tt&amp;gt; ... &amp;lt;tt&amp;gt;$9&amp;lt;/tt&amp;gt; contiennent les &amp;quot;mots&amp;quot; numéro 1, 2 ... 9 de la ligne de commande. Attention : par &amp;quot;mot&amp;quot; on entend ensemble de caractères ne contenant pas de caractères de séparations. Les caractères de séparation sont l&#039;espace, la tabulation, le point virgule.&lt;br /&gt;
&lt;br /&gt;
Vous avez sans doute remarqué que j&#039;ai utilisé les caractères : &amp;lt;tt&amp;gt;\$&amp;lt;/tt&amp;gt; à la place de &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; ainsi que &amp;lt;tt&amp;gt;\&amp;quot;&amp;lt;/tt&amp;gt; à la place de &amp;lt;tt&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt; dans le script. Pour quelle raison ? La raison est simple, si l&#039;on tape : &amp;lt;tt&amp;gt;echo &amp;quot;essai&amp;quot;&amp;lt;/tt&amp;gt; on obtient : &amp;lt;tt&amp;gt;essai&amp;lt;/tt&amp;gt;, si l&#039;on veut obtenir &amp;lt;tt&amp;gt;&amp;quot;essai&amp;quot;&amp;lt;/tt&amp;gt; il faut dire à &amp;lt;tt&amp;gt;echo&amp;lt;/tt&amp;gt; que le caractère &amp;lt;tt&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt; n&#039;indique pas le début d&#039;une chaîne de caractère (comme c&#039;est le comportement par défaut) mais que ce caractère fait partie de la chaîne : on dit que l&#039;on &amp;quot;échappe&amp;quot; ou &amp;quot;protège&amp;quot; le caractère &amp;lt;tt&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt; en tapant &amp;lt;tt&amp;gt;\&amp;quot;&amp;lt;/tt&amp;gt;. En &amp;quot;échappant&amp;quot; le caractère &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt; (par &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;) on obtient le caractère &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt; sans signification particulière. On peut dire que le caractère &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt; devant un autre lui fait perdre sa signification particulière s&#039;il en a une, ne fait rien si le caractère qui suit &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt; n&#039;en a pas.&lt;br /&gt;
&lt;br /&gt;
Maintenant, essayons de taper :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;$ &#039;&#039;&#039;./essai01 *&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre $1 est &amp;quot;Mail&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre $2 est &amp;quot;essai01&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre $3 est &amp;quot;nsmail&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$ _&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Le résultat doit être sensiblement différent sur votre machine). Que s&#039;est-il passé ? Le shell a remplacé le caractère * par la liste de tous les fichiers non cachés présents dans le répertoire actif. En fait, toutes les substitutions du shell sont possibles ! C&#039;est le shell qui &amp;quot;substitue&amp;quot; aux paramètres des valeurs étendues par les caractères spéciaux : * (toute suite de caractères) ? (un caractère grave quelconque), [dze] (l&#039;un des caractères d, z ou e), [d-z] (les caractères de &#039;d&#039; à &#039;z&#039;)... Autre exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;$ &#039;&#039;&#039;./essai01 \*&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre $1 est &amp;quot;*&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre $2 est &amp;quot;&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre $3 est &amp;quot;&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$ _&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hé oui, on a &amp;quot;échappé&amp;quot; le caractère &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; donc il a perdu sa signification particulière : il est redevenu un simple &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C&#039;est bien, me direz vous, mais si je veux utiliser plus de dix paramètres ? Il faut utiliser la commande shift ; à titre d&#039;exemple voici le script &amp;lt;tt&amp;gt;essai02&amp;lt;/tt&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 1 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 2 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 2 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 4 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 5 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 6 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 7 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 8 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 9 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 10 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo le paramètre 11 est \&amp;quot;$1\&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous tapez :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;$ &#039;&#039;&#039;./essai02 1 2 3 4 5 6 7 8 9 10 11 12 13&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 1 est &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 2 est &amp;quot;2&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 2 est &amp;quot;3&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 4 est &amp;quot;4&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 5 est &amp;quot;5&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 6 est &amp;quot;6&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 7 est &amp;quot;7&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 8 est &amp;quot;8&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 9 est &amp;quot;9&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 10 est &amp;quot;10&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;le paramètre 11 est &amp;quot;11&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$ _&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A chaque appel de &amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt; les paramètres sont décalés d&#039;un numéro : le paramètre 2 devient le paramètre 1, 3 devient 2, etc... Évidemment le paramètre 1 est perdu par l&#039;appel de shift : vous devez donc vous en servir avant d&#039;appeler &amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt; (ou le sauvegarder dans une variable).&lt;br /&gt;
&lt;br /&gt;
=== Les variables ===&lt;br /&gt;
&lt;br /&gt;
Le passage des paramètres nous a montré l&#039;utilisation de &amp;quot;noms&amp;quot; particuliers : &amp;lt;tt&amp;gt;$1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;$2&amp;lt;/tt&amp;gt; etc. Ce sont les substitutions des variables &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt;, etc. par leur valeurs. Mais vous pouvez définir et utiliser n&#039;importe quel nom. Attention toutefois à ne pas confondre le nom d&#039;une variable (notée par exemple &amp;lt;tt&amp;gt;machin&amp;lt;/tt&amp;gt;) et son contenu (noté dans cas &amp;lt;tt&amp;gt;$machin&amp;lt;/tt&amp;gt;). Vous connaissez peut-être la variable &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; (attention, le shell différencie les majuscules des minuscules) qui contient la liste des répertoires (séparés par des &amp;lt;tt&amp;gt;&amp;quot;:&amp;quot;&amp;lt;/tt&amp;gt;) dans lesquels il doit rechercher les programmes. Si dans un script vous tapez :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;1:#!/bin/sh&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;2:PATH=/bin # PATH contient /bin&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;3:PATH=PATH:/usr/bin # PATH contient PATH:/usr/bin&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;4:PATH=/bin # PATH contient /bin&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;5:PATH=$PATH:/usr/bin # PATH contient /bin:/usr/bin&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Les numéros ne sont là que pour repérer les lignes, il ne faut pas les taper) &amp;lt;br /&amp;gt;La ligne 3 est très certainement une erreur, à gauche du signe &amp;lt;tt&amp;gt;&amp;quot;=&amp;quot;&amp;lt;/tt&amp;gt; il faut une variable (donc un nom sans &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;) mais à droite de ce même signe il faut une valeur, et la valeur que l&#039;on a mis est &amp;lt;tt&amp;gt;&amp;quot;PATH:/usr/bin&amp;quot;&amp;lt;/tt&amp;gt; : il n&#039;y a aucune substitution à faire. &amp;lt;br /&amp;gt;Par contre la ligne 5 est certainement correcte : à droite du &amp;lt;tt&amp;gt;&amp;quot;=&amp;quot;&amp;lt;/tt&amp;gt; on a mis &amp;lt;tt&amp;gt;&amp;quot;$PATH:/usr/bin&amp;quot;&amp;lt;/tt&amp;gt;, la valeur de &amp;lt;tt&amp;gt;$PATH&amp;lt;/tt&amp;gt; étant &amp;lt;tt&amp;gt;&amp;quot;/bin&amp;quot;&amp;lt;/tt&amp;gt;, la valeur après substitution par le shell de &amp;lt;tt&amp;gt;&amp;quot;$PATH:/usr/bin&amp;quot;&amp;lt;/tt&amp;gt; est &amp;lt;tt&amp;gt;&amp;quot;/bin:/usr/bin&amp;quot;&amp;lt;/tt&amp;gt;. Donc, à la fin de la ligne 5, la valeur de la variable &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; est &amp;lt;tt&amp;gt;&amp;quot;/bin:/usr/bin&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Attention : il ne doit y avoir aucun espace de part et d&#039;autre du signe &amp;lt;tt&amp;gt;&amp;quot;=&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Résumons&amp;lt;/u&amp;gt; : &amp;lt;tt&amp;gt;MACHIN&amp;lt;/tt&amp;gt; est un nom de variable que l&#039;on utilise lorsque l&#039;on a besoin d&#039;un nom de variable (mais pas de son contenu), et &amp;lt;tt&amp;gt;$MACHIN&amp;lt;/tt&amp;gt; est le contenu de la variable &amp;lt;tt&amp;gt;MACHIN&amp;lt;/tt&amp;gt; que l&#039;on utilise lorsque l&#039;on a besoin du contenu de cette variable.&lt;br /&gt;
&lt;br /&gt;
=== Variables particulières ===&lt;br /&gt;
&lt;br /&gt;
Il y a un certain nombre de variables particulières, en voici quelques unes :&lt;br /&gt;
&lt;br /&gt;
* la variable &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; (dont le contenu est &amp;lt;tt&amp;gt;$*&amp;lt;/tt&amp;gt;) contient l&#039;ensemble de tous les &amp;quot;mots&amp;quot; qui on été passé au script (c&#039;est à dire toute la ligne de commande, sans le nom du script).&lt;br /&gt;
* la variable &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; contient le nombre de paramètres (&amp;lt;tt&amp;gt;$#&amp;lt;/tt&amp;gt;) qui ont été passés au programme.&lt;br /&gt;
* la variable &amp;lt;tt&amp;gt;&amp;lt;/tt&amp;gt; (zéro) contient le nom du script (ou du lien si le script a été appelé depuis un lien).&lt;br /&gt;
&lt;br /&gt;
Il y en a d&#039;autres, moins utilisées : allez voir la man page de &amp;lt;tt&amp;gt;bash&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Saisir la valeur d&#039;une variable ===&lt;br /&gt;
&lt;br /&gt;
Les paramètres permettent à l&#039;utilisateur d&#039;agir sur le déroulement du script avant son exécution. Mais il est aussi souvent intéressant de pouvoir agir sur le déroulement du script lors de son exécution, c&#039;est ce que permet la commande : &amp;lt;tt&amp;gt;read nom_variable&amp;lt;/tt&amp;gt;. Dans cette commande vous pouvez bien sûr remplacer nom_variable par le nom de variable qui vous convient le mieux. Voici un exemple simple.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo -n &amp;quot;Entrez votre prénom : &amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;read prenom&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo -n &amp;quot;Entrez votre nom de login : &amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;read nomlogin&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo &amp;quot;Le nom de login de $prenom est $nomlogin.&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce script se déroule ainsi :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;./essai02bis&amp;lt;br /&amp;gt; &#039;&#039;&#039;Entrez votre prénom : &#039;&#039;&#039;Marc&amp;lt;br /&amp;gt; &#039;&#039;&#039;Entrez votre nom de login : &#039;&#039;&#039;spoutnik&amp;lt;br /&amp;gt; &#039;&#039;&#039;Le nom de login de Marc est spoutnik.&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lors du déroulement du script vous devez valider vos entrées en appuyant sur la touche &amp;quot;Entrée&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Arithmétique ===&lt;br /&gt;
&lt;br /&gt;
Vous vous doutez bien qu&#039;il est possible de faire des calculs avec le shell. En fait, le shell ne &amp;quot;sait&amp;quot; faire que des calculs sur les nombres entiers (ceux qui n&#039;ont pas de virgules ;-). Pour faire un calcul il faut encadrer celui-ci de : &amp;lt;tt&amp;gt;$(( un calcul ))&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;$[ un calcul ]&amp;lt;/tt&amp;gt;. Exemple, le script essai03 :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo 2+3*5 = $((2+3*5))&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;MACHIN=12&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;echo MACHIN*4 = $[$MACHIN*4]&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Affichera :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;$ &#039;&#039;&#039;sh essai03&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;2+3*5 = 17&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;MACHIN*4 = 48&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez que le shell respecte les priorités mathématiques habituelles (il fait les multiplications avant les additions !). L&#039;opérateur puissance est &amp;lt;tt&amp;gt;&amp;quot;**&amp;quot;&amp;lt;/tt&amp;gt; (ie : 2 puissance 5 s&#039;écrit : &amp;lt;tt&amp;gt;2**5&amp;lt;/tt&amp;gt;). On peut utiliser des parenthèses pour modifier l&#039;ordre des calculs. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Les instructions de contrôle de scripts ==&lt;br /&gt;
&lt;br /&gt;
Les instructions de contrôle du shell permettent de modifier l&#039;exécution purement séquencielle d&#039;un script. Jusqu&#039;à maintenant, les scripts que nous avons créés n&#039;étaient pas très complexes. Ils ne pouvaient de toute façon pas l&#039;être car nous ne pouvions pas modifier l&#039;ordre des instructions, ni en répéter.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;exécution conditionnelle ===&lt;br /&gt;
&lt;br /&gt;
Lorsque vous programmerez des scripts, vous voudrez que vos scripts fassent une chose si une certaine condition est remplie et autre chose si elle ne l&#039;est pas. La construction de bash qui permet cela est le fameux test : &amp;lt;tt&amp;gt;if then else fi&amp;lt;/tt&amp;gt;. Sa syntaxe est la suivante (la partie &amp;lt;tt&amp;gt;else...&amp;lt;/tt&amp;gt; en italique est optionnelle) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;if&#039;&#039;&#039; &amp;lt;test&amp;gt; ; &#039;&#039;&#039;then&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; &amp;lt;instruction 1&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; &amp;lt;instruction 2&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; ...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; &amp;lt;instruction n&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;tt&amp;gt; &amp;lt;instruction n+1&amp;gt;&amp;lt;/tt&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;tt&amp;gt; ...&amp;lt;/tt&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&amp;lt;tt&amp;gt; &amp;lt;instruction n+p&amp;gt;&amp;lt;/tt&amp;gt;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;&#039;&amp;lt;tt&amp;gt;fi&amp;lt;/tt&amp;gt;&#039;&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut savoir que tous les programmes renvoient une valeur. Cette valeur est stockée dans la variable &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; dont la valeur est, rappelons le : &amp;quot;&amp;lt;tt&amp;gt;$?&amp;lt;/tt&amp;gt;&amp;quot;. &amp;lt;br /&amp;gt;Pour le shell une valeur nulle est synonyme de VRAI et une valeur non nulle est synonyme de FAUX (ceci parce que, en général les programmes renvoie zéro quand tout c&#039;est bien passé et un code d&#039;erreur (numéro non nul) quand il s&#039;en est produit une).&lt;br /&gt;
&lt;br /&gt;
Il existe deux programmes particuliers : &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; renvoie toujours 0 et &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; renvoie toujours 1. Sachant cela, voyons ce que fait le programme suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if true ; then&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo Le premier test est VRAI($?)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo Le premier test est FAUX($?)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;fi&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;if false ; then&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo Le second test est VRAI($?)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo Le second test est FAUX($?)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;fi&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Affichera :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;$ ./test&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;Le premier test est VRAI(0)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;Le second test est FAUX(1)&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$ _&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut donc conclure que l&#039;instruction &amp;lt;tt&amp;gt;if ... then ... else ... fi&amp;lt;/tt&amp;gt;, fonctionne de la manière suivante : si (&#039;&#039;&#039;if&#039;&#039;&#039; en anglais) le test est VRAI(0) alors (&#039;&#039;&#039;then&#039;&#039;&#039; en anglais) le bloc d&#039;instructions compris entre le &amp;lt;tt&amp;gt;then&amp;lt;/tt&amp;gt; et le &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; (ou le &amp;lt;tt&amp;gt;fi&amp;lt;/tt&amp;gt; en l&#039;absence de &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;) est exécuté, sinon (&#039;&#039;&#039;else&#039;&#039;&#039; en anglais) le test est FAUX(différent de 0)) et on exécute le bloc d&#039;instructions compris entre le &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; et le &amp;lt;tt&amp;gt;fi&amp;lt;/tt&amp;gt; si ce bloc existe.&lt;br /&gt;
&lt;br /&gt;
Bon, évidemment, des tests de cet ordre ne paraissent pas très utiles. Voyons maintenant de vrais tests.&lt;br /&gt;
&lt;br /&gt;
=== Les tests ===&lt;br /&gt;
&lt;br /&gt;
Un test, nous l&#039;avons vu, n&#039;est rien de plus qu&#039;une commande standard. Une des commandes standard est &#039;&amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;&#039;, sa syntaxe est un peu complexe, je vais la décrire avec des exemples.&lt;br /&gt;
&lt;br /&gt;
* si l&#039;on veut tester l&#039;existence d&#039;un répertoire &amp;lt;tt&amp;gt;&amp;lt;machin&amp;gt;&amp;lt;/tt&amp;gt;, on tapera : &amp;lt;tt&amp;gt;test -d &amp;lt;machin&amp;gt;&amp;lt;/tt&amp;gt; (&#039;d&#039; comme &#039;&#039;&#039;&#039;&#039;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;d&amp;lt;/font&amp;gt;&#039;&#039;&#039;irectory&#039;&#039;)&lt;br /&gt;
* si l&#039;on veut tester l&#039;existence d&#039;un fichier &amp;lt;tt&amp;gt;&amp;lt;machin&amp;gt;&amp;lt;/tt&amp;gt;, on tapera : &amp;lt;tt&amp;gt;test -f &amp;lt;machin&amp;gt;&amp;lt;/tt&amp;gt; (&#039;f&#039; comme &#039;&#039;&#039;&#039;&#039;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;f&amp;lt;/font&amp;gt;&#039;&#039;&#039;ile&#039;&#039;)&lt;br /&gt;
* si l&#039;on veut tester l&#039;existence d&#039;un fichier ou répertoire &amp;lt;tt&amp;gt;&amp;lt;machin&amp;gt;&amp;lt;/tt&amp;gt;, on tapera : &amp;lt;tt&amp;gt;test -e &amp;lt;machin&amp;gt;&amp;lt;/tt&amp;gt; (&#039;e&#039; comme &#039;&#039;&#039;&#039;&#039;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;e&amp;lt;/font&amp;gt;&#039;&#039;&#039;xist&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information faites : &amp;lt;tt&amp;gt;man test&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On peut aussi combiner deux tests par des opérations logiques : &#039;ou&#039; correspond à &amp;lt;tt&amp;gt;-o&amp;lt;/tt&amp;gt; (&#039;o&#039; comme &#039;&#039;&#039;&#039;&#039;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;o&amp;lt;/font&amp;gt;&#039;&#039;&#039;r&#039;&#039;), &#039;et&#039; correspond à &amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; (&#039;a&#039; comme &#039;&#039;&#039;&#039;&#039;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;a&amp;lt;/font&amp;gt;&#039;&#039;&#039;nd&#039;&#039;) (à nouveau allez voir la man page), exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;test -x /bin/sh -a -d /etc&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette instruction teste l&#039;existence de l&#039;éxécutable &amp;lt;tt&amp;gt;/bin/sh&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;-x /bin/sh&amp;lt;/tt&amp;gt;) et (&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt;) la présence d&#039;un répertoire &amp;lt;tt&amp;gt;/etc&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;-d /etc&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
On peut remplacer la commande &amp;lt;tt&amp;gt;test &amp;lt;un test&amp;gt;&amp;lt;/tt&amp;gt; par &amp;lt;tt&amp;gt;[ &amp;lt;un test&amp;gt; ]&amp;lt;/tt&amp;gt; qui est plus lisible, exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;if [ -x /bin/sh ] ; then&amp;lt;/tt&amp;gt; # (&#039;x&#039; comme &#039;&#039;e&#039;&#039;&#039;&amp;lt;font size=&amp;quot;+1&amp;quot;&amp;gt;x&amp;lt;/font&amp;gt;&#039;&#039;&#039;ecutable&#039;&#039;) &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo /bin/sh est exécutable. C\&#039;est bien.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo /bin/sh n\&#039;est pas exécutable.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo Votre système n\&#039;est pas normal.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;fi&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Toujours avec les crochets de &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;, si vous n&#039;avez qu&#039;une seule chose à faire en fonction du résultat d&#039;un test, alors vous pouvez utiliser la syntaxe suivante :&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;[ -x /bin/sh ] &amp;amp;&amp;amp; echo /bin/sh est exécutable.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; ou encore :&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;[ -x /bin/sh ] || echo /bin/sh n\&#039;est pas exécutable.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;affichage du message est effectué, dans le premier cas que si le test est vrai et dans le second cas, que si le test est faux. Dans l&#039;exemple on teste si /bin/sh est un fichier exécutable.&amp;lt;br /&amp;gt; Cela allége le script sans pour autant le rendre illisible, si cette syntaxe est utilisée à bon essient.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;Mais il n&#039;y a pas que la commande &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; qui peut être employée. Par exemple, la commande &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt; renvoie 0 quand la recherche a réussi et 1 quand la recherche a échoué. &amp;lt;br /&amp;gt;Par exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;if grep -E &amp;quot;^frederic:&amp;quot; /etc/passwd &amp;gt; /dev/null ; then&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo L\&#039;utilisateur frederic existe.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo L&#039;utilisateur frederic n\&#039;existe pas.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;fi&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette série d&#039;instruction teste la présence de l&#039;utilisateur &amp;lt;tt&amp;gt;frederic&amp;lt;/tt&amp;gt; dans le fichier &amp;lt;tt&amp;gt;/etc/passwd&amp;lt;/tt&amp;gt;. Vous remarquerez que l&#039;on a fait suivre la commande &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt; d&#039;une redirection vers &amp;lt;tt&amp;gt;/dev/null&amp;lt;/tt&amp;gt; pour que le résultat de cette commande ne soit pas affiché : c&#039;est une utilisation classique. Ceci explique aussi l&#039;expression : &amp;quot;Ils sont tellement intéressants, tes mails, que je les envoie vers /dev/null&amp;quot; ;-).&lt;br /&gt;
&lt;br /&gt;
=== Faire quelque chose de différent suivant la valeur d&#039;une variable ===&lt;br /&gt;
&lt;br /&gt;
L&#039;instruction &amp;lt;tt&amp;gt;case ... esac&amp;lt;/tt&amp;gt; permet de modifier le déroulement du script selon la valeur d&#039;un paramètre ou d&#039;une variable. On l&#039;utilise le plus souvent quand les valeurs possibles sont en nombre restreint et peuvent être prévues. Les imprévus peuvent alors être représentés par le signe *. Demandons par exemple à l&#039;utilisateur s&#039;il souhaite afficher ou non les fichiers cachés du répertoire en cours.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt; # pose la question et récupère la réponse&amp;lt;br /&amp;gt; echo &amp;quot;Le contenu du répertoire courant va être affiché.&amp;quot;&amp;lt;br /&amp;gt; echo -n &amp;quot;Souhaitez-vous afficher aussi les fichiers cachés (oui/non) : &amp;quot;&amp;lt;br /&amp;gt; read reponse&amp;lt;br /&amp;gt; # agit selon la réponse&amp;lt;br /&amp;gt; case $reponse in&amp;lt;br /&amp;gt; oui)&amp;lt;br /&amp;gt; clear&amp;lt;br /&amp;gt; ls -a;;&amp;lt;br /&amp;gt; non)&amp;lt;br /&amp;gt; ls;;&amp;lt;br /&amp;gt; *)&amp;lt;br /&amp;gt; echo &amp;quot;Erreur, vous deviez répondre par oui ou par non.&amp;quot;;;&amp;lt;br /&amp;gt; esac&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seules les réponses &amp;quot;oui&amp;quot; et &amp;quot;non&amp;quot; sont réellement attendues dans ce script, toute autre réponse engendrera le message d&#039;erreur. On notera qu&#039;ici l&#039;écran est effacé avant l&#039;affichage dans le cas d&#039;une réponse positive, mais pas dans celui d&#039;une réponse négative. Lorsque vous utilisez l&#039;instruction &amp;lt;tt&amp;gt;case ... esac&amp;lt;/tt&amp;gt;, faites bien attention de ne pas oublier les doubles points-virgules terminant les instructions de chacun des cas envisagés.&lt;br /&gt;
&lt;br /&gt;
=== Faire la même chose pour tous les éléments d&#039;une liste ===&lt;br /&gt;
&lt;br /&gt;
Lorsqu&#039;on programme, on est souvent amené à faire la même chose &#039;&#039;&#039;pour tous&#039;&#039;&#039; les élément d&#039;une liste. Dans un shell script, il est bien évidemment possible de ne pas réécrire dix fois la même chose. On dira que l&#039;on fait une boucle. L&#039;instruction qui réalise une boucle est&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;for &amp;lt;variable&amp;gt; in &amp;lt;liste de valeurs pour la variable&amp;gt; ; do&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; &amp;lt;instruction 1&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; ...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; &amp;lt;instruction n&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;done&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voyons comment ça fonctionne. Supposons que nous souhaitions renommer tous nos fichiers *.tar.gz en *.tar.gz.old, nous taperons le script suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# I prend chacune des valeurs possibles correspondant&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# au motif : *.tar.gz&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;for I in *.tar.gz ; do&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; # tous les fichiers $I sont renommés $I.old&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo &amp;quot;$I -&amp;gt; $I.old&amp;quot;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; mv $I $I.old&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# on finit notre boucle&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;done&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simple, non ? Un exemple plus complexe ? Supposons que nous voulions parcourir tous les sous-répertoires du répertoire courant pour faire cette même manipulation. Nous pourrons taper :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt; 1:#!/bin/sh&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 2:for REP in `find -type d` ; do&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 3: for FICH in $REP/*.tar.gz ; do&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 4: if [ -f $FICH ] ; then&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 5: mv $FICH $FICH.old&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 6: else&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 7: echo On ne renomme pas $FICH car ce n\&#039;est pas un répertoire&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 8: fi&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 9: done&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;10:done&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Explications&amp;lt;/u&amp;gt; : dans le premier &#039;for&#039;, on a précisé comme liste : &amp;lt;tt&amp;gt;`find -type d`&amp;lt;/tt&amp;gt; (attention au sens des apostrophes, sur un clavier azerty français, on obtient ce symbole en appuyant sur &amp;lt;tt&amp;gt;ALTGR+é&amp;lt;/tt&amp;gt;, ce ne sont pas des simples quotes &#039;). &amp;lt;br /&amp;gt;Lorsque l&#039;on tape une commande entre apostrophes inverses, le shell exécute d&#039;abord cette commande, et remplace l&#039;expression entre apostrophes inverses par la sortie standard de cette commande (ce qu&#039;elle affiche à l&#039;écran). &amp;lt;br /&amp;gt;Donc, dans le cas qui nous intéresse, la liste est le résultat de la commande &amp;lt;tt&amp;gt;find -type d&amp;lt;/tt&amp;gt;, c&#039;est à dire la liste de tous les sous-répertoires du répertoire courant. &amp;lt;br /&amp;gt;Ainsi, en ligne 2, on fait prendre à la variable REP le nom de chacun des sous-répertoires du répertoire courant, puis (en ligne 3) on fait prendre à la variable FICH le nom de chacun des fichiers .tar.gz de $REP (un des sous-répertoires), puis si $FICH est un fichier, on le renomme, sinon on affiche un avertissement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Remarque&amp;lt;/u&amp;gt; : ce n&#039;est pas le même fonctionnement que la boucle &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; d&#039;autres langage (le pascal, le C ou le basic par exemple).&lt;br /&gt;
&lt;br /&gt;
=== Faire une même chose tant qu&#039;un certaine condition est remplie ===&lt;br /&gt;
&lt;br /&gt;
Pour faire une certaine chose &#039;&#039;&#039;tant qu&#039;&#039;&#039;&#039;une condition est remplie, on utilise un autre type de boucle :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;while &amp;lt;un test&amp;gt; ; do&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; &amp;lt;instruction 1&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; ...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; &amp;lt;instruction n&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;done&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supposons, par exemple que vous souhaitiez afficher les 100 premiers nombres (pour une obscure raison), alors vous taperez :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;i=0&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;while [ $i -lt 100 ] ; do&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; echo $i&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; i=$[$i+1]&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;done&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Remarque&amp;lt;/u&amp;gt; : &amp;lt;tt&amp;gt;-lt&amp;lt;/tt&amp;gt; signifie &amp;quot;&#039;&#039;&#039;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;l&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&#039;&#039;&#039;esser &#039;&#039;&#039;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;t&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&#039;&#039;&#039;han&amp;quot; ou &amp;quot;plus petit que&amp;quot; (et &amp;lt;tt&amp;gt;-gt&amp;lt;/tt&amp;gt; signifie &amp;quot;plus grand&amp;quot;, ou &amp;quot;&#039;&#039;&#039;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;g&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&#039;&#039;&#039;reater &#039;&#039;&#039;&amp;lt;tt&amp;gt;&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;t&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&#039;&#039;&#039;han&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Ici, on va afficher le contenu de &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; et lui ajouter 1 tant que &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; sera (&amp;lt;tt&amp;gt;-lt&amp;lt;/tt&amp;gt;) plus petit que 100. Remarquez que 100 ne s&#039;affiche pas, car &amp;lt;tt&amp;gt;-lt&amp;lt;/tt&amp;gt; est &amp;quot;plus petit&amp;quot;, mais pas &amp;quot;plus petit ou égal&amp;quot; (dans ce cas, utilisez &amp;lt;tt&amp;gt;-le&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;-ge&amp;lt;/tt&amp;gt; pour &amp;quot;plus grand ou égal&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Refaire à un autre endroit la même chose ===&lt;br /&gt;
&lt;br /&gt;
Souvent, vous voudrez refaire ce que vous venez de taper autre part dans votre script. Dans ce cas il est inutile de retaper la même chose, préférez utiliser l&#039;instruction &amp;lt;tt&amp;gt;function&amp;lt;/tt&amp;gt; qui permet de réutiliser une portion de script (on dit : une &amp;quot;&#039;&#039;&#039;fonction&#039;&#039;&#039;&amp;quot;). Voyons un exemple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/bin/sh&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;function addpath ()&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; if echo $PATH | grep -v $1 &amp;gt;/dev/null; then&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; PATH=$PATH:$1;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; fi;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; PATH=`echo $PATH|sed s/::/:/g`&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;addpath /opt/apps/bin&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;addpath /opt/office52/program&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;addpath /opt/gnome/bin&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Au début, nous avons défini une fonction nommée &amp;lt;tt&amp;gt;addpath&amp;lt;/tt&amp;gt; dont le but est d&#039;ajouter le premier argument (&amp;lt;tt&amp;gt;$1&amp;lt;/tt&amp;gt;) de la fonction &amp;lt;tt&amp;gt;addpath&amp;lt;/tt&amp;gt; à la varaible &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; si ce premier argument n&#039;est pas déjà présent (&amp;lt;tt&amp;gt;grep -v $1&amp;lt;/tt&amp;gt;) dans la variable &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, ainsi que supprimer les chemins vides (&amp;lt;tt&amp;gt;sed s/::/:/g&amp;lt;/tt&amp;gt;) de PATH. &amp;lt;br /&amp;gt;Ensuite, nous exécutons cette fonction pour trois arguments : /opt/apps/bin, /opt/office52/bin et /opt/gnome/bin.&lt;br /&gt;
&lt;br /&gt;
En fait, une fonction est seulement un script écrit à l&#039;intérieur d&#039;un script. Les fonctions permettent surtout de ne pas multiplier les petits scripts, ainsi que de partager des variables sans se préoccuper de la clause &amp;lt;tt&amp;gt;export&amp;lt;/tt&amp;gt; mais cela constitue une utilisation avancée du shell, nous n&#039;irons pas plus loin dans cet article.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Remarque&amp;lt;/u&amp;gt; : le mot &amp;lt;tt&amp;gt;function&amp;lt;/tt&amp;gt; peut être omis, mais son utilisation facilite la lecture du script.&lt;br /&gt;
&lt;br /&gt;
=== Autres types de répétitions. ===&lt;br /&gt;
&lt;br /&gt;
Il existe d&#039;autres types de répétitions, mais nous ne nous en occuperons pas dans cet article, je vous conseille la lecture, forcément profitable, de la &amp;quot;man page&amp;quot; de bash (&amp;lt;tt&amp;gt;man bash&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
À vous de jouer !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;merci&amp;quot;&amp;gt;Cette page est issue de la documentation &#039;pré-wiki&#039; de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Frédéric Bonnaud le 29/08/2000.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 29/08/2000, Frédéric Bonnaud&lt;br /&gt;
{{CC-BY-NC-SA}}&lt;/div&gt;</summary>
		<author><name>Sleg</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Bac_%C3%A0_sable&amp;diff=7863</id>
		<title>Bac à sable</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Bac_%C3%A0_sable&amp;diff=7863"/>
		<updated>2005-10-13T20:51:24Z</updated>

		<summary type="html">&lt;p&gt;Sleg : /* essai d&amp;#039;ajout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Information =&lt;br /&gt;
Cette page est le bac à sable de Léa : utilisez le pour faire vos expérimentations. N&#039;hésitez pas à y faire n&#039;importe quoi.&lt;br /&gt;
&lt;br /&gt;
== essai d&#039;ajout ==&lt;br /&gt;
&lt;br /&gt;
un ajout via &amp;quot;action=edit/section=new/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Je suis pas d&#039;accord !&#039;&#039;&#039;&lt;br /&gt;
PS : C&#039;est un essai ;)&lt;br /&gt;
--[[Utilisateur:Sleg|Sleg]] 13 oct 2005 à 22:51 (CEST)&#039;&lt;/div&gt;</summary>
		<author><name>Sleg</name></author>
	</entry>
</feed>