Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Red Hat Enterprise Linux - CentOS
  3. Les scripts bash
Extrait - Red Hat Enterprise Linux - CentOS Mise en production et administration de serveurs (4e édition)
Extraits du livre
Red Hat Enterprise Linux - CentOS Mise en production et administration de serveurs (4e édition) Revenir à la page d'achat du livre

Les scripts bash

Introduction

Le scripting consiste à créer des programmes qui vont automatiser un ensemble de tâches.

L’administration des systèmes demande beaucoup de temps, surtout lorsqu’il s’agit de tâches répétitives sur un grand nombre de machines. L’économiser en automatisant les tâches sur la machine est indispensable au travail de tout bon administrateur.

Il est également utile de comprendre, voire personnaliser les scripts déjà existants sur la machine.

Finalement, il est possible de réaliser, en ligne de commande, des tâches complexes en quelques mots-clés. Pourquoi ne pas ensuite en faire un alias si elles doivent être utilisées régulièrement ?

Par exemple, pour demander à un lecteur MP3 de lire tous les morceaux d’un répertoire :

alias playmp3='for i in /multimedia/mp3/*.mp3; do mplayer "$i"; done' 

Bien qu’il existe de nombreux langages de scripting, comme Perl et Python, nous vous présentons dans ce chapitre le scripting avec le shell bash. C’est un shell pratique, facile à aborder, mais aussi un interpréteur de scripts puissants.

Nous présentons ici les fonctionnalités les plus courantes, mais le bash dispose de beaucoup, beaucoup d’autres options extrêmement intéressantes. Nous vous invitons à les découvrir dans les pages de man et les sites spécialisés qui regorgent de conseils et d’astuces. De plus, il existe d’autres shells et d’autres langages qui peuvent répondre à des besoins plus précis, tels que Python ou Perl.

Préalable

1. Transformer un fichier en script bash

Deux prérequis sont nécessaires pour qu’un fichier devienne un script :

1. le fichier doit être exécutable.

  • Le droit x doit être affecté au fichier. On a coutume de donner ce droit à l’ensemble des utilisateurs :

chmod +x mon_script.sh 

Certains administrateurs ont l’habitude de donner l’extension indicative .bash (ou .sh en fonction de l’interpréteur choisi) à leurs scripts, car ils sont ainsi plus faciles à reconnaître.

2. le fichier doit commencer par une séquence de caractères précis :

  • Le « shebang » : #!

    Le shebang agit comme une balise, qui indique au système quel shell doit interpréter le script.

  • Sur la même ligne, le chemin exact du shell qui va interpréter le script. Dans notre cas, nous le trouvons en tapant la commande which bash.

Par exemple, nous avons appliqué ces conditions au script monscript :

[root@cobb ~]# chmod +x monscript 
[root@cobb ~]# ls -l monscript 
-rwxr-xr-x. 1 root root 12 16 janv. 21:49 monscript 
[root@cobb ~]# cat monscript  
#!/bin/bash 
mkdir /home/messcripts 

Notez que le script appartient à root. De plus, il peut être lu et exécuté par tout le monde. À vous de fixer les droits selon vos besoins.

Le script contient déjà une commande destinée à créer un répertoire.

À l’intérieur d’un script, on inscrit une suite de commandes qui seront toutes exécutées séquentiellement au lancement du script avec les droits de l’utilisateur qui l’a lancé.

Par exemple, le script lancé par l’utilisateur jdoe échouera, car il faut les droits root pour exécuter la commande contenue dans celui-ci (qui crée...

Traitement de base

1. Variables

Un script peut utiliser des paramètres codés en dur, c’est-à-dire stockés tels quels dans le script. S’ils doivent changer régulièrement, il faudra parcourir le script et l’éditer à la main avec de nouvelles valeurs. Il serait plus pratique de demander ces paramètres à l’utilisateur au moment de l’exécution du script ou bien de les stocker dans un fichier dédié.

Les variables permettent de concevoir des scripts avec cette souplesse.

Les variables sont de simples conteneurs de données possédant une étiquette pour les reconnaître plus facilement. On peut stocker une donnée dans une variable et la mettre à jour.

Il existe deux grands types de variables :

  • Les variables définies par l’administrateur à l’intérieur du script.

  • Les paramètres spéciaux : ce sont des variables définies par le système et que vous pouvez manipuler.

La plupart de ces paramètres spéciaux sont contenus dans les variables d’environnement, expliquées dans le chapitre Gestion des utilisateurs et des groupes - Utilisateurs et groupes.

On définit une variable de la manière suivante :

nom_directeur='Fischer' 

Ici, la variable a le nom nom_directeur, et la donnée qui s’y trouve est Fischer

L’utilisation des guillemets est expliquée plus loin dans la section Échappement de caractères spéciaux.

Le nom d’une variable peut contenir des chiffres, des lettres et le caractère souligné "_" mais ne peut pas commencer par un chiffre.

Afficher le contenu d’une variable

La commande echo imprime le texte qu’on lui passe en argument :

[root@cobb ~]# echo Coucou 
Coucou 

Si l’on veut...

Traitement avancé

1. Tests et comparaisons

Il est possible d’effectuer différents tests sur des valeurs numériques, sur des chaînes de caractères, et sur des fichiers. Ces tests permettront par exemple de vérifier la présence d’un fichier ou d’un répertoire (il faudra les créer le cas échéant) ou le type du fichier, comparer des PID, effectuer des traitements en fonction d’arguments, etc. Ils sont utilisés avec les instructions et boucles conditionnelles ci-après, conjointement avec la commande [ (ou test).

Plus d’informations avec la commande man test.

Comparaisons arithmétiques

Il est possible de comparer des chiffres, ou des variables contenant des chiffres, avec les symboles de comparaison suivante :

  • -lt (less than) : plus petit que.

  • -gt (greater than) : plus grand que.

  • -le (less or equal) : plus petit ou égal.

  • -ge (greater or equal) : plus grand que ou égal.

  • -eq (equal) : égal à.

  • -ne (not equal) : différent de.

L’exemple suivant prend un chiffre en argument et le compare, pour évaluer une note :

script note : 
#!/bin/bash 
note=$1 
if [ $note -ge 19 ]; then 
       echo 'Bravo ! Bonne note !' 
else 
       echo 'Peut mieux faire' 
fi 

Résultat :

[root@cobb ~]# ./note 19 
Bravo ! Bonne note ! 
[root@cobb ~]# ./note 15 
Peut mieux faire 

Les instructions conditionnelles if ... then ... else ... sont expliquées dans la suite de ce chapitre.

Tests et comparaisons de textes

On peut également comparer des chaînes de caractères, ou des variables contenant des chaînes de caractères :

  • texte1 = texte2 : égal.

  • texte1 != texte2 : différent (pas égal).

  • texte1 < texte2 : plus...

Outils

1. Sed : éditeur de données en flux

Sed (Stream Editor, éditeur de flux) est un utilitaire permettant de modifier des données en ligne de commande. Sed lit les données ligne à ligne depuis l’entrée standard ou depuis un fichier et écrit le résultat sur la sortie standard qu’on peut rediriger vers un fichier.

L’une des utilisations principales de Sed est de substituer (substitute) des données à l’intérieur du fichier à traiter, mais cette commande dispose de nombreuses autres possibilités, qui prendraient bien des pages à développer. En fait, Sed est un outil puissant qui gagne à être étudié.

Le fonctionnement de Sed est le suivant :

  • lecture d’une ligne sur l’entrée ;

  • traitement de la ligne ;

  • affichage de la ligne traitée sur la sortie ;

  • lecture de la ligne suivante.

Dans son comportement standard, Sed ne modifie pas le fichier qu’il est en train de traiter. Pour que la modification ait lieu, il faut rediriger la sortie de Sed vers un fichier ou utiliser une option de Sed.

La syntaxe générale de sed est :

sed -e '<commande>' <fichier> 

C’est une bonne pratique de placer la commande entre simples guillemets, pour l’isoler du shell et éviter qu’il n’interprète certaines expressions régulières qui s’y trouvent.

Options courantes de sed

  • -e <commande> : cette option définit qu’une commande suit juste après. Elle n’est pas nécessaire quand il n’y a qu’une seule commande, mais les choses se compliquent quand on veut multiplier le nombre de traitements. Dans ce cas, il faut autant d’options -e que de <commandes> qui la suivent.

  • -n : cette commande n’imprime que les lignes...