Introduction à la Programmation Shell Linux
Introduction à la Programmation Shell Linux
2009/2010
Faculté des Sciences et techniques Génie informatique -
IRISI
Marrakech Systèmes
d’exploitations
I à L
P S
M. BOUDGUIG
F.S.T.G Marrakech
[email protected]
On aurait très bien pu faire tout cela en écrivant un programme en C par exemple.
Le gros avantage des scripts shell, c'est que ce langage est totalement intégré à Linux :
il n'y a rien à installer et rien à compiler. Et surtout : vous avez très peu de nouvelles
choses à apprendre. En effet, toutes les commandes que l'on utilise dans les scripts shells
sont des commandes du système que vous connaissez déjà : ls, cut, grep, sort...
2
[email protected]
1
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
Différents environnements console:les shell
La différence est moins tape-à-l'oeil que dans le mode graphique (où on voit de suite que
les menus ne sont pas à la même place par exemple).
La console a toujours un fond noir et un texte blanc (au moins au départ).
En revanche, les fonctionnalités offertes par l'invité de commande peuvent varier en
fonction du shell que l'on utilise.
Les différents environnements console sont appelés des shellshell.
Voici les noms de quelques-uns des principaux shell qui existent :
sh : Bourne Shell. L'ancêtre de tous les shells.
bash : Bourne Again Shell.
Shell Une amélioration du Bourne Shell
Shell, disponible par défaut sous
Linux et Mac OS X.
ksh : Korn Shell. Un shell puissant assez présent sur les Unix propriétaires, mais aussi
disponible en version libre, compatible avec bash.
csh : C Shell. Un shell utilisant une syntaxe proche du langage C.
tcsh : Tenex C Shell. Amélioration du C Shell.
Zsh : Z Shell. Shell assez récent reprenant les meilleures idées de bash, ksh et tcsh.
3
[email protected]
2
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
Différents environnements console:les shell
A quoi peut bien servir le sh aujourd'hui alors,si bash est par défaut sous Linux?
Sh reste toujours plus répandu que bash. En fait, vous pouvez être sûr que tous
les OS basés sur Unix possèdent sh, mais ils n'ont pas tous forcément bash.
D'autres OS basés sur Unix, notamment les OS propriétaires (AIX et Solaris...),
utilisent souvent d'autres types de shell. Le ksh par exemple y est très répandu.
A quoi sert un shell ?
Le shell est en fait le programme qui gère l'invite de commandes. C'est donc le programme
qui attend que
q q vous rentriez des commandes.
C'est aussi le programme qui est capable par exemple de :
- Se souvenir quelles étaient les dernières commandes tapées (vous remontez dans votre
historique en appuyant sur la flèche vers le haut ou en faisant une recherche avec un
Ctrl + R).
- Auto-compléter une commande ou un nom de fichier lorsque vous appuyez sur Tab.
3
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
Installer un nouveau shell
Une fois
f installé,
llé ill faut
f demander
d d à l'utiliser
l' l pour votre compte utilisateur.
l
Tapez pour cela : samir@samir-desktop:~$ chsh
chsh signifie "Change Shell".
On vous demandera où se trouve le programme qui gère le shell.
Vous devriez indiquer /bin/ksh pour ksh, /bin/sh pour sh, /bin/bash pour bash, etc.
Quelle importance a tout ceci lorsqu'on réalise un script shell ?
Si on parle de cela, c'est parce qu'un script shell dépend d'un shell précis.
En gros, le langage n'est pas tout à fait le même selon si vous utilisez sh, bash, ksh, etc.
Il est possible d'écrire des scripts sh par exemple. Ceux-là, on est sûr qu'ils fonctionnent
partout car tout le monde possède un shell "sh".
Toutefois, c'est le plus vieux shell, et écrire des scripts en sh est possible mais pas
facile ou ergonomique.
4
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
samir@samir-desktop:~$ vim essai.sh
Notre premier script
Si essai.sh n'existe pas, il sera créé (ce qui sera le cas ici).
On a donné ici l'extension ".sh" à mon fichier. On le fait souvent par convention pour
indiquer que c'est un script shell, mais ce n'est pas une obligation.
Certains scripts shell n'ont d'ailleurs pas d'extension du tout (on aurais pu appeler notre
script "essai" tout court donc).
Indiquer le nom du shell utilisé par le script
Vim est maintenant ouvert et vous avez un fichier vide sous les yeux.
La première chose à faire dans un script shell est d'indiquer... quel shell est utilisé.
En effet, comme on l’amentionné plus tôt, la syntaxe du langage change un peu selon si on
utilise "sh", "bash", "ksh", etc.
En ce qui nous concerne, nous souhaitons utiliser la syntaxe de bash qui est le plus
répandu sous Linux et qui est plus complet que sh.
Nous indiquons où se trouve le programme bash :
#!/bin/bash
5
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
Exécution de commandes
#!/bin/bash
Après le sha-bang, nous pouvons commencer à coder.
Le principe est très simple : il vous suffit d'écrire les commandes que vous souhaitez
exécuter. Ce sont les mêmes que celles que vous tapiez dans l'invite de commandes !
ls : pour lister les fichiers du répertoire
cd : pour changer de répertoire
mkdir : pour créer un répertoire
grep : pour rechercher un mot
sort : pour trier des mots
etc.
Bref, tout ce que vous avez appris, vous pouvez le réutiliser ici !
Allez, on va commencer par quelque chose de très simple : un ls.
On va donc créer un script bash qui va juste se contenter d'afficher le contenu du dossier
courant : C’est tout.
#!/bin/bash
ls
11
[email protected]
6
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
Donner les droits d'exécution au script
#!/bin/bash
Si vous faites un ls -l pour voir votre fichier qui vient d'être créé, vous obtenez ça :
samir@samir-desktop:~$ ls –l
total 4
-rw-r--r– 1samir samir 17 2009-12-01 14:33 essai.sh
Ce qui nous intéresse ici, ce sont les droits sur le fichier : -rw-r--r--
Si vous vous souvenez un petit peu de ce cours sur les droits, vous devriez vous rendre
compte que notre script peut être lu par tout le monde (r), écrit uniquement par nous (w),
et n'est p
pas exécutable (pas
(p de x). )
Or, pour exécuter un script, il faut que le fichier ait le droit "exécutable".
Le plus simple pour donner ce droit est d'écrire : samir@samir-desktop:~$ chmod +x essai.sh
Vous pouvez vérifier que le droit a bien été donné :
samir@samir-desktop:~$ ls –l
total 4
-rwxr-xr–x 1samir samir 17 2009-12-01 14:33 essai.sh
13
[email protected]
Que fait le script ? Il fait juste un ls, donc il affiche la liste des fichiers dans le répertoire
(ici, il y avait seulement "essai.sh" dans mon répertoire)
Bien entendu, ce script est inutile. Il était plus simple de taper "ls" directement.
Cependant, on va pouvoir faire beaucoup mieux que ça dans les prochains chapitres.
Vous pouvez déjà modifier votre script pour qu'il vous donne auparavant #!/bin/bash
aussi le nom du répertoire dans lequel vous vous trouvez : pwdd
Les commandes seront exécutées l'une après l'autre : ls
samir@samir-desktop:~$ ./essai.sh
/home/samir/scripts
essai.sh
7
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
#!/bin/bash
Exécution de débuggage
Plus tard, vous ferez probablement de gros scripts et vous risquez de rencontrer des bugs.
Il faut donc dès à présent que vous sachiez comment débugger un script.
Il faut l'exécuter comme ceci : samir@samir-desktop:~$ bash -x essai.sh
On appelle en fait directement le programme bash et on lui ajoute en paramètre un -x
(pour lancer le mode débuggage) et le nom de notre script à débugger.
Le shell affiche alors le détail de l'exécution de votre script, ce qui peut vous aider à
retrouver la cause de vos erreurs : samir@samir-desktop:~$ bash -x essai.sh
+ pwd
/h
/home/samir/scripts
/ i/ i t
+ ls
essai.sh
Créer sa propre commande
Actuellement, le script doit être lancé via ./essai.sh et vous devez être dans le bon
répertoire (ou alors vous devez taper le chemin en entier, comme
/home/samir/scripts/essai.sh).
15
[email protected]
8
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell #!/bin/bash
Afficher et manipuler des variables
Résumons ce que nous savons :
• Le bash est le programme qui gère l'invite de commande de la console sous Linux.
C'est aussi un langage de programmation. On parle de "shell".
• D'autres shells existent, tels sh, ksh, zsh... Bash sera utilisé car c'est le shell par défaut
sous la plupart des distributions Linux.
• Toutes les commandes que vous avez appris à taper dans la console depuis le début du
cours peuvent être utilisées pour réaliser des scripts shell : grep, cut, ls, pwd...
Les scripts shell ne sont donc qu'un assemblage de ces commandes !
Comme dans tous les langages
g g de programmation,
p g , on trouve en bash ce q
qu'on appelle
pp des
variables. Elles nous permettent de stocker temporairement des informations en mémoire.
C'est en fait la base de la programmation.
Les variables en bash sont assez particulières. Il faut être très rigoureux lorsqu'on les
utilise. Si vous avez fait du C ou d'autres langages de programmation, vous allez être un
peu surpris de leur mode de fonctionnement, soyons donc attentif.
9
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
Déclarer une variable
Exécutez-le pour voir ce qui se passe (après avoir samir@samir-desktop:~$
@ d k $ ./variables.sh
/ bl h
Modifié les droits pour le rendre exécutable bien sûr) : $
Il ne se passe rien !
Qu'est-ce que le script fait alors ?
Il met en mémoire le message Bonjour tout le monde, et c'est tout !
Rien ne s'affiche à l'écran !
Pour afficher une variable, il va falloir utiliser une commande dont on a pas encore parlé...
echo : afficher une variable
Avant de commencer à parler de variables, il y a une commande qu’on va traiter : echo.
Son principe est très simple : elle affiche dans la console le message demandé.
Un exemple : samir@samir-desktop:~$ echo Salut tout le monde
Salut tout le monde
Si vous voulez insérer des retours à la ligne, il faudra $ echo -e "Message\nAutre ligne"
activer le paramètre -e et utiliser le symbole \n : Message
Autre ligne
19
[email protected]
Comparez les lignes 3 et 4 : lorsqu'on déclare la variable à la ligne 3, on ne doit pas mettre
de $ devant. En revanche, lorsqu'on l'affiche à la ligne 4, on doit cette fois mettre un $ !
Cette fois ci après exécution on reçoit : Bonjour tout le monde
10
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
echo : afficher une variable (Les quotes)
Il est possible d'utiliser des quotes pour délimiter un paramètre qui contient des espaces.
Il existe 3 types de quotes :
Les apostrophes ' ' (simples quotes)
Les guillemets " " (doubles quotes)
Les accents graves ` ` (back quotes), qui s'insèrent avec Alt Gr + 7 sur un clavier azerty
français.
Selon le type de quote que vous utilisez, la réaction de Bash ne sera pas la même.
Les simples quotes ' '
1 #!/bin/bash
Commençons par les simples quotes : 2
Avec des simples quotes, la variable n'est pas analysée et le $ est affiché tel quel.
11
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
read : demander une saisie
Vous pouvez demander à l'utilisateur de saisir du texte avec la commande read.
Ce texte sera immédiatement stocké dans une variable. read nomvariable
12
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
-n : limiter le nombre de caractères
Avec -n, vous pouvez couper au besoin au bout de X caractères si vous ne voulez pas que
l'utilisateur rentre un message trop long.
1 #!/bin/bash
Exemple : 2
3 read -p 'Entrez votre login (5 caractères max) : ' -n 5 nom
4 echo "Bonjour $nom !"
Notez
N t que lle b bash
h coupe automatiquement
t ti t au b
boutt dde 5 caractères,
tè sans que vous ayez
besoin d'appuyer sur la touche Entrée. Ce n'est pas très esthétique du coup, parce que le
message s'affiche sur la même ligne.
Pour éviter cela, vous pouvez faire un 1 #!/bin/bash
2
echo avec des \n comme vous avez
3 read -p 'Entrez votre login (5 caractères max) : ' -n 5 nom
appris à le faire plus tôt : 4 echo -e "\nBonjour $nom !"
1 #!/bin/bash
2
3 read -p 'Entrez le code assez vite (vous avez 5 secondes) : ' -t 5 code
4 echo -e "\ntrop tard !"
13
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
-s : ne pas afficher le texte saisi
Plus utile probablement, le paramètre -s masque les caractères que vous saisissez.
Cela vous servira notamment si vous voulez que l'utilisateur rentre un mot de passe :
1 #!/bin/bash
2
3 read -p 'Entrez votre mot de passe : ' -s pass
4 echo -e "\nMerci ! Tout le monde saura que votre mot de passe est $pass ! "
Notez qu'il est possible aussi de contracter les commandes, comme cela se fait en langage C.
Ainsi : est équivalent à écrire:
1 #!/bin/bash 1 #!/bin/bash
2 2
3 let "a = a * 3" 3 let "a *= 3"
14
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
Les variables d'environnement
$ env
e
A t ll
Actuellement,t les
l variables
i bl que vous créez
é ORBIT_SOCKETDIR=/tmp/orbit-samir
dans vos scripts bash n'existent que dans GLADE_PIXMAP_PATH=:/usr/share/glade3/pixmaps
ces scripts. En clair, une variable définie TERM=xterm
dans un programme A ne sera pas utilisable SHELL=/bin/bash
dans un programme B. GTK_MODULES=canberra-gtk-module
USER=samir
Les variables d'environnement sont des PATH=/home/samir/bin:/usr/local/sbin:
variables que l'on peut utiliser dans /usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
n'importe quel programme. GDM_XSERVER_LOCATION=local
On parle aussi parfois de variables globales. PWD=/home/samir/bin
V
Vous pouvez afficher
ffi h toutes
t t celles ll que vous EDITOR=nano
SHLVL=1
avez actuellement en mémoire avec
HOME=/home/samir
la commande env : OLDPWD=/home/samir
[ ... ]
• SHELL : indique quel type de shell est en cours d'utilisation (sh, bash, ksh...)
• PATH : une liste des répertoires qui contiennent des exécutables que vous souhaitez
pouvoir lancer sans indiquer leur répertoire. On en a parlé un peu plus tôt. Si un
programme se trouve dans un de ces dossiers, vous pourrez l'invoquer quel que soit le
dossier où vous vous trouvez.
• EDITOR : l'éditeur de texte par défaut qui s'ouvre lorsque cela est nécessaire.
• HOME : lla position
iti d de votre
t d dossier
i h home.
• PWD : le dossier dans lequel vous vous trouvez.
• OLDPWD : le dossier dans lequel vous vous trouviez auparavant.
Notez que les noms de ces variables sont, par convention, écrits en majuscules.
15
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
Les variables d'environnement
Comment utiliser ces variables dans vos scripts ?
C'est très simple, il suffit de les appeler par leur nom !
Exemple : 1 #!/bin/bash
2 Votre éditeur par défaut est nano
3 echo "Votre éditeur par défaut est $EDITOR"
Plus rarement, vous pourriez avoir besoin de définir votre propre variable d'environnement.
Pour cela, on utilise la commande export que vous avez pu voir dans votre .bashrc.
Les variables des paramètres
Comme toutes les commandes, vos scripts bash peuvent eux aussi accepter des
paramètres. Ainsi, on pourrait appeler notre script comme ceci :
Le problème, c'est que nous n'avons toujours pas vu comment récupérer ces paramètres
dans notre script.
Pourtant, c'est très simple à faire !En effet, des variables sont automatiquement créées :
1 #!/bin/bash
$# : contient
ti t lle nombre
b dde paramètres
èt 2
$0 : contient le nom du script exécuté 3 echo "Vous avez lancé $0, il y a $# paramètres"
(ici "./variables.sh") 4 echo "Le paramètre 1 est $1"
$1 : contient le premier paramètre
$2 : contient le second paramètre $ ./variables.sh param1 param2 param3
... Vous avez lancé ./variables.sh, il y a 3 paramètres
$9 : contient le 9ème paramètre Le paramètre 1 est param1
16
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell $ ./variables.sh param1 param2 param3
Les variables des paramètres
Et si on utilise plus de 9 paramètres ? En fait Rien ne nous empêcherait de lui envoyer 15
paramètres dans ce cas :
$ ./variables.sh param1 param2 param3 … param15
Pour traiter autant de paramètres, on les fera en général un par un..
On peut "décaler" les paramètres dans les variables $1 $2 etc. avec la commande shift.
Reprenons notre script :
1 #!/bin/bash
Comme vous le voyez, les paramètres ont été 2
décalés : $1 correspond après le shift au second 3 echo "Le paramètre 1 est $1"
paramètre $2 au troisième paramètre
paramètre, paramètre, etc
etc. 4 shift
5 echo "Le paramètre 1 est maintenant $1"
Bien sûr, shift est généralement utilisé dans
une boucle qui permet de traiter les paramètres
un par un. $ ./variables.sh param1 param2 param3
Le paramètre 1 est param1
Le paramètre 1 est maintenant param2
Pour définir un tableau, on peut faire comme ceci : tableau=('valeur0' 'valeur1' 'valeur2')
Cela crée une variable tableau qui contient 3 valeurs
(valeur0, valeur1, valeur2).
Pour accéder à une case du tableau, on doit utiliser la syntaxe suivante : ${tableau[2]}
ceci affichera le contenu de la case n°2 ((donc "valeur2").
)
17
Université cadi Ayyad Année universitaire
2009/2010
Faculté des Sciences et techniques Génie informatique-
IRISI
Marrakech Systèmes
Linux Programmation
d’exploitation
Shell
Programmation Shell
Les tableaux 1 #!/bin/bash
2
Essayons tout ceci dans un script : 3 tableau=('valeur0' 'valeur1' 'valeur2')
et on aura comme résultat: valeur1 4 tableau[5]='valeur5'
5 echo ${tableau[1]}
Comme vous pouvez le constater, le tableau peut avoir autant de cases que vous le désirez.
La numérotation n'a pas besoin d'être continue, vous pouvez sauter des cases sans
problème (la preuve, il n'y a pas de case n°3 ni de case n°4 dans mon script précédent).
Vous pouvez afficher l'ensemble du contenu du tableau d'un seul coup en utilisant
${
${tableau[*]}
[ ]} : 1 #!/bin/bash
2
3 tableau=('valeur0' 'valeur1' 'valeur2')
4 tableau[5]='valeur5'
5 echo ${tableau[*]}
18