Wxcaféfile:///home/wxcafe/code/blog-source/output/2012-09-08T18:15:00+02:00Introduction a bash en tant que language de programmation.2012-09-08T18:15:00+02:00Wxcafetag:,2012-09-08:home/wxcafe/code/blog-source/output/posts/introduction-a-bash-en-tant-que-language-de-programmation/<p>L’interpréteur de commandes bash (Bourne Again SHell) est possiblement le shell le plus connu, notamment grâce a son intégration en tant que shell par défaut dans les distributions Linux les plus répandues (Debian - Ubuntu, Fedora, OpenSUSE, Mandriva - Mageia, etc...).</p> <p>Cependant, il n'est souvent connu qu'en tant qu’interpréteur de commande. Alors qu'en réalité, le bash est un langage de programmation (presque) complet! Ainsi, il intègre les structures de contrôle habituelles ( pour mémoire, les structures de contrôle comprennent les conditions (les ifs), les boucles (les while), et les choix (les case), entre autres.), et est donc ce que l'on pourrait appeler un langage de script, interprété, de la même façon que python, a la difference près qu'il contient un prompt (un système d'entrée de commande interactif) bien plus complet et développé que python. </p> <p>Cependant, les programmes en bash ne sont executables que dans un environnement de type UNIX, et donc pas sous Windows (cygwin (cygwin.com) propose ceci dit un système permettant d'utiliser bash sous windows. Il faut malgré tout convenir que cet environnement est bien plus compliqué a manipuler, et globalement ne permet pas d'acceder a des portages de qualité satisfaisante.)</p> <p>Ainsi, il est possible de créer des fichiers .sh, contenant des instructions bash mises a la suite (de la même façon qu'un script BATCH Windows .bat), et faisant appel autant aux commandes internes de bash, aussi bien que les commandes externes mises en place par les programmes installés sur le système, exactement comme dans une invite de commande. Ainsi, pour appeller firefox, la commande 'firefox' lancera le petit panda roux directement dans la boite magique, tandis qu'un if [condition] suivi d'un then (quelque chose) lancera le fameux quelque chose suscité si la condition est vérifiée. Un peu comme en C, quoi. </p> <p>De cette façon, et avec quelques informations et connaissances, il est facile de comprendre le fonctionnement de la programmation en bash. Quelques exemples commentés:</p> <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 2 3 4 5 6 7 8 9 10 11 12 13</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash </span> <span class="c"># La ligne du dessus est très importante, c&#39;est elle qui dit a bash quel doit être </span> <span class="c"># l&#39;interpreteur des commandes écrites dans ce script. Ici, on dit a bash d&#39;interpréter </span> <span class="c"># lui même les commandes comprises dans ce script. On aurait tout de fois pu lui faire </span> <span class="c"># executer du python, par exemple, en mettant #!/usr/bin/python a la place.</span> <span class="nb">echo</span> <span class="s2">&quot;this is a test of bash as a simple script manager&quot;</span> <span class="c"># echo est une commande d&#39;affichage de message.</span> <span class="nb">echo</span> <span class="s2">&quot;what&#39;s your name, user?&quot;</span> <span class="nb">read </span>your_name <span class="c"># la commande read permet de demander a l&#39;utilisateur de donner une </span> <span class="c"># information, stockée dans la variable en paramètre. </span> <span class="nb">echo</span> <span class="nv">$your_name</span> <span class="s2">&quot;is your name&quot;</span> <span class="c"># echo permet aussi d&#39;afficher la valeur de variables. </span> <span class="c"># Ici, on renvoie la variable remplie précédemment, suivie d&#39;un message. </span> <span class="nb">exit</span> <span class="c"># cet appel a exit n&#39;est pas obligatoire, mais donne un aspect plus </span> <span class="c"># propre au code. Il ne quittera pas la session de terminal, cependant.</span> </pre></div> </td></tr></table> <p>Voila. Ce script bash ne sert pas a grand chose, mais il a le mérite d'être clair quand aux capacités et a la simplicité du bash en tant que language de programmation. Alors en effet, nous n'avons ici absolument pas utilisé les capacités de bash en lui même, et n'avons fait que le renvoyer a des programmes externes (sauf read, il est vrai). Voyons maintenant la syntaxe de bash quand il s'agit d'utiliser les structures de contrôle:</p> <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 2 3 4 5 6 7 8 9 10</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash </span> <span class="nb">echo</span> <span class="s2">&quot;welcome to this second bash program. would you please kindly enter the name of the machine you&#39;re running this on?&quot;</span> <span class="nb">read </span>host_name <span class="k">if</span> <span class="o">[</span> <span class="nv">$host_name</span> <span class="o">==</span> <span class="nv">$HOSTNAME</span> <span class="o">]</span> <span class="c">## voici la syntaxe du if. Attention a bien penser a mettre les espaces avant la première variable, et après la seconde. La variable $HOSTNAME ici utilisée est une variable présente par défaut sur le système. </span> <span class="k">then </span><span class="nb">echo</span> <span class="s2">&quot;you told the truth!&quot;</span> <span class="k">fi</span> <span class="c">## le fi est la commande fermant le if, tout comme le EndIf en basic. C&#39;est un peu vieillot, mais important en bash. </span> <span class="k">if</span> <span class="o">[</span> <span class="nv">$host_name</span> !<span class="o">=</span> <span class="nv">$HOSTNAME</span> <span class="o">]</span> <span class="c">## l&#39;opérateur != est l&#39;inverse de ==, il vérifie donc si les deux variables ne sont pas les mêmes. </span> <span class="k">then </span><span class="nb">echo</span> <span class="s2">&quot;you lied!&quot;</span> <span class="k">fi </span> <span class="nb">exit</span> </pre></div> </td></tr></table> <p>Voila un petit programme permettant d'apprendre la syntaxe du if en bash. comme vous pouvez le voir, le language est plutôt lite, et la structure if n'est pas très difficile a prendre en main.</p> <p>Passons maintenant au while:</p> <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1 2 3 4 5 6 7</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash</span> <span class="nb">echo</span> <span class="s2">&quot;what is your name?&quot;</span> <span class="nb">read </span>name <span class="k">while</span> <span class="o">[</span> 1 &lt; 10 <span class="o">]</span> <span class="c">## le while se présente sous la forme while (truc); do (machin); done. Les [] sont en fait des programmes differents, inclus dans bash.</span> <span class="k">do </span><span class="nb">echo</span> <span class="s2">&quot;i love&quot;</span> <span class="nv">$name</span> <span class="k">done</span> <span class="nb">exit</span> </pre></div> </td></tr></table> <p>Ce petit programme permet d'observer les bases de while (qui est la boucle de base en bash).</p> <p>Le troisième opérateur de bash est case. Voyons:</p> <table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#!/bin/bash</span> <span class="nb">echo</span> <span class="s2">&quot;please enter a number between one and five&quot;</span> <span class="nb">read </span>number <span class="k">case</span> <span class="nv">$number</span> in 1<span class="o">)</span> <span class="nb">echo</span> <span class="s2">&quot;the choosen number was one&quot;</span> ;; 2<span class="o">)</span> <span class="nb">echo</span> <span class="s2">&quot;the choosen number was two&quot;</span> ;; 3<span class="o">)</span> <span class="nb">echo</span> <span class="s2">&quot;the choosen number was three&quot;</span> ;; 4<span class="o">)</span> <span class="nb">echo</span> <span class="s2">&quot;the choosen number was four&quot;</span> ;; 5<span class="o">)</span> <span class="nb">echo</span> <span class="s2">&quot;the choosen number was five&quot;</span> ;; *<span class="o">)</span> <span class="nb">echo</span> <span class="s2">&quot;this number is not correct&quot;</span> ;; <span class="k">esac</span> <span class="nb">exit</span> </pre></div> </td></tr></table> <p>case est un opérateur plus complexe a utiliser a bon escient, et sert a faire des ifs multiples sans avoir a taper des dizaines de lignes de code.<br /> (pour ceux qui auraient du mal avec cet opérateur, il faut comprendre que le code vérifie chacune des conditions : le 1) est validé si la valeur de \$number est 1, le 2) est validé si cette valeur est 2, etc.. le *) désigne toutes les valeurs, et est donc validé si aucune autre valeur n'a précédemment acceptée.</p> <p>Quelques notions manquent ici:<br /> - les nombres aléatoires sont générés par un appel a la variable \$RANDOM, qui renvoie un nombre aléatoire entre 0 et 32767 (un entier a 16 bits donc). il est possible de faire des invocations a des nombres aléatoires plus grands, mais les méthodes permettant de faire cela sont plus complexes, et je ne les aborderai donc pas ici.<br /> - comme vous avez pu le constater, les variables sont désignées en tant que telles par l'utilisation d'un symbole \$ au début de leur nom. Ainsi, echo number renverra "number", tandis que echo \$number renverra le résultat de la variable \$number.<br /> être utilisées dans un programme bash.<br /> - comme vous avez pu le constater, les commandes doivent tenir en théorie en une ligne. Cependant, le caractère \ permet de retourner a la ligne en faisant considérer a bash qu'il s'agit de la même ligne.</p> <p>Globalement, il faut admettre que bash n'a pas vocation a être un langage de programmation extrêmement développé. Sans framework graphique, avec peu de manières d'utiliser de grandes variables, ou encore une gestion de la mémoire risible, bash n'a rien d'un langage de développement professionnel.<br /> Cependant, le simple fait qu'il soit considéré comme un langage de programmation a part entière font de lui un langage de script d'une puissance incontestable, et sa simplicité et sa grande popularité font de lui un langage de choix pour apprendre la programmation simplement et sans trop se prendre la tête.</p> <p>J'espère que cet article aura été utile a certain-e-s, et je vous souhaite bonne chance dans votre découverte de la programmation (n'allez pas voir ceux qui font de l'orienté objet, c'est des méchants :3)</p>