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 tuto, 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 à noter 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 shells et les script, c'est quoi ?

- Les Shells sont des interfaces qui servent à communiquer avec le système, elles sont le plus généralement présents dans les système de type Unix. Pour les systèmes Unix, il s'agit d'un interpréteur de commande en mode texte.
- Les script sont des programmes en langages interprétés : ce sont des langages qui sont convertit en instructions directement exécutables
par la machine au moment de son exécution. Ces langages sont ici des langages de script : il s'agit de langages de programmation qui permet de manipuler les fonctionnalités du système. Le langage de script le plus utilisé sous Linux est le Bash, il permet d'automatiser vos taches, et c'est celui que nous utiliserons dans l'article.

Le bash, c'est quoi ?

"Bash" signifie "Bourne-Again shell", ce qui est un jeu de mot avec le "Bourne shell" qui est le shell original d'Unix (il y a eu ensuite différents shells) et "born again" qui signifie "né de nouveau" ou encore "réincarné". Le Bourne-Aigain Shell (bash) est le shell du projet GNU basé sur le Bourne Shell (sh), mais lui apportant de nombreuses améliorations provenant d'autres types de shells, notamment du Korn Shell (ksh) et du C shell (csh). Vous pouvez d'ailleurs vérifier si ces shells sont disponnibles dans le répertoire /bin et les installer ci-besoin puis les appeller en console (par défaut c'est bash qui fonctionne dans un terminal sous Linux).

De quoi ai-je besoin pour programmer en Bash ?

Pour développer en Bash, l'utilisation des éditeurs de texte en console tel que Vim ou Emacs est recommandable, je vous renvoie à cet article. Il est aussi recommandé de connaître un minimum de commandes Unix, je vous recommande fortement d'aller visiter au préalable, la liste des commandes Unix couremment utilisées. Vous pouvez également utiliser Idev (voir ici pour l'installation), qui permet de coder en Bash et autres langages de script mais qui permet aussi d'afficher un tutoriel, similaire à celui-ci, en console.

I - Création d'un script sous Linux

Votre script est tout simplement un fichier texte dans lequel vous écrirait les commandes (en fait c'est un peu plus complexe, vous verrez plus tard) que vous voulez exécuter rapidement, ce fichier doit contenir comme première ligne :

Code : Bash
#!/bin/bash
ou plus généralement :

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.

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 le connaître, si le script est dans le repertoire courrant, son chemin devrait ressembler à ./NomDuScript) ...

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
# ceci est commentaire
echo "La page du man va s'ouvrir ..." #(1)
read # (2)
man man # (3)
sleep 2 # (4)
(1) Ici echo affichera la ligne "La page du man va s'ouvrir"
(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, est vous pourez lancer ce scrpit (cible) dans un terminal : celui-ci ouvriras la page du man sur le man


Pourquoi ai-je choisis de mettre sleep à la fin ?

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 comme ceci :

Code : Bash

#!/bin/bash
NomDeLaVariable=X #(1)

(1) NomDeLaVariable est ici notre variable qui a pour valeur X
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/bash
read Variable # saisie de la valeur de la variable
Dans l'exécution, il faut saisir la valeur de la variable puis appuyer sur [ENTER].

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, etc

Pour exécuter le contenu d'une variable lorsqu'il s'agit d'une commande, il faut utiliser $ comme ceci :

Code : Bash

#!/bin/bash
Variable=CommandeBash # (1)
$Variable # (2)

(1) Ici le contenu de la variable (Variable) est une commande de la console
(2) Ici $ permet ici d'exécuter la commande


Voici un exemple d'application sur les variables :

Code : Bash

#!/bin/bash
echo "Quelle commande souhaitez vous exécuter ?"
read Commande # saisie de la commande
$Commande # exécution de la commande
read

Je vous laisse découvrir son exécution

Bon aller ... encore deux petits autres :

Code : Bash
et

#!/bin/bash
Texte="La man page du man va s'ouvrir ..."
echo $Texte # affichage du texte
man man
read

Code : Bash

#!/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)

et

Code : Bash

if [ $Variable #condition ]
then # alors
# vos commandes ici
fi # fin du bloc if

if signifie si en anglais, then signifie alors, et fi désigne la fin du test (if à l'envers).
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

Voici la deuxième façon d'écrire ce script :

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

Les deux test peuvent ce traduire par la phrase "si Variable vaut 1, alors affichons la man page du manuel".

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
done

Exemple :

On veut créer une boucle qui répète "vive la Bash !"  
tant que la valeur d'une variable ne vaut pas 0. 
Voici les deux solutions possibles :

Code : Bash

#!/bin/bash
quitter=1
while
[
$quitter != 0 ]
do
echo "Appuyez sur 0 pour quitter ..."
read quitter

echo "vive le Bash !"
done
echo "bye !"
read

voici la deuxième manière d'écrire ce script :

Code : Bash

#!/bin/bash
quitter=1
while
test
$quitter != 0
do
echo "Appuyez sur 0 pour quitter ..."
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

#!/bin/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

#!/bin/sh
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 ...



Article ajouté le 2009-03-01 , consulté 1221 fois

Commentaires


ok site : linuxinfosastuces.blog4ever.com | le 01/03/2009 à 12:29:32
N'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).

Poster un commentaire





http://





Merci de recopier le nombre présent à gauche dans la case de texte ci-dessous ( Pourquoi ? )





Liens

Voir les articles de la catégorie " Linux et Bash "

Imprimer cet article

Retour aux articles