Linux Chapitre 6: Programmation Shell
Programmation Shell
page : 79
Linux Chapitre 6: Programmation Shell
Le Shell
❖ Un Shell est un programme exécuté par le système, c’est
un interpréteur de commandes qui :
▪ initialise l’environnement de l ’utilisateur
▪ affiche un prompt, lit et exécute les instructions tapée par
l ’utilisateur
❖ quand une commande est tapée, le shell :
▪ interprète les variables les méta caractères
▪ gère les redirections et les tubes (« pipes »)
▪ interprète la commande
▪ exécute la commande
page : 80
Linux Chapitre 6: Programmation Shell
Le Shell (2)
❖ Il existe plusieurs shell, sur les systèmes de type Unix, dont
les plus connus sont les suivants :
▪ Bash (le Bourne Again SHell).
▪ 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.
page : 81
Linux Chapitre 6: Programmation Shell
Les variables
❖ une variable du Shell est un nom associé à une valeur
❖ par défaut, toutes les variables sont initialisées à NULL
(vide)
❖ certaines variables sont prédéfinies
❖ les utilisateurs peuvent définir et utiliser leurs propres
variables
page : 82
Linux Chapitre 6: Programmation Shell
Les variables (2)
Quelques variables prédéfinies :
❖ HOME répertoire de login
❖ PATH répertoires à inspecter pour trouver les
commandes tapées par l ’utilisateur
❖ TERM type du terminal
❖ PWD directory courante
page : 83
Linux Chapitre 6: Programmation Shell
Les variables (3)
Affectation des variables du shell :
❖ Syntaxe :
NomDeLaVariable=value
❖ Exemples :
Ubuntu:~/tmp$ MY_NAME=Ubuntu
Ubuntu:~/tmp$ MESS=/usr/man/man1/ls.1
Ubuntu:~/tmp$ var5="Bonjour tout le monde"
page : 84
Linux Chapitre 6: Programmation Shell
Les variables (4)
Renvoi de la valeur d ’une variable
❖ Syntaxe:
$NomDeLaVariable
❖ Exemples:
Ubuntu:~/tmp$ echo $MY_NAME
Ubuntu
Ubuntu:~/tmp$ echo $MESS
/usr/man/man1/ls.1
Ubuntu:~/tmp$ more $MESS
<contenu of /usr/man/man1/ls.1>
page : 85
Linux Chapitre 6: Programmation Shell
Les petits exemples
$ V1=toto
$ echo $V1
toto
$ V2=’titi tutu’
$ echo $V2
titi tutu
$ echo ’$V2’
$V2
$ echo "$V1 $V2"
toto titi tutu
$ V3="$V1 $V2 tata"
$ echo $V3
toto titi tutu tata
Attention à la différence entre ". . . " et ’. . . ’!
page : 86
Linux Chapitre 6: Programmation Shell
Parenthèse: substitution de commandes
❖ Stocker le résultat de l’appel à une commande
dans une variable?
$ msg="Je travaille dans ‘pwd‘" # Old-style
$ echo $msg
Je travaille dans /tmp
$ msg="Je travaille dans $(pwd)" # ksh/bash-style
$ echo $msg
Je travaille dans /tmp
...
page : 87
Linux Chapitre 6: Programmation Shell
Les scripts Shell
❖ Un script est un fichier contenant un ensemble de commandes
exécutées séquentiellement
▪ Sous forme de fichier texte contenant des commandes
❖ Le script ne peut être exécuté que par un interpréteur
▪ « /bin/bash » pour le Bash
▪ « /bin/sh » pour le Sh
▪ « /bin/zsh » pour le Zsh
❖ Le langage de script Shell est un langage évolué offrant de
nombreuses possibilités
▪ Boucles, variables, tests avec if, création de fonctions, …
❖ Dans quels cas utilise-t-on les scripts ?
▪ Pour effectuer un travail répétitif
▪ Pour des tâches d’administration système
▪ Pour installer des programmes
▪ Au démarrage du système pour démarrer les services et applis
page : 88
Linux Chapitre 6: Programmation Shell
Exécuter un script
❖ Pour exécuter le script, il faut appeler l’interpréteur
Ubuntu@localhost:~ # bash monscript
❖ Possibilité de simplifier l’appel en ajoutant la ligne suivante en tête du
script
#!/bin/bash
▪ L’appel est alors plus simple
root@localhost:~ # ./monscript
❖ L’utilisateur courant doit posséder le droit « x » pour le fichier
▪ Exemple : Seul, l’utilisateur « ubuntu » pourra exécuter le script
-rwxr--r-- 1 Ubuntu info 7406 2008-08-15 14:44 [Link]
▪ Pour autoriser les membres du groupe « info »
chmod g+x [Link]
page : 89
Linux Chapitre 6: Programmation Shell
Variables de substitution
❖ Elles sont définies implicitement et peuvent être utilisées à tout
moment dans le script
❖ Quelques variables utiles
▪ $0 : Nom du script (Utile lorsqu’on renomme le script)
▪ $1 à $9 : Argument 1 à 9 passés au script
▪ $# : Nombre d’arguments passés au script
▪ $? : Résultat de la commande précédente
❖ Exemple: en peut remplacer @ par * pour certain systemes
#!/bin/bash
echo "La commande $0 a $# paramètre(s), que voici : $@"
❖ Exécution
Ubuntu@localhost:~ # ./params bla ble bli blo blu
La commande ./params a 5 paramètre(s), que voici : bla ble bli blo blu
page : 90
Linux Chapitre 6: Programmation Shell
Commandes orientées Shell
❖ echo : affichage de texte sur la sortie standard
❖ expr : évaluation d'expressions numériques
❖ read : entrée standard
❖ clear : efface l'écran
page : 91
Linux Chapitre 6: Programmation Shell
echo
❖ Syntaxe :
$ echo [-n] message
❖ Description :
La commande echo affiche sur la sortie standard les messages passés en
paramètres (après leur interprétation par le Shell).
❖ Option courante :
-n n'affiche pas de saut de ligne final
❖ Exemple :
$ echo ceci est un petit message
ceci est un petit message
$ echo $PATH
/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin:/home/rossigno
l_d/bin
page : 92
Linux Chapitre 6: Programmation Shell
expr
❖ Syntaxe :
$ expr expression
❖ Description :
Expression spécifie une opération arithmétique ou de traitements de chaînes
de caractères
❖ Exemple :
$ X=12
$ expr $X + 2
14
$ var1=10
$ var2=20
$ var3=$(expr $var2 / $var1)
$ echo $var3
2
page : 93
Linux Chapitre 6: Programmation Shell
read
❖ Syntaxe :
$ read variable [ variable … ]
❖ Description :
lit l ’entrée standard et affecte ce qui est lu aux variables
❖ Exemple :
$ read A
$ echo $A
$ read M1 M2 M3
$ echo $M3 $M2 $M1
$ echo -n ’Enter your name: ’; read name; echo "Hi, ${name}"
Enter your name: etudiant
Hi, etudiant
page : 94
Linux Chapitre 6: Programmation Shell
Exemples
$ vi test3 $ vi test5
#!/bin/bash #!/bin/bash
# display user information from the system. # using the backtick character
echo "User info for userid: $USER" testing=`date`
echo UID: $UID
echo "The date and time are: " $testing
echo HOME: $HOME
$ vi test4 $ vi test6
#!/bin/bash #!/bin/bash
# testing variables # An example of using the expr command
days=10 var1=10
guest="Katie" var2=20
echo "$guest checked in $days days ago" var3=`expr $var2 / $var1`
days=5 echo The result is $var3
guest="Jessica"
echo "$guest checked in $days days ago"
page : 95
Linux Chapitre 6: Programmation Shell
Structure de contrôle « if »
Le test if :
Permet d’effectuer une exécution conditionnelle.
Le test if peut s'écrire de deux manière:
if test $Variable #condition
then # alors
# vos commandes ici
fi # fin du bloc if (fi = if à l'envers)
et
if [ $Variable ] #condition
then # alors
# vos commandes ici
fi # fin du bloc if
page : 96
Linux Chapitre 6: Programmation Shell
Structure de contrôle « if » (2)
Il est également possible d'utiliser les conditions else (sinon) et elif (de else if qui signifie
sinon si) dans le même bloc :
if [ $Variable #condition ]
then # alors
# vos commandes ici
elif [ $Variable #condition ]
then
# vos commandes ici
else
# vos commandes ici
fi # fin du bloc if
! Attention aux espaces après le [ et avant le ].
page : 97
Linux Chapitre 6: Programmation Shell
Liste des opérateurs
❖ Certains opérateurs sont toutefois particulier en Bash, en voici une liste :
page : 98
Linux Chapitre 6: Programmation Shell
Liste des opérateurs (2)
page : 99
Linux Chapitre 6: Programmation Shell
Exemples
#!/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
Voici la deuxième façon d'écrire ce script :
#!/bin/bash
echo "Voulez-vous afficher la man page du gcc ?"
read Variable # saisie de la variable
if [ $Variable -eq 0 ] # si Variable vaut 0
then # alors
man gcc
fi # fin du bloc if
page : 100
Linux Chapitre 6: Programmation Shell
Structure de contrôle « case »
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.
read Variable # saisie de la valeur de la variable
case $Variable in
Valeur1)
Commande 1 ;;
Valeur2)
Commande 2 ;;
...
*)
Commande qui s'éxécute par défaut ;;
esac # fin du bloc case
page : 101
Linux Chapitre 6: Programmation Shell
Les boucles (1)
La boucle while :
Voilà comment se construit une boucle while :
while [ #condition ]
do
# instructions à répéter
done
Et voici la deuxième syntaxe possible :
while test #condition
do
# instructions à répéter
done
page : 102
Linux Chapitre 6: Programmation Shell
Exemple
On veut créer une boucle qui répète "vive le Bash !" tant que la valeur d'une
variable ne vaut pas 0.
#!/bin/bash
quitter=1
while [$quitter -ne 0 ]
do
echo "Appuyez sur 0 pour quitter ..."
read quitter
echo "vive le Bash !"
done
echo "bye !"
page : 103
Linux Chapitre 6: Programmation Shell
Les boucles (2)
La boucle for :
#!/bin/sh
i=0
for i in `seq 0 10`
do
echo "vive Linux !"
done
echo "bye !“
Ceci aurait pu s'écrire de la manière classique :
#!/bin/sh
i=0
for (( i=0 ; i<$value ; i++ ))
do
echo "vive Linux !"
done
echo "bye !"
page : 104
Linux Chapitre 6: Programmation Shell
Exemples
#!/bin/bash
echo " Liste des répertoires sous `pwd` "
for i in *
do
if [ -d $i ]
then
echo " $i est un répertoire "
fi
done
le chemin sera donné en paramètre:
#!/bin/bash
echo " Liste des répertoires sous $1 "
for i in $1/*
do
if [ -d $i ]
then
echo " $i est un répertoire "
fi
done
page : 105