Linux – Programmation et scripts bash

Introduction

Mots-clés

Script shell, code retour, test, opération arithmétique, structures de contrôle, boucle, condition

Objectif

À l’issue de ce chapitre, vous serez en mesure d’automatiser l’exécution de travaux à partir des éléments étudiés précédemment. Les fonctionnalités abordées vous permettront de créer vos propres scripts shell, programmes développés en langage Bash.

Matériel à prévoir

Ces exercices peuvent être réalisés sur n’importe quelle distribution Linux où le lecteur possède un compte utilisateur valide ; le compte utilisateur tux est utilisé en correction des énoncés.

 

Énoncé 8.1 Appel et exécution de scripts shell

Durée estimative : 20 minutes

1.

Connectez-vous sur la deuxième console virtuelle texte (tty2) en tant qu’utilisateur tux.

2.

Dans votre répertoire personnel, créez le sous-répertoire bin qui sera utilisé pour stocker tous les scripts shell écrits par la suite et placez-vous dans ce répertoire.

3.

Créez le script shell 01appel qui effectue les opérations suivantes :

  • Affecter la chaîne de caractères “abc” à la variable var.

  • Afficher la chaîne de caractères “la variable $var a pour valeur :”, suivie du contenu de la variable var.

  • Effectuer une pause de trois secondes.

4.

Exécutez le script shell 01appel de la manière suivante :

bash 01appel

Après la fin de l’exécution du script, quelle est la valeur de la variable var dans votre environnement shell ? Pourquoi ?

5.

Exécutez le script shell 01appel de la manière suivante :

01appel

Est-ce possible ? Pourquoi ?

6.

Ajoutez le droit d’exécution au script 01appel pour le propriétaire du fichier et ajoutez le chemin de votre répertoire bin à la variable d’environnement PATH s’il n’y est pas déjà.

7.

Exécutez le script shell 01appel de la manière suivante :

01appel

Après la fin de l’exécution du script, quelle est la valeur de la variable var dans votre environnement shell ? Pourquoi ?

8.

Quel shell a été utilisé pour interpréter le script 01appel appelé précédemment ? Faites en sorte que ce soit obligatoirement un shell Bash.

9.

Exécutez le script shell 01appel de la manière suivante :

. 01appel

Après la fin de l’exécution du script, quelle est la valeur de la variable var dans votre environnement shell ? Pourquoi ?

10.

Exécutez le script shell 01appel de la manière suivante :

exec 01appel

Que se passe-t-il ? Pourquoi ?

Indices

3.

Vous pouvez utiliser l’éditeur vi ou vim pour créer ce fichier.

6.

Utilisez la commande chmod.

8.

Pour imposer un interpréteur plutôt qu’un autre, il existe un commentaire spécial à placer en première ligne du script : #! suivi du chemin vers l’interpréteur souhaité.

 

 

 

 

Énoncé 8.2 Code retour

Durée estimative : 5 minutes

1.

Reconnectez-vous sur la deuxième console virtuelle texte (tty2) en tant qu’utilisateur tux.

2.

Tapez la commande ls /etc/passwd et affichez son code retour.

3.

Tapez la commande ls glop et affichez son code retour.

4.

Affichez de nouveau le code retour de la dernière commande. Est-ce le même ?

5.

Allez dans votre répertoire bin et modifiez le script 01appel de façon qu’il renvoie un code retour égal à 2 puis testez-le.

Indices

2.

La variable spéciale $? contient le code retour de la dernière commande exécutée.

5.

Utilisez la commande exit.

 

 

 

 

 

Énoncé 8.3 Enchaînement de commandes

Durée estimative : 5 minutes

1.

Affichez la date système et la liste des fichiers présents dans le répertoire courant en une seule ligne de commandes.

2.

Affichez le contenu du fichier /etc/hosts s’il existe.

3.

Créez le fichier vide /tmp/glop s’il n’existe pas.

Indices

1.

Effectuez un enchaînement de commandes avec le caractère ; (point-virgule).

2.

Utilisez le code retour de la commande ls pour savoir si le fichier /etc/hostsexiste, puis effectuez un enchaînement de commandes conditionnel avec les caractères &&.

3.

Utilisez le code retour de la commande ls pour savoir si le fichier /tmp/glop existe, puis effectuez un enchaînement de commandes conditionnel avec les caractères ||.

 

 

 

 

 

 

Énoncé 8.4 Variables spéciales

Durée estimative : 30 minutes

1.

Dans votre répertoire bin, créez le script shell 02varspec qui effectue les opérations suivantes :

  • Afficher le nom du script shell

  • Afficher le PID du script shell.

  • Afficher le PID du processus père.

Chaque affichage doit être précédé d’un énoncé (par exemple pour le nom du script : mon nom est : “nom du script shell”).

Puis modifiez les droits du fichier de façon à l’instancier par son nom.

2.

Affichez le PID de votre shell courant, puis exécutez le script 02varspec des trois manières suivantes :

bash 02varspec

02varspec

. 02Varspec

Les résultats sont-ils ceux attendus ?

3.

Copiez le script 02varspec en 03param et modifiez ce dernier de façon à :

  • afficher le nombre d’arguments passés sur la ligne de commandes,

  • afficher les trois premiers paramètres positionnels.

4.

Testez votre script shell 03param avec les arguments suivants :

a b c d

“a b” c d

a b c\ d

a ’b c’ d

5.

Ajoutez les opérations suivantes dans le script 03param :

  • Décaler les paramètres positionnels de deux rangs.

  • Afficher de nouveau les trois premiers paramètres positionnels.

Testez de nouveau le script avec les arguments suivants :

a b c d

6.

Modifiez le script 03param comme suit :

  • Afficher le onzième paramètre positionnel en plus des trois premiers.

  • Afficher l’ensemble des paramètres positionnels avant et après le décalage avec la commande shift.

Testez le script avec les arguments suivants :

a b c d e f g h i j k l m o

Indices

1.

Utilisez respectivement les variables $0$$ et PPID pour obtenir le nom, le PID, et le PID du père du script shell.

Utilisez la commande chmod pour modifier les droits du fichier.

3.

Le nombre de paramètres positionnels est contenu dans la variable spéciale $# ; les paramètres positionnels sont quant à eux contenus dans les variables $1$2$3

5.

Utilisez la commande shift.

6.

Utilisez la syntaxe ${} pour référencer le onzième paramètre positionnel.

Les variables spéciales $* et $@ contiennent, toutes les deux, l’ensemble des paramètres positionnels passés sur la ligne de commandes.

 

 

 

 

 

Énoncé 8.5 Tests de fichiers

Durée estimative : 20 minutes

1.

Dans votre répertoire bin, créez le script shell 04fichier qui effectue les tests suivants sur un fichier passé en argument :

  • Si le fichier n’existe pas, sortir avec un code retour égal à 1.

  • Afficher si le fichier est un fichier standard ou non.

  • Afficher si le fichier est un répertoire ou non.

  • Afficher les autorisations que vous possédez sur le fichier (lecture, écriture et exécution).

  • Afficher si le fichier contient des données ou non.

2.

Testez le script shell 04fichier avec successivement le fichier /glop/etc/hosts/bin/ls et /home.

Indice

1.

Utilisez la commande test avec la syntaxe [].

 

 

 

Énoncé 8.6 Tests de chaînes de caractères

Durée estimative : 15 minutes

1.

Dans votre répertoire bin, créez le script shell 05chaine qui effectue les tests suivants sur deux chaînes de caractères passées en argument :

  • Si au moins une des deux chaînes de caractères passées en argument est nulle, sortir avec un code retour égal à 1.

  • Afficher si les chaînes de caractères sont identiques ou non.

2.

Testez le script shell 05chaine avec les arguments suivants :

abc “”

“” abc

“” “”

abc abc

abc ABC

abc “abc “

Indice

1.

Utilisez la commande test avec la syntaxe [].

 

 

 

 

Énoncé 8.7 Tests et opérations arithmétiques

Durée estimative : 30 minutes

1.

Dans votre répertoire bin, créez le script shell 06max qui retourne le plus grand des deux arguments passés en paramètres.

Utilisez la commande test avec la syntaxe [].

2.

Testez le script shell 06max avec les arguments suivants :

12

12 34

12 6

12 12

12 ” 34″

3.

Créez maintenant le script shell 07min qui retourne le plus petit des deux arguments passés en paramètres.

Utilisez cette fois la commande let avec la syntaxe (()).

4.

Testez le script shell 07min avec les arguments suivants :

12

12 34

12 6

12 12

12 ” 34″

5.

Créez le script shell 08div qui retourne le résultat de la division entière entre le premier et le second argument.

6.

Testez le script shell 08div avec les arguments suivants :

12

12 0

12 2

12 5

12 14

Indices

1.

Effectuez les opérations suivantes dans le script :

  • Si le nombre d’arguments est différent de 2, sortir avec un code retour égal à 1.

  • Afficher le nombre le plus grand ou la valeur du premier en cas d’égalité.

3.

Effectuez les opérations suivantes dans le script :

  • Si le nombre d’arguments est différent de 2, sortir avec un code retour égal à 1.

  • Afficher le nombre le plus petit ou la valeur du premier en cas d’égalité.

5.

Effectuez les opérations suivantes dans le script :

  • Si le nombre d’arguments est différent de 2, sortir avec un code retour égal à 1.

  • Si le second paramètre est égal à 0, sortir avec un code retour égal à 2.

  • Afficher le résultat de la division entière.

 

 

 

Énoncé 8.8 Scripts interactifs

Durée estimative : 10 minutes

1.

Dans votre répertoire bin, créez le script shell 09mult qui demande de saisir deux nombres et qui retourne le résultat de la multiplication de ces deux nombres.

2.

Testez le script shell 09mult avec les nombres 12 et 3.

Indice

1.

Utilisez la commande read.

 

 

 

Énoncé 8.9 Pour aller plus loin

Durée estimative : 30 minutes

1.

Écrivez le script shell 10compar qui affiche le plus petit et le plus grand nombre parmi les arguments passés sur la ligne de commandes ; le nombre d’argument devant être supérieur à 1.

2.

Testez le script shell 10compar avec les arguments suivants :

1

1 2

1 2 3

3 5 2 6 1 8 7

3.

Testez les environnements de développement graphiques installés sur votre système et rééditez les scripts shell précédents.

Indice

1.

Réutilisez les scripts 06max et 07min précédemment écrits.

Utilisez une boucle while avec la commande shift pour traiter l’ensemble des arguments.