Projet

Général

Profil

Petit precis de shell » Historique » Version 13

Julien Enselme, 10/08/2013 11:59
Exécuter une commande

1 3 Julien Enselme
{{toc}}
2 2 Julien Enselme
3 6 Florent Torregrosa
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 et de fournir quelques 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.
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
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 son bon terminal pour faire des boucles, des conditions et j'en passe.
15
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
Chaque commande peut prendre des arguments de deux types :
31
32
* les arguments courts (l, r, h pour @ls@ par exemple) qui sont passés comme suit : @CMD -ARG@
33
* les arguments longs (recursive pour @rsync@ par exemple) qui se passent comme ceci : @CMD --ARGUMENT@
34
35
Il est évidement possible de passer plusieurs arguments à une même commande.
36
37 6 Florent Torregrosa
{{tip(Certains arguments 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 4 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
41 5 Julien Enselme
h2. Valeurs de retour des commandes et exception
42
43 6 Florent Torregrosa
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 possibles et leur signification :
44 5 Julien Enselme
45
* 0 : tout va bien
46
* 1 : erreur
47
* 2 : erreur grave
48
49 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é.
50 5 Julien Enselme
51 13 Julien Enselme
h2. Exécuter une commande
52
53
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.
54
55
Pour obtenir le résultat souhaité vous devez placer CMS entre backquote `` ou entre $(…). Par exemple : @var=`ls`@ ou @var=$(ls)@.
56
57
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é.
58
59 4 Julien Enselme
h2. Conditions et itérations
60 7 Julien Enselme
61 11 Julien Enselme
h3. Conditions if … else …
62 7 Julien Enselme
63
La structure générale d'une condition est la suivante :
64
65
<pre>
66
<code>
67
if QQC
68
then
69
    CMDS
70
else
71
    CMDS
72
fi
73
</code>
74
</pre>
75
76
Le @else@ est facultatif. Il est aussi possible de regrouper @if@ et @then@ en une seule ligne comme ceci : @if QQC ; then@.
77
78
La question que vous devriez avoir est que mettre à la place de @QQC@. Il y a deux possibilités :
79
80
* la fonction @test@
81
* une commande
82
83 11 Julien Enselme
h4. La fonction test
84 7 Julien Enselme
85
{{important(Dans toute la suite, il faudra faire très *attention aux espaces*)}}
86
87
La fonction @test@ s'utilise en général comme suit : @if [ ARGS ]@
88
89
*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]]
90
91 10 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@.
92
93
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.
94
95
Voir ci-dessous pour la liste complète.
96
97
{{important(En shell, tout est chaîne de caractère. Bien faire attention au type que l’on veut tester (chaîne ou nombre))}}
98
99
h5. Tests sur les chaînes de caractères
100
101
|_. Argument |_. Signification |
102
| = | égalité |
103
| -z | chaîne vide |
104
| -n | chaîne non vide |
105
106
h5. Tests sur les nombres
107
108
|_. Argument |_. Signification |
109
| -eq | égalité |
110
| -ne | non égalité |
111
| -lt | strictement plus petit |
112
| -gt | strictement plus grand |
113
| -ge | plus grand ou égal |
114
| -le | plus petit ou égal |
115
116 7 Julien Enselme
h4. Test avec une commande
117 1 Julien Enselme
118 10 Julien Enselme
Comme indiqué précédemment, une commande qui s’exécute correctement est considérée comme vrai. 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@.
119
120
{{tip(Parfois vous pourrez rencontrer des problèmes. Pensez alors à donner cette commande en argument à la fonction test)}}
121 7 Julien Enselme
122 12 Julien Enselme
h3. Boucles while/until
123
124
La structure générale est la suivante :
125
<pre>
126
while QQC
127
do
128
    CMD
129
done
130
</pre>
131
132
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.
133
134
Le shell propose également le mot clé @until QQC@ qui fait une action jusqu’à ce que QQC soit réalisé.
135
136
h3. Boucle for
137
138
L’utilisation de la boucle for en shell ressemble à celle de python. La structure générale est la suivante :
139
<pre>
140
for var in `CMD`
141
do
142
   CMD
143
done
144
</pre>
145
146
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@.
147
148
Vous pouvez également utiliser for pour boucler d’un nombre à un autre avec la syntaxe : @for i in {2..9}@
149
150 8 Julien Enselme
h1. Les fonctions
151
152
Parler de @local@ pour que les arguments soient internes à la fonction.
153
154
h1. Les redirections de flux
155
156 9 Julien Enselme
>, >>, 2>&1, &>, |&
157
158
h1. Paramètres de scripts
159
160
* $1, $2, …, $9
161
* $#
162
* $*
163
* $?
164
165 8 Julien Enselme
h1. Importer une configuration
166
167
@. config-file.sh@
168
169
h1. Mode debug
170
171
@sh -x SCRIPT@
172
173 7 Julien Enselme
h1. Différences notables avec bash
174 9 Julien Enselme
175
h1. Divers
176
177
h2. Différences entre la sortie de ls et de find
178
179
ls : chemin relatif ; find auei : chemin absolu