<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.guillaume.lelarge.info/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>gleu's blog - Tag - bash</title>
  <link>http://blog.guillaume.lelarge.info/index.php/</link>
  <atom:link href="http://blog.guillaume.lelarge.info/index.php/feed/tag/bash/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Tue, 06 Jan 2009 23:08:31 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Écriture d'un script bash</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2007/10/05/Ecriture-dun-script-bash</link>
    <guid isPermaLink="false">urn:md5:e9c5b3668589ae32fd006ffa20dddc2b</guid>
    <pubDate>Fri, 05 Oct 2007 17:50:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>Développement</category>
        <category>bash</category>    
    <description>    &lt;p&gt;Depuis quelques semaines, j'ai pris de bonnes résolutions pour mes scripts bash. Je suis arrivé à les structurer efficacement.&lt;/p&gt;


&lt;p&gt;Je commence tout d'abord par les variables configurables. Cela donne en gros ceci :&lt;/p&gt;

&lt;pre&gt;
##### Variables configurables #####
# outils
PGDUMP=$(which pg_dump)
PSQL=$(which psql)
# cet outil
ME=`basename $0`
# répertoires de travail
DIRBASE=${REPBASE:-&amp;quot;/opt/${ME}&amp;quot;}
# fichiers temporaires
FICTMP=&amp;quot;/tmp/${ME}.$$&amp;quot;
# journaux
FICLOG=&amp;quot;$DIRBASE/${ME}.log&amp;quot;
FICERR=&amp;quot;$DIRBASE/${ME}.err&amp;quot;
# fichiers de configuration
FICCONF=${1:&amp;quot;/etc/${ME}.conf&amp;quot;}
##### Fin des variables configurables #####
&lt;/pre&gt;


&lt;p&gt;En premier lieu, les outils. Par défaut, j'indique &lt;code&gt;$(which mon_outil)&lt;/code&gt; pour que l'emplacement système par défaut soit utilisé. Cependant, si l'utilisateur de ce script a compilé et installé lui-même cet outil dans un répertoire particulier, il peut directement modifier cette ligne en y mettant le chemin complet. Ensuite, nous avons les répertoires de travail, les fichiers temporaires, de configuration et les journaux. L'initialisation de la variable &lt;code&gt;DIRBASE&lt;/code&gt; est intéressante : elle signifie que &lt;code&gt;DIRBASE&lt;/code&gt; sera initialisée avec le contenu de la variable &lt;code&gt;REPBASE&lt;/code&gt; si cette variable est déjà initialisée et que, dans le cas contraire, elle prendra la valeur &lt;code&gt;/opt/${ME}&lt;/code&gt;. Cela a un très gros intérêt : cela me permet de modifier une variable suivant mon environnement. Je n'ai donc pas besoin de modifier le script pour que &lt;code&gt;DIRBASE&lt;/code&gt; considère un autre répertoire de travail. &lt;code&gt;FICCONF=${1:&amp;quot;/etc/${ME}.conf&amp;quot;}&lt;/code&gt; est un autre exemple de ce type de construction. La variable FICCONF prendra la valeur du premier argument en ligne de commande, s'il y en a un. Dans le cas contraire, FICCONF sera initialisée avec /etc/${ME}.conf. Cela me permet donc de modifier temporairement le fichier de configuration en le proposant sur la ligne de commande.&lt;/p&gt;


&lt;p&gt;Une fois les initialisations réalisées, il faut vérifier un certain nombre de points. Par exemple, je propose à l'utilisateur de modifier certaines variables. Il est donc essentiel que je vérifie que les modifications réalisées sont valides. Voici la vérification des variables :&lt;/p&gt;

&lt;pre&gt;
for variable in &amp;quot;PGDUMP&amp;quot; &amp;quot;PSQL&amp;quot; &amp;quot;ME&amp;quot; &amp;quot;DIRBASE&amp;quot; \
                &amp;quot;FICTMP&amp;quot; &amp;quot;FICLOG&amp;quot; &amp;quot;FICERR&amp;quot; &amp;quot;FICCONF&amp;quot;
do
  eval valeur=\$$variable
  if test -z &amp;quot;$valeur&amp;quot;
  then
    echo &amp;quot;ERREUR: mauvaise configuration de la variable $variable (actuellement vide)&amp;quot;
    exit 1
  fi
done
&lt;/pre&gt;


&lt;p&gt;Je vérifie ensuite l'existence des outils et leur « exécutabilité » :&lt;/p&gt;

&lt;pre&gt;
for outil in &amp;quot;$PSQL&amp;quot; &amp;quot;$PGDUMP&amp;quot;
do
  if test ! -x &amp;quot;$outil&amp;quot;
  then
    echo &amp;quot;ERREUR: $outil inexistant ou non exécutable&amp;quot;
    exit 2
  fi
done
&lt;/pre&gt;


&lt;p&gt;Ensuite, je vérifie les répertoires. Généralement, ce sont des répertoires de travail, donc, s'ils n'existent pas, il faut les créer :&lt;/p&gt;

&lt;pre&gt;
if test ! -d &amp;quot;$DIRBASE&amp;quot;
then
  mkdir -p &amp;quot;$REP_DUMP&amp;quot;
  if test $? -eq 0
  then
    echo &amp;quot;création du répertoire de sauvegarde '$REP_DUMP'&amp;quot;
  else
    echo &amp;quot;ERREUR lors de la création du répertoire de sauvegarde '$REP_DUMP'&amp;quot;
    exit 3
  fi
fi
&lt;/pre&gt;


&lt;p&gt;Voilà. Du coup, mes scripts comportent généralement plus de tests que de code réalisant la fonction première, mais bon, au moins, c'est assez blindé.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2007/10/05/Ecriture-dun-script-bash#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2007/10/05/Ecriture-dun-script-bash#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/atom/comments/841</wfw:commentRss>
      </item>
    
</channel>
</rss>