Les bases de l’interpréteur de commande bash

 

 

1        Les caractères spéciaux

1.1       Le mécanisme d’expansion

 

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

 

1.2       Les délimiteurs de chaînes de caractères

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

 

2        Les commandes : lancements,  redirections et communication

 

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

 

3        Les fichiers de commandes

 

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é).

 

 

 

 

4        Manipulation des variables

 

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 indiceindice 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

 

 

5        Les structures de contrôle utilisables dans un fichier de commande

5.1       Les étiquettes et branchements

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.

 

5.2       Les commandes conditionnelles

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

 

 



5.3       Les aiguillages

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

 

 

 

 

5.4       Les boucles

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.

6        D'autres commandes

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.