<h2>
	But de ce document</h2>
<p class="spip">
	Ce document me sert de m&eacute;mo sur la programmation en Shell Bash. Il liste sans entrer dans le d&eacute;tail les principales possibilit&eacute;s en programmation Bash.</p>
<h2>
	Premier script</h2>
<p class="spip">
	Avec votre &eacute;diteur de texte pr&eacute;f&eacute;r&eacute;, saisir ces deux lignes dans le fichier &laquo;&nbsp;<strong class="spip">test.sh</strong>&nbsp;&raquo;&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>#! /bin/bash<br />
	echo &quot;Bonjour le monde&quot;</code></div>
<p class="spip">
	<strong class="spip">Remarques</strong>&nbsp;:<br />
	<img alt="-" src="" />&nbsp;L&rsquo;extension du fichier (.sh en l&rsquo;occurrence) n&rsquo;a pas d&rsquo;importance. Il est m&ecirc;me possible de ne pas en mettre.<br />
	<img alt="-" src="" />&nbsp;La premi&egrave;re ligne est obligatoire car elle permet d&rsquo;indiquer au shel qui va ex&eacute;cuter le script qu&rsquo;il doit utiliser le Bash.</p>
<p class="spip">
	Pour faire fonctionner ce script, il faut commencer par le rendre ex&eacute;cutable&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ chmod +x test.sh</code></p>
<p class="spip">
	Et nous pouvons le tester&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ ./test.sh<br />
	Bonjour le monde</code></div>
<h2>
	Les variables</h2>
<h3>
	Affecter une valeur &agrave; une variable</h3>
<p class="spip">
	<code class="spip_code" dir="ltr">x=toto</code></p>
<p class="spip">
	ou en utilisant des guillemets pour prot&eacute;ger les espaces et les caract&egrave;res sp&eacute;ciaux&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">x=&quot;toto et tutu&quot;</code></p>
<p class="spip">
	<strong class="spip">Remarque</strong>&nbsp;: Il ne faut pas mettre d&rsquo;espace de chaque cot&eacute; du signe &eacute;gale</p>
<p class="spip">
	Cette commande permet d&rsquo;initialiser la variable avec la valeur indiqu&eacute;e seulement si celle-ci est vide&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">x=${x:-valeur par d&eacute;faut}</code></p>
<h3>
	R&eacute;cup&eacute;rer le r&eacute;sultat d&rsquo;une commande</h3>
<p class="spip">
	<code class="spip_code" dir="ltr">x=$(ls /etc)</code></p>
<p class="spip">
	ou&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">x=`ls /etc`</code></p>
<h3>
	Afficher le contenu d&rsquo;une variable</h3>
<p class="spip">
	<code class="spip_code" dir="ltr">echo $x</code></p>
<p class="spip">
	ou&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">echo ${x}</code></p>
<h2>
	Les tableaux</h2>
<p class="spip">
	Affecter une valeur &agrave; un tableau&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ tab[0]=toto</code></p>
<p class="spip">
	Lire le contenu du tableau</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ echo ${tab[0]}</code></p>
<p class="spip">
	<strong class="spip">Remarque</strong>&nbsp;: Dans ce cas, il est obligatoire d&rsquo;utiliser les accolades pour lire le contenu</p>
<h2>
	Protection des expressions</h2>
<p class="spip">
	Le &laquo;&nbsp;<strong class="spip"> backslash </strong>&nbsp;&raquo; permet de prot&eacute;ger tous les caract&egrave;res sp&eacute;ciaux y compris lui m&ecirc;me&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>echo \* \# \$ \&#39; \&quot; \\<br />
	* # $ &#39; &quot; \</code></div>
<p class="spip">
	Le &laquo;&nbsp;<strong class="spip">guillemet double</strong>&nbsp;&raquo; permet de prot&eacute;ger tous les caract&egrave;res sauf lui m&ecirc;me qu&rsquo;il faut prot&eacute;ger avec un &laquo;&nbsp;<strong class="spip"> backslash </strong>&nbsp;&raquo; et le &laquo;&nbsp;$&nbsp;&raquo; ce qui permet d&rsquo;interpr&eacute;ter le contenu des variables&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ echo &quot;* # $ \ &#39; \&quot; x=$x&quot;<br />
	* # $ \ &#39; &quot; x=toto</code></div>
<p class="spip">
	L&rsquo;apostrophe permet de prot&eacute;ger tous les caract&egrave;res sauf elle m&ecirc;me&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ echo &#39;* # $ \ &quot; x=$x&#39;<br />
	* # $ \ &quot; x=$x</code></div>
<h2>
	Les calculs</h2>
<p class="spip">
	Addition&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ a=10; b=20; c=$((a+b)); echo &quot;a+b=$c&quot;<br />
	a+b=30</code></div>
<p class="spip">
	Multiplication et division&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ a=10; b=20; c=2; d=$((a*b/c)); echo &quot;a*b/c=$d&quot;<br />
	a*b/c=100</code></div>
<h2>
	Le traitement des cha&icirc;nes de caract&egrave;res</h2>
<p class="spip">
	Concat&eacute;nation de cha&icirc;nes de caract&egrave;res&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ a=toto; b=tutu; c=&quot;$a et $b&quot;; echo $c<br />
	toto et tutu</code></div>
<p class="spip">
	Supprime les 5 premiers caract&egrave;res de la cha&icirc;ne&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ fich=&quot;test.tar.gz&quot; ; echo ${fich:5}<br />
	tar.gz</code></div>
<p class="spip">
	Extrait 3 caract&egrave;res &agrave; partir du cinqui&egrave;me&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>tony@etch:~$ fich=&quot;test.tar.gz&quot; ; echo ${fich:5:3}<br />
	tar</code></div>
<p class="spip">
	Le signe &laquo;&nbsp;%&nbsp;&raquo; permet de supprimer le plus <strong class="spip">petit suffixe</strong> correspond &agrave; l&rsquo;expression r&eacute;guli&egrave;re&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ fich=&quot;test.tar.gz&quot; ; echo ${fich%.*}<br />
	test.tar</code></div>
<p class="spip">
	Le signe &laquo;&nbsp;%%&nbsp;&raquo; permet de supprimer le plus <strong class="spip">grand suffixe</strong> correspond &agrave; l&rsquo;expression r&eacute;guli&egrave;re&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ fich=&quot;test.tar.gz&quot; ; echo ${fich%%.*}<br />
	test</code></div>
<p class="spip">
	Le signe &laquo;&nbsp;#&nbsp;&raquo; permet de supprimer le plus <strong class="spip">petit pr&eacute;fixe</strong> correspond &agrave; l&rsquo;expression r&eacute;guli&egrave;re&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ fich=&quot;test.tar.gz&quot; ; echo ${fich#*.}<br />
	tar.gz</code></div>
<p class="spip">
	Le signe &laquo;&nbsp;##&nbsp;&raquo; permet de supprimer le plus <strong class="spip">grand pr&eacute;fixe</strong> correspond &agrave; l&rsquo;expression r&eacute;guli&egrave;re&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ fich=&quot;test.tar.gz&quot; ; echo ${fich##*.}<br />
	gz</code></div>
<p class="spip">
	Remplace la premi&egrave;re sous-cha&icirc;ne trouv&eacute;e par celle propos&eacute;e&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>fich=&quot;test.tar.gz&quot; ; echo ${fich/.tar.gz/.tgz}<br />
	test.tgz</code></div>
<p class="spip">
	Remplace toutes les sous-cha&icirc;nes trouv&eacute;es par celle propos&eacute;e&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>fich=&quot;test.tar.gz.tar.gz&quot; ; echo ${fich//.tar.gz/.tgz}<br />
	test.tgz.tgz</code></div>
<p class="spip">
	La commande suivante permet de retrouver la longueur d&rsquo;une cha&icirc;ne&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ fich=&quot;test.tar.gz&quot; ; echo ${#fich}<br />
	11</code></div>
<h2>
	Utilisation des pipelines</h2>
<p class="spip">
	Le caract&egrave;re &laquo;&nbsp;|&nbsp;&raquo; permet d&rsquo;envoyer la sortie d&rsquo;une commande sur l&rsquo;entr&eacute;e de la commande suivante. Exemple&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ df -h | tail -1 | sed &quot;s/ &nbsp;*/ /g&quot; | cut -d &quot; &quot; -f 4<br />
	4,2G</code></div>
<p class="spip">
	La m&ecirc;me chose avec &laquo;&nbsp;<strong class="spip"> awk </strong>&nbsp;&raquo;&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ df -h | tail -1 | awk &#39;{print $4}&#39;<br />
	4,2G</code></div>
<h2>
	L&rsquo;encha&icirc;nement de commandes sur une m&ecirc;me ligne</h2>
<p class="spip">
	Ces commandes sont ex&eacute;cut&eacute;es les unes derri&egrave;res les autres&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ echo debut; echo fin<br />
	debut<br />
	fin</code></div>
<p class="spip">
	La derni&egrave;re commande est ex&eacute;cut&eacute; uniquement si la commande pr&eacute;c&eacute;dente c&rsquo;est ex&eacute;cut&eacute;e avec succ&egrave;s&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ echo debut; true &amp;&amp; echo fin<br />
	debut<br />
	fin</code></div>
<p class="spip">
	La derni&egrave;re commande est ex&eacute;cut&eacute; uniquement si la commande pr&eacute;c&eacute;dente a retourn&eacute; une erreur&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ echo debut; false || echo fin<br />
	debut<br />
	fin</code></div>
<h2>
	Les redirections</h2>
<p class="spip">
	Envoie la sortie standard dans le fichier ls.txt&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ ls /etc/ &gt;ls.txt</code></p>
<p class="spip">
	Envoie la sortie standard &agrave; la fin du fichier ls.txt&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ ls /etc/ &gt;&gt;ls.txt</code></p>
<p class="spip">
	Envoie la sortie d&rsquo;erreur dans le fichier ls.err&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ ls /toto 2&gt;ls.err</code></p>
<p class="spip">
	Redirection de la sortie standard et de la sortie d&rsquo;erreur dans deux fichiers s&eacute;par&eacute;s&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ ls /etc/ &gt;ls.txt 2&gt;ls.err</code></p>
<p class="spip">
	Envoie la sortie d&rsquo;erreur et la sortie standard dans le fichier ls.txt&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ ls /toto 2&gt;&amp;1 &gt;ls.txt</code></p>
<p class="spip">
	La m&ecirc;me chose en plus court&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ ls /toto &amp;&gt;ls.txt</code></p>
<p class="spip">
	Redirige le r&eacute;sultat de deux commandes dans ls.txt</p>
<p class="spip">
	<code class="spip_code" dir="ltr">(ls /etc; ls /toto) &amp;&gt;ls.txt</code></p>
<h2>
	Op&eacute;rateur de test [ ]</h2>
<p class="spip">
	L&rsquo;op&eacute;rateur de test &laquo;&nbsp;[ ]&nbsp;&raquo; retourne &laquo;&nbsp;vrai&nbsp;&raquo; si la condition est vrai et &laquo;&nbsp;faux&nbsp;&raquo; dans le cas contraire. Donc cette ligne ex&eacute;cutera la commande &laquo;&nbsp;<strong class="spip"> echo </strong>&nbsp;&raquo; seulement si le fichier existe&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ [ -f ./test.sh ] &amp;&amp; echo &quot;OK&quot;</code></p>
<p class="spip">
	Arguments les plus courant de l&rsquo;op&eacute;rateur</p>
<table class="spip">
	<tbody>
		<tr class="row_even">
			<td>
				Option</td>
			<td>
				Vrai si</td>
		</tr>
		<tr class="row_odd">
			<td>
				-e fichier</td>
			<td>
				Le fichier indiqu&eacute; existe</td>
		</tr>
		<tr class="row_even">
			<td>
				-d r&eacute;pertoire</td>
			<td>
				Le r&eacute;pertoire indiqu&eacute; existe</td>
		</tr>
		<tr class="row_odd">
			<td>
				-f fichier</td>
			<td>
				Le fichier indiqu&eacute; est un fichier r&eacute;gulier</td>
		</tr>
		<tr class="row_even">
			<td>
				-h fichier</td>
			<td>
				Le fichier indiqu&eacute; est un lien symbolique</td>
		</tr>
		<tr class="row_odd">
			<td>
				chaine1 = chaine2</td>
			<td>
				Les deux cha&icirc;nes sont identiques</td>
		</tr>
		<tr class="row_even">
			<td>
				val1 -eq val2</td>
			<td>
				Les deux valeurs sont &eacute;gales</td>
		</tr>
		<tr class="row_odd">
			<td>
				val1 -ge val2</td>
			<td>
				val1 &gt;= val2</td>
		</tr>
		<tr class="row_even">
			<td>
				val1 -gt val2</td>
			<td>
				val1 &gt; val2</td>
		</tr>
		<tr class="row_odd">
			<td>
				val1 -le val2</td>
			<td>
				val1 &lt;= val2</td>
		</tr>
		<tr class="row_even">
			<td>
				val1 -lt val2</td>
			<td>
				val1 &lt; val2</td>
		</tr>
		<tr class="row_odd">
			<td>
				val1 -ne val2</td>
			<td>
				val1&nbsp;!= val2</td>
		</tr>
	</tbody>
</table>
<h2>
	Condition (if...else...fi)</h2>
<p class="spip">
	Syntaxe g&eacute;n&eacute;rale&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>if condition ; then<br />
	&nbsp;...<br />
	else<br />
	&nbsp;...<br />
	fi</code></div>
<p class="spip">
	Cette instruction s&rsquo;utilise en g&eacute;n&eacute;rale avec l&rsquo;op&eacute;rateur de test d&eacute;taill&eacute; au chapitre pr&eacute;c&eacute;dent. Exemple&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>if [ -f ./test.sh ] ; then<br />
	&nbsp;echo &quot;OK&quot;<br />
	fi</code></div>
<p class="spip">
	Ou sur une seule ligne&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">if [ -f ./test.sh ] ; then echo &quot;OK&quot; ; fi</code></p>
<h2>
	Condition &laquo;&nbsp;case...esac&nbsp;&raquo;</h2>
<p class="spip">
	Syntaxe g&eacute;n&eacute;rale&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>case expression in<br />
	&nbsp;motif1) commande 1 ;;<br />
	&nbsp;motif2) commande 2 ;;<br />
	&nbsp;...<br />
	esac</code></div>
<p class="spip">
	Le motif peut contenir<br />
	<img alt="-" src="" />&nbsp;*&nbsp;: N&rsquo;importe quelle cha&icirc;ne de caract&egrave;res<br />
	<img alt="-" src="" />&nbsp;&nbsp;?&nbsp;: N&rsquo;importe quel caract&egrave;re<br />
	<img alt="-" src="" />&nbsp;[abc]&nbsp;: Alternance de caract&egrave;res<br />
	<img alt="-" src="" />&nbsp;[A-Z]&nbsp;: Suite de caract&egrave;res<br />
	<img alt="-" src="" />&nbsp;|&nbsp;: OU permettant de combiner plusieurs motifs</p>
<p class="spip">
	Exemple&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>#! /bin/bash<br />
	<br />
	while [ -n &quot;$1&quot; ]; do<br />
	&nbsp;ping -c 1 -w 1 $1 &gt;/dev/null 2&gt;&amp;1<br />
	&nbsp;case $? in<br />
	&nbsp; &nbsp;0) echo -e &quot;$1 \t OK !&quot;;;<br />
	&nbsp; &nbsp;1) echo -e &quot;$1 \t injoignable !&quot;;;<br />
	&nbsp; &nbsp;2) echo -e &quot;$1 \t inexistant !&quot;;;<br />
	&nbsp;esac<br />
	&nbsp;shift<br />
	done</code></div>
<h2>
	Boucle &laquo;&nbsp;while...done&nbsp;&raquo;</h2>
<p class="spip">
	Syntaxe g&eacute;n&eacute;rale&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>while condition ; do<br />
	&nbsp;...<br />
	done</code></div>
<p class="spip">
	Exemple&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>i=0 ;<br />
	while [ $i -lt 5 ] ; do<br />
	&nbsp;i=$((i+1))<br />
	&nbsp;echo $i<br />
	done</code></div>
<p class="spip">
	La m&ecirc;me chose sur une ligne&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">i=0 ; while [ $i -lt 5 ] ; do i=$((i+1)) ; echo $i ; done</code></p>
<p class="spip">
	Un autre exemple en utilisant l&rsquo;instruction &laquo;&nbsp;<strong class="spip"> break </strong>&nbsp;&raquo;permettant de sortie de la boucle&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>i=0<br />
	while true ; do<br />
	&nbsp; &nbsp; &nbsp; &nbsp;echo &quot;$i avec break&quot;<br />
	&nbsp; &nbsp; &nbsp; &nbsp;i=$((i+1))<br />
	&nbsp; &nbsp; &nbsp; &nbsp;[ $i -eq 5 ] &amp;&amp; break<br />
	done</code></div>
<h2>
	Boucle &laquo;&nbsp;until...done&nbsp;&raquo;</h2>
<p class="spip">
	Syntaxe g&eacute;n&eacute;rale&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>until condition ; do<br />
	&nbsp;...<br />
	done</code></div>
<h2>
	Boucle &laquo;&nbsp;for...done&nbsp;&raquo;</h2>
<p class="spip">
	Le fonctionnement de cette boucle est tr&egrave;s diff&eacute;rent de celui des autres langages.</p>
<p class="spip">
	Syntaxe&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>for variale in liste_de_mots ; do<br />
	&nbsp;...<br />
	done</code></div>
<p class="spip">
	Exemple&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">$ for var in a b c d ; do echo $var ; done</code></p>
<p class="spip">
	Renommer une s&eacute;rie de fichiers&nbsp;:</p>
<p class="spip">
	<code class="spip_code" dir="ltr">for i in *.tgz ; do mv $i ${i%tgz}tar.gz ; done</code></p>
<h2>
	Boucle &laquo;&nbsp;select...done&nbsp;&raquo; permet de r&eacute;aliser des listes de choix</h2>
<p class="spip">
	Exemple&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ select var in a b c ; do echo $var ; done<br />
	1) a<br />
	2) b<br />
	3) c<br />
	#? &nbsp; &nbsp; &nbsp; </code></div>
<h2>
	Fonctions</h2>
<p class="spip">
	Voici la syntaxe g&eacute;n&eacute;rale d&rsquo;une fonction&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>function nom_de_la_fonction ()<br />
	{<br />
	...<br />
	}</code></div>
<h2>
	Passage d&rsquo;arguments</h2>
<p class="spip">
	$0&nbsp;: Contient le nom du script</p>
<p class="spip">
	$1&nbsp;: Premier argument ($2&nbsp;: Deuxi&egrave;me argument,..)</p>
<p class="spip">
	$<i class="spip">10</i>&nbsp;: Dixi&egrave;me argument (Attention&nbsp;: $10 retourne le premier argument suivi de 0</p>
<p class="spip">
	$*&nbsp;: Tous les arguments mais sans prot&eacute;ger les espaces et caract&egrave;res sp&eacute;ciaux</p>
<p class="spip">
	&quot;$@&quot;&nbsp;: Tous les arguments mais en prot&eacute;geant les espaces et caract&egrave;res sp&eacute;ciaux</p>
<p class="spip">
	$#&nbsp;: Nombre d&rsquo;arguments de la fonction</p>
<p class="spip">
	La commande &laquo;&nbsp;<strong class="spip"> shift </strong>&nbsp;&raquo; permet de d&eacute;caler les variables (Le contenu de $1 est remplac&eacute; par celui de $2,..). Cela permet par exemple de lire le contenu de toute les variables&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>while [ -n &quot;$1&quot; ] ; do<br />
	&nbsp; &nbsp; &nbsp; &nbsp;echo $1<br />
	&nbsp; &nbsp; &nbsp; &nbsp;shift<br />
	done</code></div>
<p class="spip">
	Affiche la lites des arguments pass&eacute;s au script&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>for i in &quot;$@&quot; ; do<br />
	&nbsp;echo $i<br />
	done</code></div>
<p class="spip">
	La m&ecirc;me chose en plus court&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>for i ; do<br />
	&nbsp;echo $i<br />
	done</code></div>
<h2>
	Traitement des options dans un script</h2>
<h3>
	Traitement des options sans arguments</h3>
<p class="spip">
	L&rsquo;instruction &laquo;&nbsp;<strong class="spip"> getopts </strong>&nbsp;&raquo; permet de traiter les options pass&eacute;es en ligne de commande. Dans cet exemple, nous avons comme options &laquo;&nbsp;-a, -b et/ou -c&nbsp;&raquo;. L&rsquo;ordre des options n&rsquo;a pas d&rsquo;importance et il est possible de les coller ou pas.</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>while getopts &quot;abc&quot; option ; do<br />
	&nbsp;case $option in<br />
	&nbsp; &nbsp;a) echo &quot;Option a&quot;;;<br />
	&nbsp; &nbsp;b) echo &quot;Option b&quot;;;<br />
	&nbsp; &nbsp;c) echo &quot;Option c&quot;;;<br />
	&nbsp;esac<br />
	done</code></div>
<p class="spip">
	Test&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ ./traite_arguments.sh -c -ab<br />
	Option c<br />
	Option a<br />
	Option b</code></div>
<h3>
	Traitement des options avec argument</h3>
<p class="spip">
	Si une option n&eacute;cessite un argument, il faut la faire suivre du signe &laquo;&nbsp;&nbsp;:&nbsp;&raquo; et la valeur de l&rsquo;argument sera accessible dans la variable &laquo;&nbsp;OPTARG&nbsp;&raquo;. Exemple&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>while getopts &quot;abc:d:&quot; option ; do<br />
	&nbsp;case $option in<br />
	&nbsp; &nbsp;a) echo &quot;Option a&quot;;;<br />
	&nbsp; &nbsp;b) echo &quot;Option b&quot;;;<br />
	&nbsp; &nbsp;c) echo &quot;Option c, argument $OPTARG&quot;;;<br />
	&nbsp; &nbsp;d) echo &quot;Option d, argument $OPTARG&quot;;;<br />
	&nbsp;esac<br />
	done</code></div>
<p class="spip">
	Test&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ ./traite_arguments2.sh -c toto -ab -d tutu<br />
	Option c, argument toto<br />
	Option a<br />
	Option b<br />
	Option d, argument tutu</code></div>
<h3>
	Traitement des erreurs</h3>
<p class="spip">
	Pour g&eacute;rer les erreurs, il faut ajouter &laquo;&nbsp;&nbsp;:&nbsp;&raquo; dans la liste des options possibles. Cela permettra de traiter les options sans arguments. Et pour traiter les options inconnues &laquo;&nbsp;<strong class="spip"> getopts </strong>&nbsp;&raquo; retourne &laquo;&nbsp;&nbsp;?&nbsp;&raquo; qu&rsquo;il suffit de traiter dans le script&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>while getopts &quot;:abc:d:&quot; option ; do<br />
	&nbsp;case $option in<br />
	&nbsp; &nbsp;a) echo &quot;Option a&quot;;;<br />
	&nbsp; &nbsp;b) echo &quot;Option b&quot;;;<br />
	&nbsp; &nbsp;c) echo &quot;Option c, argument $OPTARG&quot;;;<br />
	&nbsp; &nbsp;d) echo &quot;Option d, argument $OPTARG&quot;;;<br />
	&nbsp; &nbsp;:) echo &quot;Argument manquant pour l&#39;option -$OPTARG&quot;;;<br />
	&nbsp; &nbsp;?) echo &quot;Option -$OPTARG inconnue&quot;;;<br />
	&nbsp;esac<br />
	done</code></div>
<h3>
	Traitement des options longues sans arguments</h3>
<p class="spip">
	Par d&eacute;faut &laquo;&nbsp;<strong class="spip"> getopts </strong>&nbsp;&raquo; ne sais pas traiter les options longues mais une petite astuce permet de contourner ce probl&egrave;me pour les options sans argument. Pour cela il suffit de d&rsquo;ajouter dans les options &laquo;&nbsp;-&nbsp;&raquo; et de traiter en premier le cas des options longues.</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>while getopts &quot;:hv-:&quot; option ; do<br />
	&nbsp;if [ &quot;$option&quot; = &quot;-&quot; ] ; then<br />
	&nbsp; &nbsp;case $OPTARG in<br />
	&nbsp; &nbsp; &nbsp;help) &nbsp; &nbsp;option=h;;<br />
	&nbsp; &nbsp; &nbsp;version) option=v;;<br />
	&nbsp; &nbsp; &nbsp;*) &nbsp; &nbsp; &nbsp; echo &quot;Option $OPTARG inconnue&quot;;;<br />
	&nbsp; &nbsp;esac<br />
	&nbsp;fi<br />
	&nbsp;case $option in<br />
	&nbsp; &nbsp;h) echo &quot;Option h&quot;;;<br />
	&nbsp; &nbsp;v) echo &quot;Option v&quot;;;<br />
	&nbsp; &nbsp;?) echo &quot;Option -$OPTARG inconnue&quot;;;<br />
	&nbsp;esac<br />
	done</code></div>
<p class="spip">
	Test&nbsp;:</p>
<div class="spip_code" dir="ltr" style="text-align: left;">
	<code>$ ./traite_arguments3.sh --version -h -a<br />
	Option v<br />
	Option h<br />
	Option -a inconnue</code></div>
<h2>
	Pour avoir plus d&rsquo;informations</h2>
<p class="spip">
	Pour avoir plus d&rsquo;explications sur la programmation en Bash mais &eacute;galement avec Sed, Awk, Perl, Tcl, Tk, Python, Ruby ..., je vous conseille la lecture de cet excellent livre dont deux chapitres sont disponibles au format PDF&nbsp;:<br />
	<img alt="-" src="" />&nbsp;<a class="spip_out" href="http://www.editions-eyrolles.com/Livre/9782212110289/langages-de-scripts-sous-linux">http://www.editions-eyrolles.com/Livre/9782212110289/langages-de-scripts-sous-linux</a></p>
<h2>
	Historique des modifications</h2>
<table class="spip">
	<thead>
		<tr class="row_first">
			<th scope="col">
				<strong class="spip">Version</strong></th>
			<th scope="col">
				<strong class="spip">Date</strong></th>
			<th scope="col">
				<strong class="spip">Commentaire</strong></th>
		</tr>
	</thead>
	<tbody>
		<tr class="row_even">
			<td>
				0.1</td>
			<td>
				14/08/08</td>
			<td>
				Cr&eacute;ation par Tony GALMICHE</td>
		</tr>
		<tr class="row_odd">
			<td>
				&nbsp;</td>
			<td>
				&nbsp;</td>
			<td>
				&nbsp;</td>
		</tr>
	</tbody>
</table>
