Païou : Mandriva Linux depuis 2002. Aujourd'hui, c'est Mageia Linux
On se lasse de tout, sauf de comprendre.
Attribué à Virgile.
17 mai 2014 : Reprise de la page de l'ancien site et actualisation.
Pour : un esprit logique et curieux.
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.
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.
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.
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
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
Pour exécuter le script, deux tactiques sont possibles :
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
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é
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).
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
Enregistrez-le, par exemple MonScript2.sh, mais vous pouvez le nommer comme vous voulez, avec ou sans l'extension sh.
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.
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.
declare -a liste l'ensemble des tableaux, y compris les tableaux non déclarés explicitement.
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")
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
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.
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.
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.
rpm -qa | grep mageia
La commande 1 envoie son résultat dans la commande 2.
commande1 || commande2
La commande 2 n'est exécutée que si la commande 1 échoue.
commande1 && commande2
La commande 2 n'est exécutée que si la commande 1 réussit.
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.
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.
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
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
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
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
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