tuteurs.ens.fr/unix/shell/variable.tml

226 lines
7.1 KiB
Text
Raw Normal View History

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
"tuteurs://DTD/tml.dtd">
<html>
<head>
<title>Variables</title>
</head>
<body>
<h1><a name="variables">Les variables en shell</a></h1>
<h2>Qu'est-ce qu'une variable ?</h2>
<p>
Une variable est l'assignation d'une étiquette à un contenu ; ce
contenu, comme l'indique le mot « variable », peut changer
autant que l'on veut ; l'assignation de l'étiquette à ce contenu,
elle, est fixe, aussi longtemps que l'on ne dissout pas la
variable. </p>
<p>
La notion de variable est commune à presque tous les langages
informatiques, et en particulier aux langages de programmation. Ceux qui
ont déjà manipulé des langages sont donc familiers avec cette
notion. Pour les autres, un petit exemple les aidera peut-être à la
saisir.
</p>
<p>
Mettons que vous programmiez un hachoir, comme nous le proposions sur la
page consacrée au <a href="commande.html">shell en ligne de
commande</a>. Un hachoir est un instrument dangereux, à ne pas mettre
à la portée des enfants. Robert le jardinier, qui a conçu ce
hachoir, veut être le seul à pouvoir l'utiliser, sans quoi le
petit Émile pourrait se blesser en y mettant le doigt.</p>
<p> Ainsi, il va dire au programme <code>hachoir</code> de vérifier la
variable <code>USER</code>, qui contient le nom de l'utilisateur. Si le
nom « Robert » est associé à l'étiquette <code>USER</code>,
alors le programme se met en route ; sinon, il dit à l'utilisateur
de ne pas utiliser cet instrument sans la présence d'un adulte, et de
bien regarder des deux côtés avant de traverser la rue.
</p>
<p>
Certaines variables sont prédéfinies, par exemple
<code>USER</code> ; mais on peut en créer autant que l'on veut. Par
exemple, si Robert veut autoriser d'autres adultes que lui à utiliser
son hachoir, il peut faire que le programme demande à l'utilisateur quel
âge il a ; la réponse est enregistrée dans la variable
<code>age</code> ; ensuite, le programme va examiner le contenu de
cette variable. Si <code>age &gt;= 18</code>, alors le hachoir peut se
mettre en route ; mais si <code>age &lt; 18</code>, le hachoir
refuse de se mettre en marche.
</p>
<h2>Les variables en shell</h2>
<p>
En shell, pour désigner le contenu d'une variable, on écrit le nom de la
variable précédé du signe dollar. Exemple : <code>echo
$HOME</code> affiche le nom du répertoire personnel de l'utilisateur,
mémorisé par la variable <code>HOME</code>.
</p>
<h3>Les noms de variables</h3>
<p>
Par convention, les variables relevant du système, comme
<code>HOME</code>, <code>USER</code> et beaucoup d'autres, sont en
majuscules, tandis que l'on recommande d'écrire en minuscules les
variables que l'on se crée soi-même. On évite ainsi la désagréable
surprise de remplacer une variable importante et de casser tout ou
partie de son système.
</p>
<p>
Les noms de variables sont en effet sensibles à la casse :
<code>USER</code>, <code>user</code>, <code>User</code>,
<code>uSeR</code> etc. sont des variables différentes.
</p>
<h3>Définir une variable</h3>
<p>
La façon de donner une valeur à une variable varie selon le type de shell
utilisé :
</p>
<p>
<strong>C-Shell</strong> (<code>csh</code>, <code>tcsh</code>,
<code>lcsh</code>) : on utilise la commande <code>setenv</code> :
</p>
<pre>
<span class="prompt">chaland ~ $</span> setenv foo bar
<span class="prompt">chaland ~ $</span> echo $foo
bar</pre>
<p>
Famille des <strong>Bourne Shell</strong> (<code>sh</code>, <code>bash</code>,
<code>zsh</code>, <code>ksh</code>) : on utilise <code>export</code> :
</p>
<pre>
<span class="prompt">chaland ~ $</span> foo=bar
<span class="prompt">chaland ~ $</span> export foo
<span class="prompt">chaland ~ $</span> echo $foo
bar</pre>
<div class="attention">
Comme vous pouvez le remarquer :
<ul>
<li> pour <strong>définir</strong> le contenu d'une variable, on
écrit simplement son nom, <strong>sans le
signe $</strong> ;</li>
<li> tandis que pour <strong>utiliser</strong> le contenu d'une
variable, on fait précéder son nom du
<strong>signe $</strong>. </li>
</ul>
</div>
<h3>Les variables d'environnement</h3>
<p>
Les valeurs des variables sont accessibles aux commandes lancées par le
shell. L'ensemble de ces valeurs constitue l'<em>environnement</em>.
On peut aussi supprimer une variable de l'environnement avec
<code>unsetenv</code> (C-Shell) ou <code>unset</code> (Bourne Shell).
</p>
<p>
Quelques variables d'environnement:
</p>
<ul>
<li><code>DISPLAY</code> : L'écran sur lequel les programmes X
travaillent. Cette variable est souvent de la forme :
<code>machine.somehost.somewhere:0.0</code> Si cette variable est vide,
c'est qu'il n'y a pas d'affichage graphique possible. </li>
<li><code>PRINTER</code> : pour les commandes d'impression. Contient le
nom de l'imprimante sur laquelle il faut envoyer vos fichiers. </li>
<li><code>EDITOR</code> : utilisée par <code>mutt</code>,
<code>forum</code>, et beaucoup d'autres commandes. Contient le nom de
votre éditeur de textes préféré. </li>
<li><code>VISUAL</code> : la même chose qu'<code>EDITOR</code>. </li>
<li><code>SHELL</code> : contient le nom de votre shell. </li>
<li><code>HOME</code> : contient le nom de votre répertoire personnel.
</li>
<li><code>USER</code> : contient votre nom de login. </li>
<li><code>LOGNAME</code> : la même chose que <code>USER</code>. </li>
<li><code>PATH</code> : contient une liste de répertoires dans lesquels
le shell va chercher les commandes.
</li>
</ul>
<p>
Exercice : Assurez-vous que <code>/usr/local/games/bin</code> se trouve
bien dans votre PATH.
</p>
<h2><a name="shvariables">Utiliser les variables dans un script</a></h2>
<p>
Dans les scripts, on peut utiliser des variables définies à l'extérieur
(avec <code>setenv</code> ou <code>export</code>), mais aussi définir ses
variables locales propres au script. On donne une valeur à une variable avec
une commande de la forme
<code><em>nom-de-variable</em>=<em>valeur</em></code>. Les variables sont
utilisées pour stocker des informations.
</p>
<p>
On a aussi des variables spéciales, initialisées automatiquement au
début du script:
</p>
<table class="tableau">
<tr>
<td><code>$0</code></td>
<td>Le nom de la commande (i.e. : du script)</td>
</tr>
<tr>
<td><code>$1</code>, <code>$2</code>, etc.</td>
<td>Le premier, deuxième, etc, argument passés au script.</td>
</tr>
<tr>
<td><code>$*</code></td>
<td>La liste de tous les arguments passés au script.</td>
</tr>
<tr>
<td><code>$#</code></td>
<td>Le nombre d'arguments passés au script.</td>
</tr>
<tr>
<td><code>$?</code></td>
<td>Le code de retour de la dernière commande lancée.</td>
</tr>
<tr>
<td><code>$!</code> </td>
<td>Le numéro de process de la dernière commande lancée en tâche de fond.</td>
</tr>
<tr>
<td><code>$$</code></td>
<td>Le numéro de process du shell lui-même.</td>
</tr>
</table>
<div class="metainformation">
Basé sur un polycopié de Roberto Di Cosmo, Xavier Leroy et Damien Doligez.
Modifications : Nicolas George, Baptiste Mélès.
Dernière modification le <date value="$Date: 2007-07-17 10:03:44 $" />.
</div>
</body>
</html>