Initiation au shell script & Bash

Introduction :
A qui s'adresse cet article ?
Cet article s'adresse aux débutants qui n'ont aucune notions en scripting Bash, il s'agit d'une initiation, comme l'indique le titre, avec exercices d'entrainement tout à la fin. Pour les plus expérimentés ou pour ceux qui ont terminé ce petit tutoriel, je vous recommande fortement le Advanced Bash Scripting guide (ce qui signifie "Guide avancé d'écriture des scripts Bash"), qui existe également en version française. N'hésitez pas à laisser vos commentaires sur cet article tout à la fin, cependant, je vous demanderez de ne pas demander de l'aide par le biais des commentaires : la catégorie Linux & Bash du forum est en partie faite pour ça.
Enfin, je vous propose également une liste des tutoriels gratuit du net sur l'apprentissage du Bash : rendez-vous ici.
Les script, c'est quoi ?
Les scripts sont des programmes en langages interprétés : ce sont des fichiers écrit dans des langages qui sont convertit en instructions directement exécutables par la machine au moment de son exécution. On appel ces langages, langages de script.
Ces langages sont parfois interprétés par un shell (nous allons définir ce qu'est un shell par la suite), ce sont des langages qui permet de manipuler les fonctionnalités du système. On associe, d'ailleurs, souvent le langage de script au shell qui l'interprète. C'est le cas de Bash que nous allons traiter dans ce cours.
Les shells qu'est ce que c'est ?
Les Shells sont des interfaces qui servent à communiquer avec le système, elles sont le plus généralement présents dans les systèmes de type Unix. Pour les systèmes Unix, il s'agit d'un interpréteur de commande en mode texte.
Il existe plusieurs shell, sur les systèmes de type Unix, dont les plus connus sont les suivants :
- Bash (le Bourne Again SHell). C'est le shell le plus utilisé aujourd'hui.
sh (le bourne SHell). Ce shell fut le premier présent dans les systèmes Unix et est à l'origine de tout les autres.
- Ksh (Korn SHell).
- Csh (le C SHell) dont la syntaxe est inspirée du langage C).
- Tcsh (le Tenex C Shell). C'est une évolution du Csh.
- Zsh (le Z Shell). C'est un shell récent basé sur Bash, Ksh et Tcsh.
Le Bash est sans doute le shell le plus utilisé aujourd'hui sur les systèmes de type Unix (en particulier pour la plupart des distributions Linux et la génération des Mac OS X) et c'est sur lui que portera ce tutoriel. Vous pouvez néanmoins définir un autre shell par défaut dans votre terminale ou tout simplement en l'utilisant de manière passagère (pour cela il suffit de l'appeler en console, par exemple ksh pour appeler Ksh).
Le shell utilisé par défaut par votre terminal n'influe pas sur l'usage d'un autre shell dans des scripts. Par contre il faut vérifier que le shell que vous souhaitez utilisé dans votre script soit bien présent dans le répertoire /bin. Sinon vous pourrez toujours l'installer.
Quelques informations supplémentaires sur Bash ?
Bash signifie Bourne Again SHell. C'est un jeu de mot avec le Bourne shell, le shell original d'Unix sur lequel Bash est majoritairement basé, et de l'anglais born again (né de nouveau ou encore réincarné).
Le Bourne Again Shell est le shell du projet GNU basé principalement sur le Bourne Shell, mais lui apportant de nombreuses améliorations provenant d'autres types de shells, notamment du Korn Shell et du C shell. qui signifie
Les scripts Bash sont donc des fichiers texte qui contiennent des commandes shell et des instructions de contrôle de type if, while, ... Ils sont directement interprétés par le shell en question et permettent d'automatiser les tâches en console habituelles qui sont souvent des tâches d'administration.
De quoi ai-je besoin pour programmer en Bash ?
Pour développer en Bash, un éditeur de texte quelconque comme Gedit ou Kate suffit. Vous trouverez d'ailleurs quelques complément sur l'utilisation des éditeurs de texte en console tel que Vim, Emacs et Nano sur cet article.
Il faut aussi savoir que connaître les syntaxes des différentes instructions en Bash ne suffit pas à la réalisation d'un script. En effet, il faut connaître un minimum de commandes pour savoir quelles tâches automatiser . Ainsi pour étoffer vos scripts, je vous recommande de visiter la liste des commandes du shell Linux (ou Unix).
Votre script est tout simplement un fichier texte dans lequel vous pouvez écrire les commandes que vous voulez exécuter plus rapidement (on parle d'automatiser les tâches habituelles). Des structures sont mise en place afin de contrôler l'exécution de ces commandes à notre guise. Ce fichier doit contenir comme première ligne :
Code : Bash
#!/bin/bash
Rappelons, que le Bash est principalement une évolution de sh. Ainsi,
il est possible, au stade des connaissances acquise avec ce tutoriel, d'écrire
en première ligne :
Code : Bash
#!/bin/sh
Dans le cas ci-dessus, on fait appel au shell sh et non au Bash. C'est parfois préférable pour que votre script soit standard et qu'il fonctionne ainsi sur toutes les plateformes de type Unix qui parfois, ne disposent pas de Bash (ça reste assez rare tout de même).Faites ensuite chmod +x NomDuScript en console afin de donner des droits d'exécution en console à ce fichier ("NomDuScript" étant le nom de votre fichier, déplacez le fichier sur le terminal pour retrouver son chemin absolu).
Vous pouvez aussi faire chmod u+x NomDuScript si vous ne souhaitez accorder les droits d'exécution qu'à l'utilisateur propriétaire (voir ici pour en savoir plus).
Pour exécuter le script, après lui avoir donné les droits d'exécution, il suffit de rentrer le chemin absolu ou tout simplement de faire ./CheminRelatifDuScript (./NomDuScript si vous êtes, via le shell, dans le répertoire ou se situe le script).
Exemple : On va prendre l'exemple des commandes echo, man, read et sleep (voir leur utilisations dans la liste)
Voici le script que cela devrait donner :
Code : Bash
#!/bin/bash(1) Ici echo affichera la ligne "La page du man va s'ouvrir"
# ceci est commentaire
echo "La page du man va s'ouvrir ..." #(1)
read # (2)
man man # (3)
sleep 2 # (4)
(2) read marque une pause jusqu'à ce que l'on appuie sur une touche
(3) man man ouvre une page de manuel sur le manuel en console
(4) sleep 2 marquera deux secondes de pause
Vous faite ensuite chmod +x NomDuScript, et vous pourrez lancer ce script (cible) dans un terminal avec ./NomDuScript. Celui-ci ouvriras la page du man sur le man.
Cette commande est utile pour avoir le temps de lire les messages d'erreurs si jamais la commande précédente ne s'exécute pas correctement ... Par exemple, imaginez que ce script serve à lancer un exécutable, mais que vous ayez déplacé cet exécutable, cette commande vous permettrait d'avoir le temps de lire le message d'erreur avant que le script ne se ferme. Vous auriez aussi pu mettre read à la place, ainsi, le script ne se fermerait pas avant que vous n'appuyez sur une touche ...
II - Les variables :
Les variables en Bash, ne servent pas qu'à désigner une valeur, elle peuvent désigner du texte, une commande Bash, etc. Déclarer une variable en Bash est très simple, il suffit de l'introduire, par une affectation, comme ceci :
Code : Bash
#!/bin/bash
NomDeLaVariable=X #(1)
Attention : Il ne faut pas avoir d'espaces de part et d'autres du signe = !
Pour demander le contenu d'une variable, il faut utiliser read comme ceci :
Code : Bash
#!/bin/bashDans l'exécution, il faut saisir la valeur de la variable puis appuyer sur [ENTER].
read Variable # saisie de la valeur de la variable
Pour l'afficher, il suffit d'utiliser echo comme ceci :
Code : Bash
echo $NomDeLaVariable #(1)
(1) $ sert ici à afficher le contenue de la varible qui peut être une valeur, du texte (ne pas oublier les guillemets), une commande, etcCode : Bash
#!/bin/bash
Variable=CommandeBash # (1)
$Variable # (2)
(2) Ici $ permet ici d'exécuter la commande
Code : Bash
#!/bin/bash
echo "Quelle commande souhaitez vous exécuter ?"
read Commande # saisie de la commande
$Commande # exécution de la commande
read

Bon aller ... encore deux petits autres :
Code : Bashet
#!/bin/bash
Texte="La man page du man va s'ouvrir ..."
echo $Texte # affichage du texte
man man
read
#!/bin/bash
echo "écrivez le texte que vous souhaitez afficher"
read Texte # saisie du texte
echo "$Texte" # affichage du texte
read
III - Les tests (ou conditions) en Bash :
1) Le test if :
Le test if peut s'écrire de deux manière. Voici les deux syntaxes possibles :
Code : Bash
if test $Variable #condition
then # alors
# vos commandes ici
fi # fin du bloc if (fi = if à l'envers)
Code : Bash
if [ $Variable #condition ]
then # alors
# vos commandes ici
fi # fin du bloc if
Pour en savoir plus sur les fonctions de test, faites man test en console.
Attention aux espaces après le [ et avant le ].
Exemple :
On va prendre un exemple : Un script qui vous demande si vous voulez afficher la man page du man avec 0 et 1 (1= oui, 0= non).
Code : Bash
#!/bin/bash
echo "Voulez-vous afficher la man page du man ?"
read Variable # saisie de la variable
if test $Variable -eq 1 # si Variable vaut 1
then # alors
man man
fi # fin du bloc if
read
Code : Bash
#!/bin/bash
echo "Voulez-vous afficher la man page du man ?"
read Variable # saisie de la variable
if [ $Variable -eq 0 ] # si Variable vaut 1
then # alors
man gcc
fi # fin du bloc if
read
2) Le test case :
Le test case est analogue au switch en C, il permet d'éviter une longue et fastidieuse succession de blocs if dans certains cas. Voici la syntaxe d'un test case.
Code : Bash
read Variable # saisie de la valeur de la variable
case $Variable in
Valeur1) # (1)
#Commande 1 ;;
Valeur2) # (2)
#Commande 2 ;;
# ...
*) # (3)
# Commande qui s'éxécute par défaut ;;
esac # fin du bloc case
(1) si l'utilisateur choisi la valeur 1, alorsla commande 1 s'exécute
(2) si l'utilisateur choisi la valeur 2, alorsla commande 2 s'exécute
(3) si l'utilisateur choisi autre chose, la commande par défaut s'exécute
N'oubliez pas le esac (case à l'envers) pour marquer la fin du bloc case.
Un exemple comme d'habitude : on va reprendre le menu Mc Do du sdz
étant l'exemple d'utilisation de la condition switch en C. C'est partit :
Code : Bash
#!/bin/bash
echo "=== Menu ==="
echo "1. Royal Cheese"
echo "2. Mc Deluxe"
echo "3. Filet-o-Fish"
echo "4. Big Mac"
echo "Votre choix ?"
read choixMenu # saisie de la valeur de la variable
case $choixMenu in
1)
echo "Vous avez choisi le Royal Cheese. Bon choix !" ;;
2)
echo "Vous avez choisi le Mc Deluxe. Berk, trop de sauce..." ;;
3)
echo "Hum pas mal mais c'est bien petit :( " ;;
4)
echo "Vous avez choisi le Big Mac. Vous devez avoir tres faim !";;
*)
echo "Vous n'avez pas rentre un nombre correct. Vous ne mangerez rien du tout !" ;;
esac # fin du bloc case
echo "Appuyez sur une touche pour continuer ..."
read
IV - Les boucles en Bash :
Les boucles permettent de répéter une ou plusieurs
opérations tant qu'une condition reste validée.
1) La boucle while :
Voilà comment on construit une boucle while :
Code : Bash
while [ #condition ]
do
# instructions à répéter
done
Et voici la deuxième syntaxe possible :
Code : Bash
while test #condition
do
# instructions à répéter
doneExemple :
Code : Bash
#!/bin/bashquitter=1
while [ $quitter != 0 ]
do
echo "Appuyez sur 0 pour quitter ..."read quitter
echo "vive le Bash !"
done
echo "bye !"
readvoici la deuxième manière d'écrire ce script :
Code : Bash
#!/bin/bashquitter=1
while test $quitter != 0 echo "Appuyez sur 0 pour quitter ..."
do
read quitter
echo "vive le Bash !"
done
echo "bye !"
read
Autre exemple : exemple inverse du précédant (on répète la phrase "vive le bash !"
tant qu'une variable vaut 0) :
Code : Bash
continuer=0
while test $continuer -eq 0
# ou -> while [$continuer -eq 0 ]
do
echo "Appuyez sur 0 pour répéter ..."
read quitter
echo "vive le Bash !"
done
echo "bye !"
read
2) La boucle for :
J'en vient directement à l'intérêt de la boucle for par rapport à la boucle while
à l'aide d'un exemple : on veut par exemple répeter la phrase "vive Linux"
tant que la valeur d'une variable est comprise entre 0 et 10 (exclus).
Code : Bash
#!/bin/sh
i=0
for i in `seq 0 10`
do
echo "vive Linux !"
read i
done
echo "bye !"
read
Et voilà pour la boucle for 
V - Les fonctions en Bash :
Les fonctions sont très simples à faire en Bash, elles permettent
de ne pas répéter plusieurs fois le même bloc. Il faut indiquer
clairement lorque vous déclarez une fonction. On enchaîne avec plusieurs
exemples
...
Un exemple bête :
Code : Bash
#!/bin/sh
function hello # déclaration de la fonction
{
echo "Salut $1 !"
#le $1 sert à insérer le contenu d'une variable,
celui de la variable qui suivra l'appel de la fonction
}
echo "Comment t'appelles tu ?"
read name
hello $name
read
L'exemple utile de la fonction pause :
Code : Bash
function pause # déclaration de la fonction
{
echo "Appuyez sur une touche pour continuer ..."
read
}
pause # appel de la fonction
Voici quelques exercices pour vous entrainer, si vous avez besoin d'aide,
rendez-vous dans la catégorie Linux & Bash du forum.
Exercices :
n°1 - Le mini IDE en C (niveau 1) :
Ce programme doit vous proposer (par y ou n) de créer (avec un éditeur
de texte en console) un fichier.c puis doit vous proposer de le compiler.
Il est nécessaire pour la réalisation cet exercice, d'avoir lu l'article jusqu'au
test if. Si vous ne connaissez pas commandes, n'hésitez pas à consulter la liste.
solution
Idée d'amélioration : faites en sorte avec une boucle, que le script
ne se ferme pas tant que l'utilisateur n'appuie pas sur q.
solution
n°2 - Le mini IDE en C (niveau 2) :
Il faut cette fois créer un menu qui propose à l'utilisateur de
créer un programme en C, en C++ ou de créer un script en Bash,
il est donc nécessaire pour faire cet exercice, d'avoir lu l'artcile
jusqu'au test case.
solution
Idées d'amélioration : insérez dans le menu, une option quitter
et utilisez une boucle qui répète le programme à partir du menu
jusqu'à ce que l'utilisateur quitte. Vous pouvez aussi insérez des
warnings dans la compilation du programme en C (voir cet article
pour en savoir plus).
solution
D'autres exercices sont à venir ...


Commentaires
ok site : linuxinfosastuces.blog4ever.com | le 01/03/2009 à 12:29:32N'hésitez pas à laisser vos commentaires ainsi qu'une note sur cet article. Vous pouvez aussi corriger d'éventuelles erreurs. Cependant pour l'aide à la réalisation des exercices veuillez vous rendre sur le forum adéquat. Merci d'avance. Comme vous l'avez peut être remarqué, l'article a été refait en raison d'un bug. Il avait donc été crée le 2008-12-30 et été consulté 590 fois (il faudra donc que vous ajoutiez 590 au nombre de consultation actuel).
Jacque13 le 18/11/2009 à 15:22:09
Je tenais a te feliciter pour cet article qui est trés interessant et trés complet.
j'ai appris beaucoup grace a toi !!
10*100 merci
ok site : linuxinfosastuces.blog4ever.com | le 20/11/2009 à 22:53:40
Merci ... il est pourtant encore incomplet et imprécis. Je le mettrai à jour quand j'aurais le temps.
lafai le 10/12/2009 à 18:45:13
slt cv
overplop le 03/02/2010 à 11:01:20
Salut,
Nickel ton pti tuto, ca rafraichit bien les connaissances.
Juste petit détail, lors de ton explication dans la deuxième façon de faire une condition, tu as écrit :
if [ $Variable -eq 0 ] # si Variable vaut 1
petite différence entre 0 et 1 qui se contredise.
Merci ++
tarafils le 04/02/2010 à 11:17:44
pour la deuxieme exemple de test if c' est
if [ $Variable -eq 1 ] on affiche la man page du man
puisque apres vous ditez que "Les deux test peuvent ce traduire par la phrase "si Variable vaut 1, alors affichons la man page du manuel".