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

226 lines
7 KiB
Text
Raw Normal View History

<?xml version="1.0" encoding="ISO-8859-1"?>
<!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<6C>?</h2>
<p>
Une variable est l'assignation d'une <20>tiquette <20> un contenu<6E>; ce
contenu, comme l'indique le mot <20><>variable<6C><65>, peut changer
autant que l'on veut<75>; l'assignation de l'<27>tiquette <20> ce contenu,
elle, est fixe, aussi longtemps que l'on ne dissout pas la
variable. </p>
<p>
La notion de variable est commune <20> presque tous les langages
informatiques, et en particulier aux langages de programmation. Ceux qui
ont d<>j<EFBFBD> manipul<75> des langages sont donc familiers avec cette
notion. Pour les autres, un petit exemple les aidera peut-<2D>tre <20> la
saisir.
</p>
<p>
Mettons que vous programmiez un hachoir, comme nous le proposions sur la
page consacr<63>e au <a href="commande.html">shell en ligne de
commande</a>. Un hachoir est un instrument dangereux, <20> ne pas mettre
<EFBFBD> la port<72>e des enfants. Robert le jardinier, qui a con<6F>u ce
hachoir, veut <20>tre le seul <20> pouvoir l'utiliser, sans quoi le
petit <20>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 <20><>Robert<72><74> est associ<63> <20> l'<27>tiquette <code>USER</code>,
alors le programme se met en route<74>; sinon, il dit <20> l'utilisateur
de ne pas utiliser cet instrument sans la pr<70>sence d'un adulte, et de
bien regarder des deux c<>t<EFBFBD>s avant de traverser la rue.
</p>
<p>
Certaines variables sont pr<70>d<EFBFBD>finies, par exemple
<code>USER</code><3E>; mais on peut en cr<63>er autant que l'on veut. Par
exemple, si Robert veut autoriser d'autres adultes que lui <20> utiliser
son hachoir, il peut faire que le programme demande <20> l'utilisateur quel
<EFBFBD>ge il a<>; la r<>ponse est enregistr<74>e dans la variable
<code>age</code><3E>; ensuite, le programme va examiner le contenu de
cette variable. Si <code>age &gt;= 18</code>, alors le hachoir peut se
mettre en route<74>; 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 <20>crit le nom de la
variable pr<70>c<EFBFBD>d<EFBFBD> du signe dollar. Exemple<6C>: <code>echo
$HOME</code> affiche le nom du r<>pertoire personnel de l'utilisateur,
m<EFBFBD>moris<EFBFBD> par la variable <code>HOME</code>.
</p>
<h3>Les noms de variables</h3>
<p>
Par convention, les variables relevant du syst<73>me, comme
<code>HOME</code>, <code>USER</code> et beaucoup d'autres, sont en
majuscules, tandis que l'on recommande d'<27>crire en minuscules les
variables que l'on se cr<63>e soi-m<>me. On <20>vite ainsi la d<>sagr<67>able
surprise de remplacer une variable importante et de casser tout ou
partie de son syst<73>me.
</p>
<p>
Les noms de variables sont en effet sensibles <20> la casse<73>:
<code>USER</code>, <code>user</code>, <code>User</code>,
<code>uSeR</code> etc. sont des variables diff<66>rentes.
</p>
<h3>D<>finir une variable</h3>
<p>
La fa<66>on de donner une valeur <20> une variable varie selon le type de shell
utilis<EFBFBD><EFBFBD>:
</p>
<p>
<strong>C-Shell</strong> (<code>csh</code>, <code>tcsh</code>,
<code>lcsh</code>)<29>: on utilise la commande <code>setenv</code><3E>:
</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>)<29>: on utilise <code>export</code><3E>:
</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<65>:
<ul>
<li> pour <strong>d<>finir</strong> le contenu d'une variable, on
<EFBFBD>crit simplement son nom, <strong>sans le
signe<EFBFBD>$</strong><3E>;</li>
<li> tandis que pour <strong>utiliser</strong> le contenu d'une
variable, on fait pr<70>c<EFBFBD>der son nom du
<strong>signe<6E>$</strong>. </li>
</ul>
</div>
<h3>Les variables d'environnement</h3>
<p>
Les valeurs des variables sont accessibles aux commandes lanc<6E>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><3E>: L'<27>cran sur lequel les programmes<65>X
travaillent. Cette variable est souvent de la forme<6D>:
<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><3E>: pour les commandes d'impression. Contient le
nom de l'imprimante sur laquelle il faut envoyer vos fichiers. </li>
<li><code>EDITOR</code><3E>: utilis<69>e par <code>mutt</code>,
<code>forum</code>, et beaucoup d'autres commandes. Contient le nom de
votre <20>diteur de textes pr<70>f<EFBFBD>r<EFBFBD>. </li>
<li><code>VISUAL</code><3E>: la m<>me chose qu'<code>EDITOR</code>. </li>
<li><code>SHELL</code><3E>: contient le nom de votre shell. </li>
<li><code>HOME</code><3E>: contient le nom de votre r<>pertoire personnel.
</li>
<li><code>USER</code><3E>: contient votre nom de login. </li>
<li><code>LOGNAME</code><3E>: la m<>me chose que <code>USER</code>. </li>
<li><code>PATH</code><3E>: contient une liste de r<>pertoires dans lesquels
le shell va chercher les commandes.
</li>
</ul>
<p>
Exercice<EFBFBD>: 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 <20> l'ext<78>rieur
(avec <code>setenv</code> ou <code>export</code>), mais aussi d<>finir ses
variables locales propres au script. On donne une valeur <20> une variable avec
une commande de la forme
<code><em>nom-de-variable</em>=<em>valeur</em></code>. Les variables sont
utilis<EFBFBD>es pour stocker des informations.
</p>
<p>
On a aussi des variables sp<73>ciales, initialis<69>es automatiquement au
d<EFBFBD>but du script:
</p>
<table class="tableau">
<tr>
<td><code>$0</code></td>
<td>Le nom de la commande (i.e.<2E>: du script)</td>
</tr>
<tr>
<td><code>$1</code>, <code>$2</code>, etc.</td>
<td>Le premier, deuxi<78>me, etc, argument pass<73>s au script.</td>
</tr>
<tr>
<td><code>$*</code></td>
<td>La liste de tous les arguments pass<73>s au script.</td>
</tr>
<tr>
<td><code>$#</code></td>
<td>Le nombre d'arguments pass<73>s au script.</td>
</tr>
<tr>
<td><code>$?</code></td>
<td>Le code de retour de la derni<6E>re commande lanc<6E>e.</td>
</tr>
<tr>
<td><code>$!</code> </td>
<td>Le num<75>ro de process de la derni<6E>re commande lanc<6E>e en t<>che de fond.</td>
</tr>
<tr>
<td><code>$$</code></td>
<td>Le num<75>ro de process du shell lui-m<>me.</td>
</tr>
</table>
<div class="metainformation">
Bas<EFBFBD> sur un polycopi<70> de Roberto Di Cosmo, Xavier Leroy et Damien Doligez.
Modifications<EFBFBD>: Nicolas George, Baptiste M<>l<EFBFBD>s.
Derni<EFBFBD>re modification le <date value="$Date: 2007-07-17 10:03:44 $" />.
</div>
</body>
</html>