Les bases de
l’interpréteur de commande bash
La commande suivante permet de lister tous les fichiers qui se terminent par .c :
> ls *.c
chemin.c
trouve.c
Celle-ci permet de lister tous les fichiers de 6 caractères se terminant par .c :
> ls ??????.c
chemin.c
trouve.c
On obtient le même résultat avec cette dernière commande :
> ls [a-z]*.c
> chemin.c trouve.c
Dans certaines commandes, des caractères spéciaux sont utilisés pour construire des listes de nom de fichiers. L’interpréteur de langage de commande utilise ces mots comme des motifs que doivent satisfaire les noms de fichiers. Les caractères spéciaux utilisés sont :
Caractères |
Interprétation |
? |
Un caractère quelconque |
* |
Une chaîne de caractères quelconque (éventuellement vide) |
[ |
Début de définition d’un ensemble |
[ ! |
Début de définition du complément d’un ensemble |
] |
Fin de définition d’un ensemble |
- |
Marque d’intervalle dans un ensemble |
Les chaînes de caractères peuvent être encadrées, entre autres, par les caractères ‘ (simple quote), et ` (anti quote). Ces délimiteurs se différencient par le type de substitution qui sont réalisées à l’intérieur des chaînes qu’ils délimitent.
Le caractère ’ (simple quote) : tous les caractères à l’intérieur d’une chaîne délimitée par ce caractère sont considérés comme protégés, c’est à dire perdent, s’ils ont en un, leur aspect spécial
> echo ’$PATH’
$PATH
Le caractère ` (anti quote) : une chaîne délimitée par ce caractère est interprétée comme une commande et le résultat de la commande lui est substituée. Ainsi la chaîne :
> echo `date`
sera remplacée par la chaîne
Mon Nov 16 07 :41 :48 1999
Il est possible avec l’interpréteur de commandes bash
· de lancer une commande en avant plan. Le lancement est synchrone : l’interpréteur de commande attend la terminaison de la commande avant de rendre la main.
> Commande
> ls
Makefile
chemin.c trouve.c
· de lancer une commande en arrière plan. Le lancement est asynchrone : l’interpréteur de commande n’attend pas la fin de la commande avant de rendre la main.
> commande &
> ls &
Makefile
chemin.c trouve.c
· de lancer séquentiellement plusieurs commandes. La commande i+1 est exécutée que lorsque la commande i est terminée
> commande1 ; commande2 ;… ;commanden
> cd tpunix ; ls
Makefile
chemin.c trouve.c
· de lancer une commande en premier ou en arrière plan avec redirection de l’entrée standard sur un fichier.
> Commande < fichier [&]
> ls –1 > f1
> wc < f1
4 4 35
· de lancer une commande en premier ou en arrière plan avec redirection de la sortie standard sur un fichier avec écrasement (>) ou écriture en fin de fichier (>>).
> Commande > fichier [&]
> Commande >> fichier [&]
> ls –1 > f1
> cat f1
Makefile
chemin.c trouve.c
> ls –1 >> f1
> cat f1
Makefile
chemin.c trouve.c
Makefile
chemin.c trouve.c
· de lancer des processus concurrents communiquant par tube au moyen du caractère | La sortie standard de la commande1 est redirigée vers l’entrée standard de la commande 2. La communication entre les commandes se faisant par un tube.
> commande1 | commande2 |…| commanden
> ls –1 | wc
4 4 35
La redirection de la sortie erreur standard peut être réalisée en même temps que celle de la sortie standard en utilisant la suite de 2 caractères >&.
Voici un exemple d’utilisation des redirections
> ls Makefile chemin.c trouve.c titi
titi not found
Makefile chemin.c trouve.c
> ls Makefile chemin.c trouve.c titi >& f1
> cat f1
titi not found
Makefile chemin.c trouve.c
La redirection de la sortie standard sur un fichier f1 et de la sortie erreur standard sur le fichier f2 est réalisée en bash par la commande suivante :
> (ls Makefile chemin.c trouve.c titi > f1) >& f2
> cat f1
Makefile
chemin.c
trouve.c
> cat f2
ls: cannot access titi:
No such file or directory
L'exécution d'une suite de commandes peut se faire directement au clavier ou par l’intermédiaire d’un fichier de commandes. Voici un exemple de fichier de commande qui affiche le nombre de lignes des fichiers chemin.c et trouve.c. Le fichier commence par la ligne #!/bin/bash. Les lignes commençant par le caractère # sont des lignes de commentaires.
#!/bin/bash
# fichier de commandes qui affiche le nombre de lignes des fichiers
# chemin.c et trouve.c.
wc –l chemin.c
wc –l trouve.c
Il faut ensuite exécuter le fichier de commande. Il y a plusieurs manières pour l’exécuter :
fichier_de_commande
Le fichier doit être lisible et exécutable et la première ligne du fichier doit contenir #!/bin/bash L’interpréteur de commande lance un sous processus (bash) pour interpréter les commandes du fichier.
bash fichier_de_commande
Le fichier doit être lisible (droit de lecture), l’interpréteur de commande lance un sous processus (qui est lui même un interpréteur de commande (bash)) pour interpréter les commandes du fichier.
source fichier_de_commande
Le fichier doit être lisible (droit de lecture), l’interpréteur de commande exécute le fichier dans son environnement courant (qui peut alors être modifié).
Une variable du l’interpréteur de commande est une chaîne de caractères alphanumérique dont le premier caractère est alphabétique. Les variables peuvent être utilisées dans un fichier de commande.
Pour connaître la valeur d'une variable, on utilise la commande echo $Nom.
echo $PATH
Pour affecter
une variable dans un fichier de commande, on écrit :
variable=valeur
Voici des
exemples d’expressions manipulant des variables :
$variable ou ${variable}
Rend la valeur de la variable.
$variable[indice] ou ${variable[indice]}
Donne la liste des éléments adressés par indice où indice est soit un nombre, soit un intervalle de la forme entier1-entier2
$#variable
Donne le nombre de mots de la valeur de la variable.
Les expressions suivantes peuvent être utilisées dans un fichier de commande :
$0
Donne le nom du fichier en exécution.
$n ou $argv[n]
Donne la valeur du nème paramètre appelé avec le fichier de commande (n doit être compris entre 1 et 9).
$*
Donne la valeur de tous les paramètres passés en argument du fichier de commande. .
$?variable
Rend la valeur 1 ou 0 selon que variable est définie ou pas
$$
Donne le numéro de processus shell réalisant la commande.
Voici un exemple de fichier de commandes qui utilise les expressions ci-dessus :
#!/bin/bash
# Fichier de commande qui contient différents expressions de
# manipulation de variables
echo $0
echo $*
echo $$
echo $1
echo $2
echo $3
jour=(lundi mardi mercredi jeudi vendredi samedi dimanche)
echo ${jour[3]}
echo quel jour sommes nous ?
read aujourdhui
echo nous sommes un $aujourdhui
On lance la commande avec les paramètres janvier fevrier mars avril :
> test janvier fevrier mars avril
et voici le résultat de l'exécution de ce fichier :
test
janvier fevrier mars avril
24348
janvier
fevrier
mars
jeudi
quel jour sommes nous ?
Jeudi <-- rentrer par l'utilisateur
nous sommes un Jeudi
Une étiquette est une chaîne de caractères suivie du caractère ':'; et la commande
goto etiquette
provoque un branchement à la commande repérée par cette etiquette.
Proche de la syntaxe de C, les instructions conditionnelles sont de l'une des formes suivantes :
if |
( expression ) |
commande-simple |
ou |
|
|
if |
( expression ) then |
|
|
suite-de-commandes |
|
else |
|
|
|
suite-de-commandes |
|
endif |
|
|
Les aiguillages se font de la manière suivante :
switch |
( valeur ) |
|
|
case |
valeur: |
|
|
suite-de-commandes |
|
|
breaksw |
|
|
|
|
..... |
|
|
|
|
|
case |
valeur: |
|
|
suite-de-commandes |
|
|
breaksw |
|
default: |
|
|
|
suite-de-commandes |
endsw |
|
|
Les instructions d’itérations peuvent prendre les 2 formes suivantes :
foreach |
variable |
( liste-de-valeur ) |
|
suite-de-commandes |
|
end |
|
|
|
|
|
|
|
|
while |
( expression ) |
|
|
suite-de-commandes |
|
end |
|
|
L’instruction break permet de sortir de la boucle.
Voici quelques commandes internes de l’interpréteur de commande.
cd
[repertoire]
demande le changement de répertoire de travail.
echo [-n] [mot]
affiche successivement les mots en les séparant par des espaces. Si l’argument optionnel –n n’est pas utilisé, un caractère de fin de ligne est affiché à la fin.
exit
valeur
Le shell se termine avec comme code de retour la valeur donnée. Cette valeur est stockée dans
une variable du shell status. Par
défaut, le code de retour vaut 0.