EEIJ

Païou : Mandriva Linux depuis 2002. Aujourd'hui, c'est Mageia Linux


Sommaire


Conforme à XHTML 1.0 Strict Conforme à CSS!

On se lasse de tout, sauf de comprendre.
Attribué à Virgile.

Structure des scripts bash

Historique

17 mai 2014 : Reprise de la page de l'ancien site et actualisation.

Difficulté

Pour : un esprit logique et curieux.

 Introduction

Le bash permet de donner des instructions au système d'exploitation Linux, en ligne de commande.
On peut dire que c'est l'équivalent de MSDOS, mais en beaucoup plus complet.

Un script bash est un fichier de type texte, comprenant une succession d'instructions bash.
Il commence par une en-tête spécifique et les instructions sont exécutées les unes après les autres par l'interpréteur (ici le programme /bin/bash).
C'est donc un programme interprété. Il n'a ni pré-compilation, ni compilation.
Un script peut être lancé en ligne de commande, mais aussi depuis un autre script.
Il n'est généralement pas utilisé pour faire de grands programmes, ce serait trop pénible.

Vous ne trouverez pas, ici, un cours complet sur les scripts bash, mais quelques éléments que j'utilise fréquemment et dont les explications sont disséminées sur tout l'internet.

Haut

 L'en-tête du script

La première ligne doit indiquer où se trouve l'interpréteur de commandes. C'est une ligne :
#!/bin/bash ou éventuellement #!/bin/sh qui est un lien vers /bin/bash.

Haut

 Les instructions

En général, vous écrirez une instruction sur chaque ligne :
ls *.txt pour lister tous les fichiers .txt

Vous pouvez éventuellement écrire plusieurs instructions sur une même ligne, en les séparant par ;
cd Documents; ls *.txt
N'en abusez pas, votre script devient moins lisible.

Haut

 Les commentaires

N'hésitez pas à commenter votre script. Si vous devez y revenir plus tard, vous serez probablement content de savoir pourquoi vous avez programmé ainsi.
Un commentaire est introduit par le signe dièse #. Une ligne de commentaire :
# Ceci est un commentaire

Vous pouvez également ajouter un commentaire à la fin d'une instruction, mais jamais devant une instruction. Exemple :
ls *.txt # Lister tous les fichiers .txt

Haut

 Le premier script

Son écriture

Pour écrire un script, un simple éditeur de texte suffit. Un éditeur avec coloration syntaxique ou avec assistant est cependant plus pratique.

Voici donc le rituel premier script :
#!/bin/bash
# Ceci est mon premier script
echo "Bonjour, le monde"
Enregistrez-le, par exemple MonScript.sh, mais vous pouvez le nommer comme vous voulez, avec ou sans l'extension sh

Son exécution

Pour exécuter le script, deux tactiques sont possibles :

  1. le rendre exécutable, puis l'exécuter
    chmod a+x MonScript.sh
    ./MonScript.sh
  2. utiliser la commande bash
    bash MonScript.sh

Attention
Dans les exemples ci-dessus, j'ai supposé que vous vous trouvez déjà dans le même répertoire que le script.
Si ce n'est pas le cas, il faut chaque fois faire précéder le nom du script par son chemin d'accès, par exemple : /home/paiiou/Documents/MonScript.sh

Haut

 Les variables

Les variables bash ne sont pas typées et peuvent donc contenir du texte, des valeurs numériques ...
Le nom de la variable peut être en majuscules ou minuscules ou combiné

Affectation d'une valeur

Généralement, l'affectation d'une valeur se fait :
nbre_pages=6 Attention : pas d'espaces autour du signe =

Lorsque la valeur de la variable comprend des espaces, il faut écrire :
texte="Le nombre de textes est : "

Il est également possible d'affecter le résultat d'une commande bash :
liste=`ls *.txt` Attention : Il faut prendre l'apostrophe inversée
Une autre forme est possible :
liste=$(ls *.txt)

Dans certaines circonstances, d'autres affectations sont encore possibles (dans une boucle, par exemple).

Exploitation d'une variable

Pour utiliser une variable, il suffit de faire précéder son nom par le signe $.

Voici notre premier script un peu modifié :
#!/bin/bash
# Ceci est mon deuxième script
message="Bonjour, le monde" Initialisation de la variable
echo $message affichage de la variable
Haut Enregistrez-le, par exemple MonScript2.sh, mais vous pouvez le nommer comme vous voulez, avec ou sans l'extension sh.

Haut

 Les tableaux

Des variables un peu spéciales

Bash permet également la construction de tableaux. C'est un tableau indexé simple (index = 0 ... n). Le contenu des cellules peut être des nombres ou des chaînes.
Dans le cas de chaînes, méfiez-vous des chaînes avec espace(s). Plusieurs fonctions peuvent être faussées !

Le tableau peut être déclaré au préalable, mais ce n'est pas une obligation. Le simple fait d'attribuer une valeur à une cellule suffit à le déclarer.

Déclaration

Le tableau peut être déclaré :
declare -a media déclare un tableau vide de nom media
declare -a media=(core nonfree tainted "core updates") déclare un tableau avec des valeurs.

Lister les tableaux

declare -a liste l'ensemble des tableaux, y compris les tableaux non déclarés explicitement.

Définition des valeurs du tableau

Vous pouvez définir l'ensemble des valeurs en une fois avec nom_tableau=(valeur1 valeur2 ... valeurn) :
media=(core nonfree tainted)

Vous pouvez également définir un élément individuel (le premier élément possède l'indice [0]) :
media[4]="core updates"

Vous pouvez définir plusieurs éléments, éventuellement non contigus ou dans le désordre :
media=([0]=core [2]=tainted [1]=nonfree [4]="core updates")

Haut

Lire les éléments du tableau

Vous pouvez lire le contenu d'un élément du tableau ${tableau[n]}. Le premier élément est [0].
echo ${media[2]}=> tainted

La valeur de l'indice peut être le résultat d'un calcul
echo ${media[$i-1]}

Vous pouvez connaître la longueur d'un élément du tableau ${#tableau[0]}
echo ${#media[0]}=> 4

Vous pouvez développer l'ensemble des éléments définis, séparés par un espace ${tableau[*]}
echo ${media[*]}=> core nonfree tainted core updates.
Mais ceci est inexploitable lorsque un ou plusieurs éléments contiennent un espace, comme ici
.

Vous pouvez développer l'ensemble des indices définis, séparés par un espace ${!tableau[*]}
echo ${!media[*]}=> 0 1 2 4.

Vous pouvez connaître le nombre total des éléments définis du tableau : ${#tableau[*]}
echo ${#media[*]}=> 4

Remarque

Il est également possible d'utiliser ${media[@]} à la place de ${media[*]}
Le résultat est identique, excepté lorsque des " entourent ${media[@]} ou ${media[*]}

"${media[*]}" renvoie tous les éléments comme s'ils ne formaient qu'un seul mot :
for elem in "${media[*]}"; do
echo $elem
done
=> core nonfree tainted core updates

"${media[@]}" renvoie chaque élément comme un mot :
for elem in "${media[@]}"; do
echo $elem
done
=> core
    nonfree
    tainted
    core updates

Notez que, ici, le dernier élément est correctement rendu, avec son espace.

Haut

 Groupes de commandes

Les accolades et les parenthèses permettent de regrouper des commandes.
Le code retour d'un bloc de commande est celui de la dernière commande exécutée.

Plusieurs commandes sur une ligne

Il est possible d'écrire plusieurs commandes sur une seule ligne, séparées par ;.
commande1; commande2
La commande 2 est exécutée après la commande 1. Il peut y avoir plus de 2 commandes.

Enfilade (tuyau, pipe)

rpm -qa | grep mageia
La commande 1 envoie son résultat dans la commande 2.

Une commande OU une autre, si échec de la première

commande1 || commande2
La commande 2 n'est exécutée que si la commande 1 échoue.

Une commande ET une autre, si réussite de la première

commande1 && commande2
La commande 2 n'est exécutée que si la commande 1 réussit.

Les accolades

La suite des commandes, terminées chacune par ;, est placée entre deux accolades.
Un espace doit se trouver près de chaque accolade.
{ commande1; commande2; commande3; }

Avec des accolades, les commandes sont exécutées l'une après l'autre, par le shell courant.
Il en résulte que les variables du groupe de commandes sont donc également visibles ou modifiées hors du bloc de commandes.

Les parentaises

La suite des commandes, terminées chacune par ;, est placée entre deux parenthèses. La dernière commande ne nécessite pas le ;
Un espace doit se trouver près de chaque parenthèse.
( commande1; commande2; commande3 )

Avec des parenthèses, les commandes sont exécutées l'une après l'autre, dans un sous-shell.
Il en résulte que les variables du groupe de commandes ne sont donc pas visibles ou modifiées hors du bloc de commandes.

Haut

 La suite des scripts bash

Les expansions, substitutions et calculs

On appelle couramment "expansion" le fait que bash remplace un élément par un autre élément (une substitution). Exemple, les variables :
nombre=3 la variable nombre prend la valeur 3
dans $nombre bash substitue la valeur de la variable au nom de la variable

Expansions, substitutions et calculs Cliquez

Les expressions régulières, grep et sed

Deux commandes très utiles pour examiner le contenu d'un fichier et de modifier son contenu : grep et sed.
Ces deux commandes autorisent l'utilisation des expressions régulières ou Regex.

Les expressions régulières, grep et sed Cliquez

Les tests

Il est souvent nécessaire de n'exécuter certaines instruction que si des conditions données sont remplies.
Il faut tester la valeur d'une variable, la présence d'un fichier ...

Les tests dans les scripts bash Cliquez

Les boucles

Nousallons découvrir dans ce chapitre un autre élément de base de tous les langages : les boucles.
Ces structures permettent de répéter autant de fois que nécessaire une partie du code. En bash, on également les faire

Les boucles dans les scripts bash Cliquez

Les fonctions

Comme les « vrais » langages de programmation, Bash supporte les fonctions bien qu'il s'agisse d'une implémentation quelque peu limitée.
Une fonction est une sous-routine qui permet d'utiliser plusieurs fois une portion de code.

Les fonctions dans les scripts bash Cliquez

Haut