Projet

Général

Profil

Petit precis de shell » Historique » Version 59

Florent Torregrosa, 02/08/2014 21:41
fix typo

1 30 Julien Enselme
Le shell est un langage assez particulier qu'on ne connait pas forcément en arrivant à centrale et qu'on a pas forcément l'occasion de beaucoup pratiquer. Le but de ce document est de rappeler les quelques bases du langage, de rappeller les différences notables avec bash et de fournir quelques [[Shell secours|solutions standard]] à des problèmes courants afin que le nouveau membre du club Drupal ne soit pas désemparé et puisse comprendre les scripts. Il ne se veut en aucun cas un cours/tuto complet et exhaustif. Des bases de shell et d'un autre langage de programation peut s'avérer utile. "Voir le site du zéros":http://www.siteduzero.com/informatique/tutoriels/reprenez-le-controle-a-l-aide-de-linux pour un tuto orienté vers les débutants.
2 14 Julien Enselme
3 49 Julien Enselme
{{>toc}}
4 1 Julien Enselme
5 3 Julien Enselme
h1. Quelques rappels d'Unix
6
7
Le langage shell est le langage de script qui vient par défaut avec _tous_ les Unix. En effet, même si désormais d'autres interpréteurs plus modernes sont désormais répandus (bash, csh, zsh, etc.), ils ont tous conservé la compatibilité avec le shell.
8
9
Comme pour la plupart des langages de script, il existe deux façons d'exécuter des instructions shell :
10
11
* directement dans l'interpréteur
12
* dans un script shell
13
14 31 Julien Enselme
Pour lancer un interpréteur shell, rien de plus simple : lancer un terminal (graphique ou tty). Et oui, le shell comprend toutes les commandes Unix que vous avez vues en début d'année (pwd, cd, cp). Vous pouvez donc les réutiliser _telles quelles_ dans vos scripts et utiliser un simple terminal pour faire des boucles, des conditions et j'en passe.
15 3 Julien Enselme
16 1 Julien Enselme
h1. Les bases du shell
17 3 Julien Enselme
18 4 Julien Enselme
Il est très important de comprendre et de garder à l'esprit qu'en shell tout est :
19
20
* chaîne de caractères (y compris les nombres) ! Entrez @echo 1 + 1@ dans le terminal pour vous en convaincre.
21
* commande et que donc elles peuvent prendre des arguments (cela s'éclaircira plus tard)
22
23
h2. Syntaxe de base
24
25
Les commandes s'écrivent soit :
26
27 6 Florent Torregrosa
* les unes à la suite des autres séparées par ; (peu recommandé)
28 4 Julien Enselme
* séparées les unes des autres par un saut de ligne
29
30 32 Julien Enselme
Chaque commande peut prendre des options (qui modifient la façon dont la commande se comporte : affiche de l'aide, beaucoup d'information, etc.) de deux types :
31 4 Julien Enselme
32 32 Julien Enselme
* les options courtes (l, r, h pour @ls@ par exemple) qui sont passés comme suit : @CMD -ARG@
33
* les options longues (recursive pour @rsync@ par exemple) qui se passent comme ceci : @CMD --ARGUMENT@
34 4 Julien Enselme
35 32 Julien Enselme
Il est évidement possible de passer plusieurs options à une même commande.
36 1 Julien Enselme
37 32 Julien Enselme
{{tip(Certains paramètres existent sous une forme courte et une forme longue. Consulter le manuel de la commande pour plus de détails. Le manuel contient également la liste complète des arguments supportés par une commande.)}}
38 1 Julien Enselme
39
{{note(Certains commandes ne respectent pas la convention énoncée ce-dessus. Leurs arguments long se passent avec un seul - (find en est un exemple))}}
40 32 Julien Enselme
41
Les commandes peuvent aussi prendre des arguments qui permettent de savoir comment s'exécuter. Ils se placent après les paramètres.
42
43
Exemple : @ls -R ~/Documents@. Par défaut, @ls@ ne liste que les fichiers et dossiers dans le dossier courant. L'option @-R@ permet de descendre dans tous les dossiers. L'argument "~/Documents" permet d'exécuter la commande dans le dossier ~/Documents sans s'y déplacer.
44
45
{{tip(Pensez à la commande man qui prend comme argument une autre commande et affiche son manuel)}}
46 4 Julien Enselme
47 33 Julien Enselme
h2. Valeurs de retour des commandes et exceptions
48 5 Julien Enselme
49 43 Julien Enselme
Une fois qu'une commande s'est exécutée, elle renvoie une valeur de retour afin "d'informer" l'utilisateur. Cette valeur permet en effet de savoir si la commande s'est exécutée correctement. Voici les valeurs de retour courantes possibles et leur signification :
50 5 Julien Enselme
51
* 0 : tout va bien
52
* 1 : erreur
53
* 2 : erreur grave
54
55 6 Florent Torregrosa
Vous pouvez vous aussi utiliser ces valeurs de retour. Par défaut, un script qui se complète correctement retourne 0. Mais vous pouvez (par exemple si un utilisateur tente d'exécuter un script qui nécessite un argument sans) retourner un autre code d'erreur avec la commande @exit@. Il suffit de lui passer le code qu'elle doit retourner. Votre script s'arrêtera alors avec le code d'erreur spécifié.
56 5 Julien Enselme
57 46 Julien Enselme
Vous pouvez connaître la valeur de retour de la dernière commande exécutée avec la variable @$?@.
58
59 13 Julien Enselme
h2. Exécuter une commande
60
61
S’il est facile dans les cas simples d’exécuter une commande, dès lors qu’en shell tout est chaîne de caractères, si vous voulez affecter la sortie d’une commande à une variable, vous ne pouvez pas simplement faire @var=CMD@ car var va alors valoir la chaîne CMD.
62
63
Pour obtenir le résultat souhaité vous devez placer CMS entre backquote `` ou entre $(…). Par exemple : @var=`ls`@ ou @var=$(ls)@.
64
65
La syntaxe `` serait plus ancienne et supportée partout. La syntaxe $(…) serait plus récente et présente l’avantage de pouvoir imbriquer les commandes sans ambiguïté.
66
67 4 Julien Enselme
h2. Conditions et itérations
68 7 Julien Enselme
69 11 Julien Enselme
h3. Conditions if … else …
70 7 Julien Enselme
71
La structure générale d'une condition est la suivante :
72
73
<pre>
74
<code>
75
if QQC
76
then
77
    CMDS
78
else
79
    CMDS
80
fi
81
</code>
82
</pre>
83
84 44 Julien Enselme
Le @else@ est facultatif. Il est aussi possible de regrouper @if@ et @then@ en une seule ligne comme ceci : @if QQC ; then@. On peut également utiliser des @elif@.
85 7 Julien Enselme
86
La question que vous devriez avoir est que mettre à la place de @QQC@. Il y a deux possibilités :
87
88
* la fonction @test@
89
* une commande
90
91 11 Julien Enselme
h4. La fonction test
92 7 Julien Enselme
93
{{important(Dans toute la suite, il faudra faire très *attention aux espaces*)}}
94
95 34 Julien Enselme
La fonction @test@ s'utilise en général comme suit : @if [ ARGS ]@ *Notez les espaces !*
96 7 Julien Enselme
97
*IMPORTANT* : La syntaxe *@if [[ ARGS ]]@* n'est valide qu'avec *bash*. Voir [[Petit_precis_de_shell#Différences notables avec bash|Différences notables avec bash]]
98
99 34 Julien Enselme
Pour faire un test, il suffit ensuite de passer les bons arguments à la commande. Par exemple, pour tester si une chaîne est vide : @if [ -z $chaine ]@. Si l’argument a besoin de deux paramètres pour fonctionner, mettre un paramètre de chaque côté de celui-ci. Par exemple, pour faire un test d’égalité de chaîne de caractères : @CHAINE1 = CHAINE2@.
100 10 Julien Enselme
101
On peut aussi combiner les arguments avec des ET et des OU avec les options @-a@ et @-o@. Le caractère "!" permet de faire une négation.
102
103 41 Julien Enselme
{{tip(On peut également faire des ET avec && et des OU avec ||. Ces opérateurs ne sont pas spécifiques à la fonction test, ils font parti du langage. Il est donc tout à fait possible de les utiliser [[Petit_precis_de_shell#ET-et-OU-dans-le-langage|sans la fonction test]].)}}
104
105 10 Julien Enselme
Voir ci-dessous pour la liste complète.
106
107
{{important(En shell, tout est chaîne de caractère. Bien faire attention au type que l’on veut tester (chaîne ou nombre))}}
108
109 21 Julien Enselme
*Tests sur les chaînes de caractères*
110
111 10 Julien Enselme
|_. Argument |_. Signification |
112
| = | égalité |
113 1 Julien Enselme
| -z | chaîne vide |
114
| -n | chaîne non vide |
115 21 Julien Enselme
116 47 Julien Enselme
{{Important(Lors des tests de chaîne de caractères, entourez la variable de guillemets. Sinon, si la chaîne est vide, le test ne pourra être effectué)}}
117
118 21 Julien Enselme
*Tests sur les nombres*
119
120 10 Julien Enselme
|_. Argument |_. Signification |
121
| -eq | égalité |
122 34 Julien Enselme
| -ne | différent |
123 10 Julien Enselme
| -lt | strictement plus petit |
124
| -gt | strictement plus grand |
125
| -ge | plus grand ou égal |
126
| -le | plus petit ou égal |
127
128 7 Julien Enselme
h4. Test avec une commande
129 1 Julien Enselme
130 35 Julien Enselme
Comme indiqué précédemment, une commande qui s’exécute correctement est considérée comme vraie. Ainsi, il est tout a fait possible, par exemple, pour savoir si on arrive à se connecter à un serveur mysql de faire simplement : @if mysql -h HOST -u asso -pTATA@.
131 10 Julien Enselme
132
{{tip(Parfois vous pourrez rencontrer des problèmes. Pensez alors à donner cette commande en argument à la fonction test)}}
133 7 Julien Enselme
134 54 Julien Enselme
{{tip(Le shell contient deux fonctions utiles: _true_ et _false_. La première renvoie toujours 0 et la seconde toujours 1. Vous pouvez les trouver utiles si vous avez besoin de manipuler des booléens.)}}
135
136 12 Julien Enselme
h3. Boucles while/until
137
138
La structure générale est la suivante :
139
<pre>
140
while QQC
141
do
142
    CMD
143
done
144
</pre>
145
146
Il est possible de regrouper @while QQC@ et le @do@ en @while QQC ; do@. Le QQC peut être remplacer par exactement les mêmes choses que pour la condition. Se référer à cette section pour les précisions.
147
148
Le shell propose également le mot clé @until QQC@ qui fait une action jusqu’à ce que QQC soit réalisé.
149
150
h3. Boucle for
151
152
L’utilisation de la boucle for en shell ressemble à celle de python. La structure générale est la suivante :
153
<pre>
154
for var in `CMD`
155
do
156
   CMD
157
done
158
</pre>
159
160
La variable _var_ va alors prendre une à une les valeurs données par CMD. Par exemple, @for file in `ls`@ la variable var va prendre tour à tour le nom de tous les fichiers et dossiers donnés par la commande @ls@.
161
162 23 Julien Enselme
Vous pouvez également utiliser for pour boucler d’un nombre à un autre avec la syntaxe : @for i in `seq [first [incr]] last`@
163 16 Julien Enselme
164 18 Julien Enselme
h1. Paramètres de scripts
165
166
h2. Généralités
167
168
Un script peut prendre des paramètres qui ont le même but que les arguments d'une fonction : lui passer des informations. Un paramètre peut être :
169
170
* une variable
171
* une chaîne de caractère (donc un nombre, en shell on ne fait pas la distinction). Si la chaîne à passer en paramètre contient plusieurs mots séparés par des espaces, ne pas oublier de la mettre entre ' ou ".
172
173 36 Julien Enselme
{{tip(Si une varaible coucou contient la chaîne 'salut', alors '$coucou toi' sera compris _$coucou toi_ tandis que "$coucou toi" sera interprétée en _salut toi_)}}
174 18 Julien Enselme
175
Les paramètres se passent à un script comme ceux d'une commande. Ils sont ensuite disponibles dans l'ordre avec des numéros :
176
177
* le premier : $1
178
* le deuxième : $2
179
* et ainsi de suite
180
181
{{important(Le shell ne supporte *que* 9 paramètres)}}
182
183
h2. Les paramètres spéciaux
184
185
* $0 : contient le nom du script
186
* $# : contient le nombre d'arguments passés au script
187 36 Julien Enselme
{{important(Le paramète $0 est toujours passé au script. $# est donc toujours supérieur ou égal à 1)}}
188 18 Julien Enselme
* $? : le code de retour de la dernière commande invoquée
189
* $$ : le PID du shell qui exécute le script
190 1 Julien Enselme
* $! : le PID du dernier processus lancé en arrière plan
191 25 Julien Enselme
* $* : l'ensemble des paramètres en un seul argument
192
* $@ : L'ensemble des arguments, un argument par paramètre
193
194 36 Julien Enselme
Pour bien voir la différence entre $* et $@, il suffit de regarder la sortie du script suivant : 
195 25 Julien Enselme
<pre>
196
<code class="bash">
197
echo 'Avec $*'
198
for param in "$*" ; do
199
  echo $param
200
done
201
202
echo 'Avec $@'
203
for param in "$@" ; do
204
  echo $param
205
done
206
</code>
207
</pre>
208 18 Julien Enselme
209
h2. Les commandes shift et set
210
211
La commande @set@ permet d'affecter les paramètres. Ainsi @set bonjour salut bonsoir@ va initialiser $1 à bonjour, $2 à salut et $3 à bonsoir. Les paramètres spéciaux $#, $* et $@ sont mis à jour.
212
213 36 Julien Enselme
La commande @shift@ permet de décaler les variables. Ainsi, si après @shift@ $1 prend la valeur de $2 et ainsi de suite. @shift n@ décale les arguments de n.
214 18 Julien Enselme
215 17 Julien Enselme
h1. Les fonctions
216
217
Il est tout à fait possible de définir en shell des fonctions que ce soit dans un script ou un terminal. La syntaxe est la même.
218
219
<pre>
220 39 Julien Enselme
nom_de_la-fonction () {
221 17 Julien Enselme
  CMDS
222
}
223
</pre>
224 1 Julien Enselme
225 39 Julien Enselme
ou encore
226
227
<pre>
228
function nom_de_la-fonction {
229
  CMDS
230
}
231
</pre>
232
233 1 Julien Enselme
Les fonctions ainsi créées s'utilisent comme les commandes classiques et leurs arguments se manipulent exactement comme ceux d'un script. Voir [[Petit_precis_de_shell##Paramètres-de-scripts|la section dédiée]]. Il faut néanmoins faire attention à deux points :
234 17 Julien Enselme
235 39 Julien Enselme
* la portée des variables
236 17 Julien Enselme
* la valeur de retour
237
238 39 Julien Enselme
Par défaut, les variables définies dans la fonction resteront accessibles une fois la fonction exécutée. De même les varables définies auparavant restent acessibles dans la fonction. *Ces varaibles sont donc globales par défaut.* Pour qu'une variable soit locale, il faut utiliser le mot clé @local@ lors de sa définition. Par exemple : @local nom=clubdrupal@ (NB : local est une commande qui peut prendre des options).
239 17 Julien Enselme
240 37 Julien Enselme
Pour qu'une fonction en bash retourne une valeur comme vous pouvez en avoir l'habitude dans d'autres langages, il faut utiliser la commande @echo@. En effet, il n'existe pas d'instruction @return@ puisque par défaut les variables sont globales. Il faut alors faire très attention. Par exemple avec la fonction suivante :
241 17 Julien Enselme
242
<pre>
243
<code class="bash">
244
x_files () {
245
  top_secret=`dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" "`
246
  echo $top_secret
247 8 Julien Enselme
}
248
</code>
249
</pre>
250 9 Julien Enselme
251
* Si on fait @x_files@ on affiche à l'écran le contenu de @$top_secret@
252
* Si on fait @passwd=`x_files`@ on affecte à la variable @$passwd@ le contenu de @$top_secret@
253
254
h1. Les redirections de flux
255 1 Julien Enselme
256 26 Julien Enselme
h2. Les flux sortant
257
258 19 Julien Enselme
Les flux représentent les sorties générées par les commandes. Par défaut, il existe deux flux :
259
260
* Le flux standard
261
* Le flux d'erreur
262
263
Par défaut, il s'affiche sur la sortie standard (votre écran pour être bref). Il peut s'avérer intéressant d'envoyer ces flux ailleurs (logs, le néant, etc.). Pour cela, on va les rediriger. Par exemple pour rediriger la sortie de @ls@ dans un fichier nommé toto, on fait :
264
265
* @ls > toto@
266
* *ou*
267
* @ls >> toto@
268
269
La première solution efface le contenu du fichier puis écrit dedans. La seconde ajoute la sortie à la fin du fichier. On a ici redirigé le flux standard. Pour rediriger les flux d'erreurs, on utilise les symboles @2>@ ou @2>>@. On peut évidemment combiner les deux : @ls -R / > mes_fichiers.txt 2> errors.log@ avec toutes les variantes possibles.
270
271
Pour rediriger l'erreur au même endroit que l'entrée, on peut faire @ls > toto 2> toto@ ou plus simplement @ls > toto 2>&1@.
272
273
Pour rediriger une sortie vers le néant, on l'envoie dans /dev/null.
274 26 Julien Enselme
275
h2. Les flux entrant
276
277
Il est également possible de passer en paramètre le contenu d’un fichier. Pour cela, on utilise le symbole <.
278 9 Julien Enselme
279 8 Julien Enselme
h1. Importer une configuration
280
281 22 Julien Enselme
Il est tout à fait possible d'écrire un fichier de configuration contenant les variables et les fonctions indispensables à d'autres scripts et les réutliser facilement dans ceux-ci. Pour cela, respecter la syntaxe shell dans le fichier puis au début du script qui en a besoin, placer la ligne : @. config-file.sh@ pour l'importer.
282 8 Julien Enselme
283
h1. Mode debug
284 1 Julien Enselme
285
Lorsqu’un de vos scripts shell bug il peut être difficile de savoir d’où vient le problème. Heureusement, le shell propose un mode débug qui vous dit pour chaque ligne comment elle est exécuté, avec quels paramètres (les variables sont remplacées par leur contenu).
286
287
Il suffit de faire : @sh -x SCRIPT@
288
289 55 Julien Enselme
h1. Parser des arguments
290
291 59 Florent Torregrosa
Il existe deux commandes pour parser des arguments en shell : @getopts@, qui est une commande "builtin" qui ne supporte que les options courtes  et @getopt@, qui est une commande à part, pas forcément présente mais qui supporte les arguments courts et longs. Nous n'étudierons ici que getopts qui a l'avantage d'être présent partout.
292 55 Julien Enselme
293
La commande s'utilise comme suit :
294
<pre>
295
<code class="php">
296
while getopts "options" opt; do
297
  case "$opt" in
298
    option1) action;;
299
  esac
300
done
301
</code>
302
</pre>
303
304
Ainsi, pour utiliser l'option @-o@ :
305
<pre>
306
<code class="php">
307
while getopts "o" opt; do
308
  case "$opt" in
309
    o) echo $opt;;
310
  esac
311
done
312
</code>
313
</pre>
314
315
@script -o@ affera : @o@. Si on le lance avec l'option -a, il affichera :
316
<pre>
317
illegal option -- a
318
</pre>
319
320
{{tip(Il est possible d'utiliser getopts en mode erreurs silencieux en ajoutant : au début de la chaîne des options.)}}
321
322
Si votre option a besoin d'un argument, il suffit de placer : après son nom :
323
324
<pre>
325
<code class="php">
326
while getopts "ob:" opt; do
327
  case "$opt" in
328
    o) echo $opt;;
329
    b) echo "$opt used with option $OPTARG";;
330
  esac
331
done
332
</code>
333
</pre>
334
335
Une fois vos arguments parser, vous pouvez mettre le premier agument positionel de votre script dans $1 avec :
336
337 57 Julien Enselme
@shift $(@(OPTIND-1)@)@
338 55 Julien Enselme
339
Vous pouvez aussi utiliser dans le case _?_ pour afficher un message si l'utilisateur passe une option inconnue et _:_ pour afficher un message si une option qui requiert un argument ne l'a pas eu.
340
341
h2. Exemple
342
343
<pre>
344
<code class="php">
345
while getopts ":h:u:p:P" opt
346
do
347
    case "$opt" in
348
        h)
349
            host=$OPTARG; hflag=true;;
350
        u)
351
            user=$OPTARG; uflag=true;;
352
        p)
353
            passwd=$OPTARG; pflag=true;;
354
        P)
355
            Pflag=true;;
356
        :)
357
            echo "Option -$OPTARG requires an argument." >&2
358
            usage; exit 1;;
359
        \?)
360
            usage; exit 0;;
361
    esac
362
done
363
</code>
364 58 Julien Enselme
shift $(@(OPTIND-1)@) # To get the 1st positional argument with $1
365 55 Julien Enselme
</pre>
366
367 8 Julien Enselme
h1. Différences notables avec bash
368 15 Julien Enselme
369 29 Julien Enselme
h2. Variables disponibles uniquement en Bash
370
371 48 Julien Enselme
* RANDOM (pour la génération de nombre aléatoire). Voir [[Shell_secours#Générer-des-nombres-aléatoires|ici]] pour plus de détails.
372 29 Julien Enselme
373
h2. Syntaxe
374
375
* &> et |&. Permettent de rediriger tous les flux vers un fichier ou de passer tous les flux à une commande (pipe généralisé)
376
* {2..10} pour générer des séquences de nombres
377 45 Julien Enselme
* @[[ ARGS ]]@ : permet de faire des tests de façon plus facile ou agréable. Exemple : @[[ chaine == chaine2 ]]@
378
* =~ : s'utilse conjointement avec @[[ ]]@ pour tester si la chaîne de gauche est contenu dans celle de droite
379 56 Julien Enselme
* $(@(ARGS)@) est un raccourcis pour la fonction let
380 29 Julien Enselme
381
h2. Autres
382
383
* Le nombre de paramètres en bash n'est pas limité à 9. Les paramètres positionnels de numéros supérieurs à 10 s'appellent comme suit : ${num}
384 18 Julien Enselme
385 1 Julien Enselme
h1. Divers
386
387 7 Julien Enselme
h2. Différences entre la sortie de ls et de find
388 9 Julien Enselme
389 28 Julien Enselme
* @ls@ renvoie simplement la liste des fichiers.
390
* @find@ renvoie un chemin absolu si l’argument donnée est un chemin absolu et relatif (de la forme ./fichier) si l’argument est .
391 18 Julien Enselme
392 40 Julien Enselme
h2. ET et OU dans le langage
393
394
L’opérateur && permet de réaliser un ET paresseux entre deux commandes. Ainsi, par exemple : @cmd1 && cmd2@. @cmd2@ ne sera exécuté que si @cmd1@ a pu s’exécuter correctement. En outre le code de retour de l’ensemble ne sera 0 que si les deux commandes ont pu s’exécuter correctement.
395
396
L’opérateur || permet de réaliser un OU paresseux entre deux commandes. Ainsi, par exemple : @cmd1 || cmd2@. Si @cmd1@ s’exécute correctement @cmd2@ ne sera pas exécutée. Si @cmd1@ retourne une erreur, @cmd2@ sera exécutée. Le code de retour de l’ensemble correspond à un OU entre les deux codes de retour.
397
398
Ceci peut s’utiliser [[Petit_precis_de_shell#La-fonction-test|avec la fonction test]].
399
400
Des fonctionnalités analogues existes dans d’autres langages inspirés du shell comme Perl ou PHP.
401
402
Pour exécuter simplement deux commandes à la suite des autres sur une seule ligne, il suffit de séparer les commandes par un point virgule.
403
404 42 Julien Enselme
h2. Différences entre les implémentations de certaines commandes entre GNU et BSD
405
406
h3. sed
407
408 53 Julien Enselme
La commande @sed@ de BSD ne connaît pas certains métacaractères tels que \s.
409
410
Les opérations dans un fichier se font : @sed -i'' 's/toto/tata/g' fichier@ sous GNU mais @sed -i '' 's/toto/tata/g' fichier@ sous BSD. La commande @sed -i -e s/toto/tata/g' fichier@ est compatible avec les deux versions.
411 42 Julien Enselme
412 50 Julien Enselme
h1. Opérations avancées sur les variables
413
414
h2. Valeurs par défaut
415
416
Il est tout à fait possible de donner une valeur par défaut à une variable en bash. Ainsi, le code suivant : @FOO=${FOO:-coucou}@ signifie que :
417
* Si la variable FOO est définie, alors ne rien faire
418
* Si FOO n'est pas définie, alors FOO vaut 'coucou'
419
420
Cela fonctionne aussi avec une autre variable : @FOO=${toto:-coucou}@. Cette fois, FOO prendra la valeur 'coucou' si toto n'est pas définie. Cette forme laisse toto inchangée. Pour affecter 'coucou' a foo et toto :  @FOO=${toto:=coucou}@.
421
422 51 Julien Enselme
h2. Travailler avec les chemins
423
424
Le shell dispose de moyen de travailler avec les chemins de façon facile et agréable :
425
* Supprimer le dernier / : @${a%/}@
426
* Supprimer le premier / : @${#*/}@
427
* Récupérer le dossier courant : @${a##*/}@ (si a ne se termine pas par /)
428
* Récupérer le dossier parent : @${a%/*}@
429
430 18 Julien Enselme
h1. Sources et liens externes
431 1 Julien Enselme
432 30 Julien Enselme
* http://www.siteduzero.com/informatique/tutoriels/reprenez-le-controle-a-l-aide-de-linux
433 18 Julien Enselme
* http://www.commentcamarche.net/faq/5444-bash-les-parametres