2005-09-07 12:03:49 +02:00
|
|
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
|
|
|
<!DOCTYPE html
|
|
|
|
|
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
|
|
|
|
|
"tuteurs://DTD/tml.dtd">
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Tests</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
<h1>Tests et calcul arithm<68>tique</h1>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<h2>Qu'est-ce qu'un test<73>?</h2>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
<strong>Un test est une op<6F>ration dont le but est d'<27>valuer la valeur
|
|
|
|
|
d'une expression</strong>. Cette expression peut <20>tre simplement
|
|
|
|
|
l'<em>existence</em> de quelque chose (par exemple, d'un fichier, ou
|
|
|
|
|
bien d'une variable), ou ce peut <20>tre une <em>proposition</em>.</p>
|
|
|
|
|
|
|
|
|
|
<p>Concr<63>tement, cela veut dire qu'<strong>un programme n'est pas limit<69>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<EFBFBD> la possibilit<69> de donner des ordres<65>: il peut aussi poser des
|
2005-09-07 12:03:49 +02:00
|
|
|
|
questions</strong>, et agir comme vous le d<>cidez en fonction des
|
|
|
|
|
r<EFBFBD>ponses apport<72>es aux questions.</p>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>Posons par exemple le principe suivant<6E>: <20><>Si Dieu n'existe
|
|
|
|
|
pas, alors tout est permis.<2E><> Nous allons ensuite tester si Dieu
|
2005-09-07 12:03:49 +02:00
|
|
|
|
existe, et s'il n'existe pas, nous saurons que tout est permis. Autre
|
2007-07-17 12:01:59 +02:00
|
|
|
|
exemple<EFBFBD>: posons que <20><>si le train passe sous le tunnel avant
|
|
|
|
|
que j'aie compt<70> jusqu'<27> dix, alors Manek est vivant.<2E><> Je vais
|
2005-09-07 12:03:49 +02:00
|
|
|
|
donc tester si le train passe sous le tunnel avant que j'aie compt<70>
|
|
|
|
|
jusqu'<27> dix, et si c'est le cas, alors c'est que Manek est vivant. C'est
|
|
|
|
|
aussi simple que cela.</p>
|
|
|
|
|
|
|
|
|
|
<h3>Une condition</h3>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>Le shell propose deux principales fa<66>ons de r<>aliser un test<73>;
|
|
|
|
|
ces deux m<>thodes sont <20>quivalentes<65>:</p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li> <code>test <em>expression</em></code></li>
|
|
|
|
|
<li> <code>[ <em>expression</em> ]</code></li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<p>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
Les deux commandes suivantes reviennent donc au m<>me<6D>:</p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<pre>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<span class="prompt">clipper ~ $</span><3E><strong>test -f foo</strong> || echo "Le fichier foo n'existe pas."
|
2005-09-07 12:03:49 +02:00
|
|
|
|
Le fichier foo n'existe pas.
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<span class="prompt">clipper ~ $</span><3E><strong>[ -f foo ]</strong> || echo "Le fichier foo n'existe pas."
|
2005-09-07 12:03:49 +02:00
|
|
|
|
Le fichier foo n'existe pas.
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h3>Code de retour d'un test</h3>
|
|
|
|
|
<p>Un test renvoie un <em>code de retour</em>. <strong>Un code de retour
|
2007-07-17 12:01:59 +02:00
|
|
|
|
est un nombre (0 ou<6F>autre), qui correspond <20> une r<>ponse de
|
|
|
|
|
type <20><>vrai<61><69> ou <20><>faux<75><78></strong>. C'est ce code de
|
2005-09-07 12:03:49 +02:00
|
|
|
|
retour qui permet la manipulation des tests dans des structures de
|
|
|
|
|
contr<EFBFBD>le comme <code>if</code>, etc. </p>
|
|
|
|
|
|
2005-09-07 23:19:24 +02:00
|
|
|
|
<p>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
Le code de retour<75>0 correspond <20> la r<>ponse
|
|
|
|
|
<EFBFBD><EFBFBD>vrai<EFBFBD><EFBFBD>. Pour r<>pondre <20><>faux<75><78>, le programme
|
|
|
|
|
r<EFBFBD>pond... autre chose (ce peut <20>tre<72>1, 2, -1 ou autre).
|
2005-09-07 23:19:24 +02:00
|
|
|
|
</p>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>Par exemple, un pilote de Formule<6C>1 utilise le programme
|
|
|
|
|
suivant<EFBFBD>:</p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
while [[ "$couleur_du_feu" != "vert" ]]
|
|
|
|
|
do attendre
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
d<EFBFBD>marrer_en_trombe
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h2>Les op<6F>rateurs</h2>
|
|
|
|
|
|
|
|
|
|
<h3>Op<4F>rateurs logiques</h3>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<h4>Non<6F>: l'op<6F>rateur <20><><code>!</code><3E><></h4>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p><strong>L'op<6F>rateur logique <20><>non<6F><6E> inverse le code de
|
2005-09-07 12:03:49 +02:00
|
|
|
|
retour d'une commande</strong>, c'est-<2D>-dire renvoie vrai si elle
|
|
|
|
|
renvoie faux, et vice versa. </p>
|
|
|
|
|
|
|
|
|
|
<p>On utilise cet op<6F>rateur en pr<70>c<EFBFBD>dant une condition d'un point
|
2007-07-17 12:01:59 +02:00
|
|
|
|
d'exclamation (<28><>!<21><>). </p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h5>Comparaison de plusieurs combinaisons d'op<6F>rateurs</h5>
|
|
|
|
|
|
|
|
|
|
<p>Pour illustrer l'usage de cet op<6F>rateur, voici quatre cas de figure
|
2007-07-17 12:01:59 +02:00
|
|
|
|
diff<EFBFBD>rents<EFBFBD>:</p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
# Premier cas
|
|
|
|
|
[ <strong>-f</strong> foo ] <strong>&&</strong> echo "Le fichier foo existe."
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p class="continue">Dans l'exemple pr<70>c<EFBFBD>dent, le shell teste si le
|
|
|
|
|
fichier <code>foo</code> existe. Comme il n'existe pas, le code de
|
2007-07-17 12:01:59 +02:00
|
|
|
|
retour de ce test est<73>0. Or, l'op<6F>rateur <20><>&&<3B><>
|
|
|
|
|
n'ex<65>cute ce qui suit que si le code de retour est<73>1. Comme ce
|
2005-09-07 12:03:49 +02:00
|
|
|
|
n'est pas le cas, les commandes ne sont pas ex<65>cut<75>es.</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
# Deuxi<78>me cas
|
|
|
|
|
[ <strong>-f</strong> foo ] <strong>||</strong> echo "Le fichier foo n'existe pas."
|
|
|
|
|
Le fichier foo n'existe pas.
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p class="continue">Dans cet exemple, l'op<6F>rateur n'est plus
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<EFBFBD><EFBFBD>&&<3B><> mais <20><>||<7C><>. Les commandes ne
|
|
|
|
|
s'ex<65>cutent que si le code de retour vaut 0<>; comme c'est le cas,
|
2005-09-07 12:03:49 +02:00
|
|
|
|
elles sont ex<65>cut<75>es.</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
# Troisi<73>me cas
|
2005-09-08 01:00:03 +02:00
|
|
|
|
[ <strong>! -f</strong> foo ] <strong>&&</strong> echo "Le fichier foo n'existe pas."
|
2005-09-07 12:03:49 +02:00
|
|
|
|
Le fichier foo n'existe pas.
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p class="continue">Ici, l'op<6F>rateur est de nouveau
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<EFBFBD><EFBFBD>&&<3B><><EFBFBD>; mais contrairement aux deux exemples
|
|
|
|
|
pr<EFBFBD>c<EFBFBD>dents, le test n'est plus <code>[<5B>-f<>foo<6F>]</code>
|
|
|
|
|
mais <code>[<5B>!<21>-f<>foo<6F>]</code>. Par cons<6E>quent, le
|
|
|
|
|
code de retour est<73>1, et les commandes sont ex<65>cut<75>es.</p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
# Quatri<72>me cas
|
2005-09-08 01:00:03 +02:00
|
|
|
|
[ <strong>! -f</strong> foo ] <strong>||</strong> echo "Le fichier foo existe."
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p class="continue">Voici la derni<6E>re combinaison possible. Le code de
|
2007-07-17 12:01:59 +02:00
|
|
|
|
retour est<73>1, mais il fallait<69>0 pour que les commandes soient
|
2005-09-07 12:03:49 +02:00
|
|
|
|
ex<EFBFBD>cut<EFBFBD>es. </p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>Ces quatre exemples correspondent aux <20>nonc<6E>s suivants<74>:</p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li> <em>s'il est vrai que <code>foo</code> existe</em>, alors il faut
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<EFBFBD>crire<EFBFBD>: <20><>Le fichier foo existe.<2E><>.</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<li> <em>s'il n'est pas vrai que <code>foo</code> existe</em>, alors il
|
2007-07-17 12:01:59 +02:00
|
|
|
|
faut <20>crire<72>: <20><>Le fichier foo n'existe pas.<2E><>.</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<li> <em>s'il est vrai que <code>foo</code> n'existe pas</em>, alors il
|
2007-07-17 12:01:59 +02:00
|
|
|
|
faut <20>crire<72>: <20><>Le fichier foo n'existe pas.<2E><>.</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<li> <em>s'il n'est pas vrai que <code>foo</code> n'existe pas</em>,
|
2007-07-17 12:01:59 +02:00
|
|
|
|
alors il faut <20>crire<72>: <20><>Le fichier foo existe.<2E><>.</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h5>Reformulation avec <code>if</code></h5>
|
|
|
|
|
|
|
|
|
|
<p>Dans un script, outre la formulation pr<70>c<EFBFBD>dente, on pourra
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<EFBFBD>crire<EFBFBD>:</p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
# Premier cas
|
|
|
|
|
if [ -f foo ]
|
|
|
|
|
then echo "Le fichier foo existe."
|
|
|
|
|
else continue
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Deuxi<78>me cas
|
|
|
|
|
if [ -f foo ]
|
|
|
|
|
then continue
|
|
|
|
|
else echo "Le fichier foo n'existe pas."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Troisi<73>me cas
|
|
|
|
|
if [ ! -f foo ]
|
|
|
|
|
then echo "Le fichier foo n'existe pas."
|
|
|
|
|
else continue
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Quatri<72>me cas
|
|
|
|
|
if [ ! -f foo ]
|
|
|
|
|
then continue
|
|
|
|
|
else echo "Le fichier foo existe."
|
|
|
|
|
fi
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<h4>Et<45>: l'op<6F>rateur <20><><code>-a</code><3E><></h4>
|
|
|
|
|
<p>L'op<6F>rateur <20><>et<65><74> renvoie<69>1 (vrai) si et seulement si
|
|
|
|
|
les diff<66>rentes conditions sont toutes r<>alis<69>es<65>; si au moins
|
|
|
|
|
l'une d'entre elles ne l'est pas, le code de retour est<73>0
|
|
|
|
|
(faux). On note cet op<6F>rateur en ins<6E>rant <20><>-a<><61> entre les
|
|
|
|
|
diff<EFBFBD>rentes conditions. Exemples<65>: </p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
touch foo # donc foo existe
|
|
|
|
|
rm bar # donc bar n'existe pas
|
|
|
|
|
|
|
|
|
|
# [ -f foo ] = vrai si le fichier foo existe
|
|
|
|
|
# [ ! -f bar ] = vrai si bar n'existe pas
|
|
|
|
|
|
|
|
|
|
# <20> n'ex<65>cuter que si foo existe ET que bar n'existe pas.
|
|
|
|
|
[ -f foo <strong>-a</strong> ! -f bar ] &&
|
|
|
|
|
mv foo bar
|
|
|
|
|
</pre>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p class="continue">Autres formulations possibles<65>:
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
test -f foo -a ! -f bar
|
|
|
|
|
[ -f foo ] -a [ ! -f bar ]
|
|
|
|
|
[[ -f foo && ! -f bar ]]
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p><strong>Si vous d<>butez, vous n'<27>tes pas tenu de retenir par
|
|
|
|
|
cœur toutes les combinaisons possibles. Sachez simplement les
|
2007-07-17 12:01:59 +02:00
|
|
|
|
reconna<EFBFBD>tre</strong> si vous les lisez quelque part<72>; et pour vos
|
2005-09-07 12:03:49 +02:00
|
|
|
|
propres scripts, vous il vous suffit de savoir bien manipuler la syntaxe
|
|
|
|
|
qui vous para<72>t la plus lisible.</p>
|
|
|
|
|
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<h4>Ou<4F>: l'op<6F>rateur <20><><code>-o</code><3E><></h4>
|
|
|
|
|
<p>Pour r<>aliser la condition de l'op<6F>rateur <20><>ou<6F><75>, il suffit
|
|
|
|
|
qu'une seule des conditions qu'il rassemble soit vraie<69>: </p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li> si <em>toutes</em> les conditions sont rassembl<62>es, la condition
|
2007-07-17 12:01:59 +02:00
|
|
|
|
d'ensemble l'est aussi<73>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<li> si <em>une partie seulement</em> de ces conditions est rassembl<62>e,
|
2007-07-17 12:01:59 +02:00
|
|
|
|
la condition d'ensemble l'est aussi<73>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<li> si <em>aucune</em> des conditions incluses n'est remplie, la
|
|
|
|
|
condition d'ensemble ne l'est pas non plus.</li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>Exemple<6C>:</p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
if [[ "$fichier" == "fichier_interdit" -o ! -f "$fichier" ]]
|
|
|
|
|
then echo "Je ne veux pas lire $fichier ou bien il n'existe pas."
|
|
|
|
|
fi
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li> si <code>$fichier</code> vaut
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<code>"fichier_interdit"</code>, il n'est pas lu<6C>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> si <code>$fichier</code> n'existe pas, il n'est pas lu<6C>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<li> si <code>$fichier</code> vaut
|
|
|
|
|
<code>"fichier_interdit"</code> et qu'en plus il n'existe pas,
|
2007-07-17 12:01:59 +02:00
|
|
|
|
il n'est pas lu<6C>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<li> si <code>$fichier</code> ne vaut pas
|
|
|
|
|
<code>"fichier_interdit"</code> et qu'il existe bien, il est
|
|
|
|
|
lu.</li> </ul>
|
|
|
|
|
|
|
|
|
|
<h3>Op<4F>rateurs arithm<68>tiques</h3>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Le shell permet d'op<6F>rer des calculs arithm<68>tiques, m<>me s'il est moins
|
|
|
|
|
puissant que d'autres langages (Perl, Scheme, C, etc.) pour cela.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
Les op<6F>rateurs sont les suivants<74>:
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-eq</code> (<i>equal</i>)<29>: <20><><EFBFBD>gal ࠻ (signe
|
|
|
|
|
<EFBFBD><EFBFBD>=<3D><>)<29>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-ne</code> (<i>not equal</i>)<29>: <20><>diff<66>rent
|
|
|
|
|
de<EFBFBD><EFBFBD> (signe <20><>≠<3B><>)<29>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-gt</code> (<i>greater than</i>)<29>: <20><>strictement
|
|
|
|
|
sup<EFBFBD>rieur ࠻ (signe <20><>><3B><>)<29>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-lt</code> (<i>lesser than</i>)<29>: <20><>strictement
|
|
|
|
|
inf<EFBFBD>rieur ࠻ (signe <20><><<3B><>)<29>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-ge</code> (<i>greater or equal</i>)<29>: <20><>sup<75>rieur
|
|
|
|
|
ou <20>gal ࠻ (signe <20><>≥<3B><>)<29>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-le</code> (<i>lesser or equal</i>)<29>: <20><>inf<6E>rieur
|
|
|
|
|
ou <20>gal ࠻ (signe <20><>≤<3B><>)<29>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
On utilise ces op<6F>rateurs entre deux nombres ou variables
|
2007-07-17 12:01:59 +02:00
|
|
|
|
num<EFBFBD>riques. Par exemple<6C>:
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
#!/bin/sh
|
|
|
|
|
if test 2 -lt 3
|
|
|
|
|
then echo "C'est normal."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if test 2 -gt 3
|
|
|
|
|
then echo "C'est absurde."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
petit=2
|
|
|
|
|
grand=3
|
|
|
|
|
|
|
|
|
|
if test $petit -ne 3
|
|
|
|
|
then echo "C'est normal."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if test 2 -eq $grand
|
|
|
|
|
then echo "C'est absurde."
|
|
|
|
|
fi
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p class="continue">
|
2007-07-17 12:01:59 +02:00
|
|
|
|
Si vous ex<65>cutez ce programme, vous obtenez<65>:
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
C'est normal.
|
|
|
|
|
C'est normal.
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h3>Op<4F>rateurs sur les fichiers</h3>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
Une grande partie de la puissance du shell se d<>ploie dans sa facult<6C> de
|
|
|
|
|
manipuler des fichiers.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
Les principaux op<6F>rateurs disponibles sont<6E>:
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> nature du fichier<65>:
|
2005-09-07 12:03:49 +02:00
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-e</code> (<i>exists</i>)<29>: v<>rifie l'existence d'un
|
|
|
|
|
fichier<EFBFBD>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-f</code> (<i>file</i>)<29>: v<>rifie l'existence d'un
|
2005-09-07 12:03:49 +02:00
|
|
|
|
fichier, et le fait qu'il s'agisse bien d'un fichier au sens
|
2007-07-17 12:01:59 +02:00
|
|
|
|
strict<EFBFBD>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-d</code> (<i>directory</i>)<29>: v<>rifie l'existence d'un
|
|
|
|
|
r<EFBFBD>pertoire<EFBFBD>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-L</code> (<i>link</i>)<29>: v<>rifie si le fichier est un
|
|
|
|
|
lien symbolique<75>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
</ul></li>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li>attributs du fichier<65>:
|
2005-09-07 12:03:49 +02:00
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-s</code> (<i>size</i>)<29>: v<>rifie qu'un fichier n'est
|
|
|
|
|
pas vide<64>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</ul></li>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li>droits sur le fichier<65>:
|
2005-09-07 12:03:49 +02:00
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-r</code> (<i>readable</i>)<29>: v<>rifie si un fichier peut
|
|
|
|
|
<EFBFBD>tre lu<6C>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-w</code> (<i>writable</i>)<29>: v<>rifie si un fichier peut
|
|
|
|
|
<EFBFBD>tre <20>crit ou modifi<66><69>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-x</code> (<i>writable</i>)<29>: v<>rifie si un fichier peut
|
|
|
|
|
<EFBFBD>tre ex<65>cut<75><74>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</ul></li>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li>comparaison de fichiers<72>:
|
2005-09-07 12:03:49 +02:00
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-nt</code> (<i>newer than</i>)<29>: v<>rifie si un fichier
|
|
|
|
|
est plus r<>cent qu'un autre<72>;</li>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code>-ot</code> (<i>older than</i>)<29>: v<>rifie si un fichier
|
2005-09-07 12:03:49 +02:00
|
|
|
|
est plus ancien qu'un autre.</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>Exemple<6C>:</p>
|
2005-09-07 12:03:49 +02:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
|
|
if test -e ~/.emacs
|
|
|
|
|
then echo "~/.emacs existe."
|
|
|
|
|
else echo "~/.emacs n'existe pas."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if test -d ~/.emacs
|
|
|
|
|
then echo "~/.emacs est un r<>pertoire."
|
|
|
|
|
else echo "~/.emacs n'est pas un r<>pertoire."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if test -f ~/.emacs
|
|
|
|
|
then echo "~/.emacs est un fichier."
|
|
|
|
|
else echo "~/.emacs n'est pas un fichier."
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if test ~/.vimrc -nt ~/.emacs
|
|
|
|
|
then "~/.vimrc est plus r<>cent que ~/.emacs."
|
|
|
|
|
fi
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="metainformation">
|
2007-07-17 12:01:59 +02:00
|
|
|
|
Auteur<EFBFBD>: Baptiste M<>l<EFBFBD>s.
|
|
|
|
|
Derni<EFBFBD>re modification le <date value="$Date: 2007-07-17 10:03:44 $" />.
|
2005-09-07 12:03:49 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|