Vous êtes sur la page 1sur 103

Page 1

Généralités sur le shell

Page 2
 Il existe plusieurs types de shell
 Bourne shell (sh)
 Bash (Bourne Again SHell : bash)
 Korn Shell (kornell university ksh)
 Tcsh (Terminal C shell : csh)
 COMMAND.EXE (MS-DOS), CMD.EXE (Windows)
 Sous Windows : PowerShell (à partir 2008)

 Sous Linux, on peut choisir son shell


 Le shell bash domine le marché actuellement
 Open Source Software

Page 3
 Il s’agit d’une interface texte entre l’utilisateur et le système
 Tout se fait au clavier
 Pas de clic de souris
 L’utilisateur tape des commandes qui sont exécutées par le
système
 Le shell est donc un « interpréteur de commandes »
 Chaque commande a une syntaxe particulière
 Il existe des milliers de commandes différentes
 Les commandes peuvent aussi provenir d’un fichier
 Le fichier contient les commandes à exécuter
 L’utilisateur appel le fichier plutôt que de taper toutes les commandes
• Utile pour les tâches répétitives
 Le shell reste le moyen le plus efficace pour contrôler le système
 C’est aussi le plus utilisé sous Linux/Unix
Page 4
 Le shell est un véritable environnement de programmation
 Variables, boucles, structures de contrôle « if »
 Programmes
 Les programmes écrits pour le shell sont interprétés au moment
de l’exécution
 Aucune compilation préalable n’est utile
 Les performances n’égalent pas un programme en C
 Les programmes écrits pour le shell sont des « scripts » :

Page 5
Commandes et ligne de commandes

Page 6
 Le shell affiche qu’il est prêt à exécuter une commande par un
prompt prenant cette forme:
Utilisateur Répertoire
courant courant

root@foulen:/home/moi# |

Nom de la # : Superutilisateur
machine $ : Utilisateur normal

 Il suffit alors de taper une ligne de commandes pour qu’elle soit


exécutée.

 Une ligne de commandes est une ou plusieurs commandes


(reliées entre elle par un caractère spécial par exemple « ; » ou
encore « | »)
Page 7
 Une simple commande peut être appelée :
 En tapant son nom ses options et ses éventuels arguments

 Exemple1 permettant d’afficher la date et l’heure système (sans


paramètre particulier)
root@foulen:/home/moi# date

 Exemple2 permettant de rechercher dans le répertoire courant les


fichiers dont la taille est supérieure à 2Mo
root@foulen:/home/moi# find ./ -size +2M

 Exemple3 permettant d’afficher la liste détaillée des programmes C


se trouvant dans le répertoire /home/moi/prog
root@foulen:/home/moi# ls –il /home/moi/prog/*.c

Page 8
 Chaque commande dispose d’entrées/sorties :
 Comme l’écran (sortie) ou le clavier (entrée)
 3 types différents:
 L’entrée standard définie par le symbole « stdin » et le descripteur 0
• Provenant du clavier par défaut
 La sortie standard « stdout » et le descripteur 1
• Dirigée vers l’écran par défaut
 La sortie d’erreurs « stderr » et le descripteur 2
• Egalement redirigée vers l’écran par défaut
 Possibilité de modifier le comportement par défaut
 En utilisant les redirections d’entrées/sorties
stdout
stdin Commande
stderr Fichier log

Page 9
 Chaque commande a une syntaxe particulière
 Elle est composée d’options et de paramètres
 Les paramètres permettent de fournir les données nécessaires à
l’exécution de la commande
• Ils sont souvent obligatoires
 Les options permettent d’offrir des fonctionnalités supplémentaires
qui s’adaptent à des besoins spécifiques
• Exemple : Commande « ls -a » qui liste aussi les fichiers cachés
 Exemples de syntaxe (SYNOPSIS de la commande « cp »)
cp [OPTION]... SOURCE... DIRECTORY

commande Paramètre 1 Paramètre 2


Options obligatoire obligatoire
facultatives

 Les options sont précédées de signe « - » :


cp –r /etc/apache.conf apache.conf.bckp

Page 10
 « ls » liste les fichiers d’un répertoire donné
 SYNOPSIS :
ls [OPTION]... [FILE]...

 Quelques options utiles (Attention à la casse) :


 a : Liste les fichiers cachés
 l : Listing long (Plus d’infos sur les fichiers)
 S : Classement par taille de fichiers
 t : Classement par date de modification
 Exemples :
 Listing long avec répertoires cachés et fichiers plus gros en 1er
ls –alS /etc

 Listing long avec fichiers plus récents en 1er :


ls –lt

Page 11
Manuel des commandes

Page 12
 La commande « man » (Manual) permet d’obtenir de l’aide sur la
syntaxe d’une commande
 Très souvent en Anglais et rarement en français
 L’aide est en générale très complète
• Parfois difficile de trouver l’information manquante
 Une page de manuel se décompose en plusieurs parties distinctes
 NAME : Nom et description rapide de la commande
 SYNOPSIS : Syntaxe(s) de la commande
 DESCRIPTION : Description complète de la commande
 OPTIONS : La description des options
 AUTHOR : Un mot sur l’auteur
 BUGS : bugs connus
 SEE ALSO : Autres commandes connexes à consulter également
 … (Dépend des commandes)

Page 13
 Syntaxe :
man commande

 Exemple : Obtenir l’aide en ligne pour la commande « cp »


~# man cp

CP(1) User Commands CP(1)

NAME

cp - copy files and directories

SYNOPSIS

cp [OPTION]... [-T] SOURCE DEST


cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION

Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

Mandatory arguments to long options are mandatory for short options


too…

Page 14
 Il existe plusieurs sections dans une page de manuel
 9 au maximum
 Pour obtenir une section donnée
man 2 fork

 Les n° de sections correspondent à un usage particulier :


N° Signification
1 Commandes disponibles pour les utilisateurs
2 Appels systèmes (en langage C)
3 Bibliothèque de fonctions (API en C)
4 Pilotes et protocoles réseau
5 Format de fichiers (Syntaxe des fichiers de configuration)
6 Jeux
7 Divers
8 Commandes disponibles pour les administrateurs
9 Appels noyau
Page 15
Entrées/Sorties standards
Redirections des E/S
Filtres entre commandes

Page 16
 Capacité de rediriger les entrées/sorties d’une commande
 « stdout » ou « stderr » vers un fichier plutôt qu’à l’écran
 « stdin » depuis un fichier plutôt que le clavier
 Utilisation des opérateurs suivants :
 > : Redirection de la sortie vers un fichier
 >> : Redirection de la sortie à la fin du fichier (concaténation)
 < : Redirection de l’entrée depuis un fichier
 Exemple de redirection de la sortie vers un fichier :
ls –l /etc > listing-etc.txt

 Le listing est écrit dans le fichier « listing-etc.txt »


« /etc » tapé ls listing-etc.txt
au clavier
 Redirection de l’entrée de la commande « wc » depuis un fichier
 Compte le nb de lignes du fichier « listing-etc.txt »
wc -l < listing-etc.txt

Page 17
 2 syntaxes supplémentaires possibles pour les redirections
n>&m ou
n>fichier

 n : Numéro du descripteur à rediriger


 m : Numéro du descripteur vers lequel on va rediriger
 fichier : Fichier vers lequel s’effectuera la redirection
 Rappel : 0 (entrée standard), 1 (sortie standard), 2 (sortie erreur)
 Exemple : Rediriger la sortie d’erreur vers un fichier
 Les messages d’erreurs seront écrits dans « erreurs.log »
cp /home/moi /home/lui 2>erreurs.log

 Exemple : Rediriger la sortie standard vers la sortie d’erreur


cp /home/moi /home/lui 1>&2

 Exemple : Rediriger stdout ET stderr vers un fichier


commande > fichier.txt 2>&1
Page 18
 Il s’agit de rediriger la sortie d’une commande vers l’entrée d’une
autre avec l’opérateur « | »
stdin stdout stdin stdout
commande1 commande2

 Élaborer des commandes complexes en une seule ligne


 Exemple : Filtrer le résultat de la commande « ls » avec « grep »
ls –l /etc | grep „mp3‟

• On obtient la liste des fichiers contenant « mp3 »


stdin stdout stdin stdout
ls –l /etc grep ‘mp3’

rout@foulen:~$ ls –l /etc | grep „mp3‟


-rw-r--r-- 1 rout rout 0 2008-08-27 15:16 morceau1.mp3
-rw-r--r-- 1 rout rout 0 2008-08-27 15:16 morceau2.mp3
-rw-r--r-- 1 rout rout 0 2008-08-27 15:16 morceau3.mp3
-rw-r--r-- 1 rout rout 0 2008-08-27 15:16 morceau4.mp3

Page 19
Exécution
d’une ligne de commandes

Page 20
 Pour exécuter une seule commande, rien de plus simple
 Taper son nom au clavier
 Pour exécuter plusieurs commandes à la suite
 L’exemple suivant crée un répertoire, s’y déplace et crée un fichier
mkdir toto ; cd toto ; touch alire.txt

 L’exécution conditionnelle de commandes est possible


 Les commandes s’exécutent les unes après les autres sous
condition
 Utilisation des opérateurs && et ||
• L’exemple suivant exécute commande1 et commande2
seulement si le résultat renvoyé par commande1 est égal à 0
commande1 && commande2

• Même chose mais si le résultat de commande1 est différent de 0


commande1 || commande2

Page 21
 Une commande renvoie toujours une valeur
 0 si la commande s’est exécutée correctement
 1 ou différent de zéro dans le cas contraire
 Exemple
 La variable « $? » correspond à la valeur renvoyée par la dernière
commande exécutée (Donc la commande « cd »)
# cd toto
Bash : cd toto : Le répertoire n‟existe pas
# echo $?
1

 Cette valeur peut-être exploitée dans un script pour connaître le


résultat d’une commande avant d’exécuter la suite

Page 22
 Copier le fichier « /etc/syslog.conf » vers son répertoire home

 A l’aide de la commande « cat », filtrer les lignes contenant le mot


« internet » dans le fichier « toto.txt »

 Renommer le répertoire « rapports » vers « rapport2017 » et


stocker les messages d’erreurs dans un fichier « mv-rapport.log »

 Créer le fichier « rap2019 dans le répertoire « rapports »


seulement s’il existe

Page 23
 Copier le fichier « /etc/syslog.conf » vers son répertoire home
cp /etc/syslog.conf ~/

 A l’aide de la commande « cat », filtrer les lignes contenant le mot


« internet » dans le fichier « toto.txt »
cat toto.txt | grep „internet‟

 Renommer le répertoire « rapports » vers « rapport2007 » et


stocker les messages d’erreurs dans un fichier « mv-rapport.log »
mv rapports/ rapports2017 2>mv-rapport.log

 Créer le fichier « rap2009 dans le répertoire « rapports »


seulement s’il existe
test –e rapports && touche rapports/rap2019

Page 24
Caractères spéciaux
et leur signification

Page 25
 Certains caractères ont une signification particulière
 Interprétés par le shell
 Astérisque ou étoile : *
 Interprété comme toute suite de caractères alphanumérique
 Exemple : Effacer tous les fichiers commençant par « rapport »
rm rapport*

 Point d’interrogation : ?
 Interprété comme un seul caractère alphanumérique
 Exemple : Effacer certains fichiers commencant par « rapport?.doc »
rm rapport?.doc

• « rapport1.doc » sera effacé mais pas « rapport12.doc »


 Point virgule : ;
 Séparateur de commandes
cp bilan.txt bilan2007.txt ; rm bilan.txt

Page 26
 Les crochets : []
 Remplace un caractère choisi parmi ceux énumérés entre les
crochets
 Exemple : Effacer les fichiers dont la 1ère lettre est « a » ou « b » et
se terminant par « .txt »
rm [ab]*.txt

• « args1.txt » et « bilan.txt » seront effacés mais pas


« comment.txt »
 Exemple : Effacer les fichiers numérotés de 10 à 29
• « rapport12.txt » mais pas « rapport3.txt »
rm rapport[12][0-9].txt

 L’espace
 Utilisé comme séparateur de paramètres pour une commande
 Exemple : Effacement de 2 fichiers passés en paramètres
rm rapport.doc rapport2008.txt
Page 27
 L’antislash : \
 Inhibe le caractère spécial suivant
 Exemple : Effacer un fichier contenant le caractère spécial espace
rm rapport\ .txt

 Autres caractères spéciaux : ! , ^, $, <, >,|


 ^ : Exprime la négation rm [^r]*.txt
 $ : Utilisé pour les variables dans les scripts
 ! : Utilisé pour accéder à l’historique des commandes ( ! suivi du
numéro de la commande dans l’historique. Voir la commande
« history »)
 <,> : Redirections
 | : pipe (tube)

Page 28
 Il existe plusieurs délimiteurs de chaînes de caractères
 Apostrophe (simple quote) : ‘texte‘
• Le texte n’est pas du tout interprété
 Guillemets (double quotes) : "texte"
• Seuls les caractères \ , $ et ` sont interprétés
• Utilisé pour du texte qui contient des variables ou des caractères
spéciaux
 Anti-quotes : `texte`
• Le texte est interprété comme une commande à exécuter. Le
résultat de cette commande sera substitué
• Utilisé dans le but d’exploiter le résultat d’une commande
 Exemples

Page 29
 Exemples
 Rechercher la chaîne « toto » dans tous les fichiers du répertoire
« /home/moi »
grep „toto‟ /home/moi/*

 Rechercher les fichiers contenant la date d’aujourd’hui


• 1) Obtenir la date d’aujourd’hui au format JJMMAA
root@foulen:~# date +%d%m%Y
28082008
• 2) Exploiter ce résultat pour rechercher cette date dans les
fichiers
root@foulen:~# grep `date +%d%m%Y` /home/moi/*

 Créer un fichier « alire.txt » dans le répertoire home de l’utilisateur


• La variable $HOME sera remplacée par sa valeur
root@foulen:~# touch "$HOME"/alire.txt

Page 30
 Déplacer tous les fichiers commençant par « bilan » vers le
répertoire « bilans » qu’il faut créer avant

 Afficher la liste des fichiers dont le nom contient « bilan2018 » et


« bilan2019 »

 Afficher la liste des fichiers dont le nom commence par une


majuscule suivie d’une minuscule suivie d’un chiffre.

 Créer un fichier qui sera nommé « backup_JJMMAA.dat » avec la


date du jour

Page 31
 Déplacer tous les fichiers commençant par « bilan » vers le
répertoire « bilans » qu’il faut créer avant
mkdir bilans ; mv bilan*.* bilans/

 Afficher la liste des fichiers dont le nom contient « bilan2018 » et


« bilan2019 »
ls | grep "bilan" | grep "201[89]"

 Afficher la liste des fichiers dont le nom commence par une


majuscule suivie d’une minuscule suivie d’un chiffre.
ls | grep "[A-Z][a-z][0-9]"

 Créer un fichier qui sera nommé « backup_JJMMAA.dat » avec la


date du jour
touch backup_ ` date +%d%m%Y `.dat

Page 32
Qu’est qu’un script shell ?

Page 33
 Un script est un fichier contenant un ensemble de commandes
exécutées séquentiellement
 Sous forme de fichier texte contenant les commandes

 Le script ne peut être exécuté que par un interpréteur


 « /bin/bash » pour le shell bash

 Le langage de script shell est un langage évolué offrant de


nombreuses possibilités
 Boucles, variables, tests avec if, création de fonctions, …

Page 34
 Un script shell permet de lancer une succession de commandes,
d’automatiser des procédures en fonction de l’utilisateur qui lance
le script, etc.

 Dans quels cas utilise-t-on les scripts ?


• Pour effectuer un travail répétitif
• Pour des tâches d’administration système
• Pour des tâches planifiées (comme des updates de logiciels)
• Pour installer des programmes
• Au démarrage du système pour démarrer les services et applis
• Bref : Tout le temps !!!

Page 35
 Il s’agit d’un fichier texte correspondant à un programme devant
solutionner un problème donné. On peut/doit le démarrer
comme ceci :
#!/bin/bash

# Commentaires : Fonction du script


# Auteur : foulen
# Version : 1.0
# Date : 12 Oct 2019

# Début du script

Page 36
37

Règles à suivre pour écrire un script shell

 Commencez par le type de shell


#!/bin/bash

 Puis expliquer par un commentaire ce que fait le script


# --- Script renvoyant le login d’un utilisateur en fonction de son UID

 Ecrire un maximum de commentaires pour expliquer ce qu’on est


entrain de faire (c’est pour facilité sa lecture et sa maintenance)
# ce test est réalisé pour savoir si la donnée lue
# est un entier compris entre 0 et 20

Page 37
38

Ne pas oublier qu’un script shell est un programme


 Ne jamais oublier de deboguer le script et si possible bien vérifier
le script par un autre collègue
/bin/bash –x monscript

 Ne pas oublier également qu’un script peut accepter des


arguments ou des données en lecture
 Il faut donc les vérifier pour éviter des erreurs fatales
 Il faut rappeler le fonctionnement du script par des messages
d’erreur adéquats
Erreur : Nombre d‟arguments attendus = 2
Usage de la commande : script.sh arg1 arg2
arg1 : fichier source, arg2 : fichier destination

Page 38
39

Exemple de script

#!/bin/bash

#-- script permettant de connaitre la liste des fichiers

#-- m’appartenant se trouvant le répertoire courant

#Nb : variable qui recupere le nombre de fichiers

Nb=$(ls –l|grep –e "^-.{9} [0-9]+ $USER "|wc –l)

echo "$USER a $Nb fichiers dans le repertoire $PWD : "

ls –l|grep –e "^-.{9} [0-9]+ $USER"

exit 1

Page 39
 Pour exécuter le script, il faut appeler l’interpréteur
root@foulen:~# bash monscript

 Possibilité de simplifier l’appel si la ligne suivante se trouve en


tête du script
#!/bin/bash
#-- Script réalisant …

L’appel est alors plus simple


root@foulen:~# ./monscript

Page 40
 L’utilisateur courant doit posséder le droit « x » pour le fichier

 Exemple : Seul, l’utilisateur « moi » pourra exécuter le script


root@foulen:~# ls -l script.sh
-rwxr--r-- 1 moi compta 7406 2008-08-15 14:44 script.sh

 Pour ajouter le droit d’exécuter du script au groupe « compta »


root@foulen:~# chmod g+x script.sh

 Pour ajouter à tous le droit d’exécuter le script


root@foulen:~# chmod +x script.sh

Page 41
Les variables sous le shell

Page 42
 Ces variables sont définies à l’ouverture de session
 Leurs valeurs dépendent de l’utilisateur connecté
 Exemple : Variable PATH
 Défini les différents chemins où chercher les commandes
root@foulen:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

 La commande « export » permet de créer/modifier une variable


 Cette modification est temporaire
root@foulen:~# export VAR=VALEUR

 Pour rendre l’effet permanent, il faut ajouter « export » au fichier


.bashrc
• .bashrc est un fichier caché
 Pour modifier la variable PATH sans effacer son contenu
root@foulen:~# export PATH=$PATH:/nouveau/repertoire

Page 43
Lecture, affichage et affectation d’une variable simple

 Commande de lecture d’une variable


read variable
read –p " votre réponse (oui/non) ? " reponse

 Commande d’affichage du contenu d’une variable


echo $var

printf " %+20s\n" $var

 Commande d’affectation d’une valeur à une variable


Var1=1234
Var2="bonjour à tous"
Var3=$Var1

let var=0

Var5=`date`

Page 44
Manipulation des variables tableaux

 Déclaration d’un tableau


declare –a TAB=(‚un‛ ‚deux‛)

ListNoms=(‚Foulen BEN FELTEN‛ ‚Wild IL HOUMA‛)

Tabcouleur[0]=‚Rouge‛; Tabcouleur[1]=‚Vert‛; Tabcouleur[3]=‚Bleu‛

 Comptage du nombre d’éléments d’un tableau


len=${#TAB[*]} ; echo "nombre d‟élements de TAB =" $len

Page 45
Manipulation des variables tableaux

 Affichage d’un élément du tableau


indice=2; echo ${TAB[indice]}

 Affichage de tous les éléments du tableau (2 possibilités)


echo ${TAB[@]}
for (( i=0; i < ${#tab[@]}; i++ )); do echo ${tab[i]}; done

 Affectation d’un élément du tableau


indice=1; valeur="hello world!" ; TAB[$indice]=$valeur

Page 46
Manipulation des variables tableaux

 Ajouter un élément en début de liste


$ declare -a tableau=( "un" "deux" )
$ tableau=( "zero" "${tableau[@]}" )
$ echo ${tableau[@]}
zero un deux

 Ajouter un élément en fin de liste


$ declare -a tableau=( "zero" "un" )
$ tableau=( "${tableau[@]}" "deux" )
$ echo ${tableau[@]}
zero un deux

Page 47
Manipulation des variables tableaux

 Suppression du premier élément d’une liste


$ tableau=( "zero" "un" "deux" )
$ unset tableau[0]
$ nouvtableau=( "${tableau[@]}" )
$ echo ${nouvtableau[*]}
un deux

 Suppression du dernier élément d’une liste


$ tableau=( zero un deux )
$ unset tableau[$(( ${#tableau[*]} - 1 ))]
$ echo ${tableau[*]}
zero un

Page 48
Définition d’une expression

 Les expressions peuvent être de plusieurs natures : arithmétique,


comparaison, chaine de caractères,…

 La syntaxe oblige de passer par la commande expr ou (( … )) pour


utiliser les opérateurs

Page 49
Affecter une expression à une variable

 L’affectation du résultat d’une expression à une variable peut se


réaliser de deux manières différentes:
 On recours à l’évaluation de l’expression en utilisant les anti-quotes
X=12; Var=`expr $X + 121`

 On écrit la même chose que précédemment en utilisant la les


caractères de substitution
X=12; Var=$(($X + 121))

 La syntaxe de la commande let permet de réaliser des calculs


arithmétique
X=12
let "Var=X + 121"
echo $Var

Page 50
Saisie des données
et affichage des résultats

Page 51
Entrées/sorties

La commande de lecture d’une ou plusieurs donnée au


clavier est
read listeNomVariables
• Les chaînes introduites sont séparées par des espaces ou
des tabulations
• La commande read peut admettre une interactivité avec
l’utilisateur moyennant l’option –p
• Exemples :
read –p "introduire un entier : " varlue
read name

Page 52
Entrées/sorties
La commande utilisée pour afficher quelque chose sur l’écran est
echo chaine
La chaine peut renfermer des caractères spéciaux à interpréter au
niveau de l’affichage comme
\c pas de passage à la ligne
\b backspace
\n newline,…

• Exemples:
echo “Hello World !!”
echo –e “\t votre nom...? \c"; read name; echo "hello $name"
echo nombre d\‟arguments = $#

Page 53
Entrées/sorties
• On peut recourir à la commande printf pour afficher des données
formatées sur l’écran
printf "formatage" variable…
Cette commande est identique à celle du langage C.

• Exemples de format utilisés :


%20s Affichage d'une chaine (string) sur 20 positions avec cadrage à droite
%-20s Affichage d'une chaine (string) sur 20 positions avec cadrage à gauche
%3d Affichage d'un entier (décimal) sur 3 positions avec cadrage à droite
%03d Affichage d'un entier avec cadrage à droite et complété avec des 0 à gauche
%10.2f Affichage d'un nombre flottant sur 10 positions dont 2

article="Livres"; quantite=3 ; prix=3,5


printf "%-20s %03d %+10.2f \n" $article $quantite $prix

Page 54
Paramètres d’un script

Page 55
 Elles sont définies implicitement et peuvent être utilisées à tout
moment dans le script
 Exemples de variables
• $0 : Nom du script
• $? : Résultat de la commande précédente
• $$ : numéro du processus en exécution
• $! : numéro du processus en arrière plan


root@foulen:~/Documents/cours-shell#
Exemple de script
#! /bin/sh
cat script.sh

cp $1 tata.txt
echo $?

 Exécution du script
root@foulen:~/Documents/cours-shell# ./script.sh file.txt
cp: ne peut évaluer `file.txt': Aucun fichier ou dossier de ce type
1

Page 56
Paramètres formels d’un script
 Les variables utilisées pour la manipulation des paramètres d’un
script sont :
• $1 à $9 : Argument 1 à 9 passés au script
• $# : Nombre d’arguments passés au script
• $@, $* : Liste des paramètres (Lorsqu’elles ne sont pas entourées
par des guillemets, elles sont équivalentes)

 Exemple
$ cat script.sh
#!/bin/bash
echo nom du script $0
echo nombre d\‟arguments = $# Paramètres formels
echo liste des arguments = $@
echo argument n°2 = $2

$ bash script.sh arg1 arg2 arg3


Liste des paramètres effectifs

Page 57
Commande ’shift’
 La commande shift permet de décaler la liste des arguments d'une ou
plusieurs positions vers la gauche.
 Exemple de script qui doit recevoir en premier argument le nom d'un
dossier à créer puis pour les arguments suivants les noms de fichiers à
créer

1 # Sauvegarde du premier argument dans la variable rep


rep=$1
# Décalage de tous les arguments avec la commande shift
shift
# Création du répertoire
mkdir $rep
# On se positionne dans le nouveau répertoire
cd $rep
# Création des fichiers dans le nouveau répertoire
for fichier in $*
do
touch $fichier
done

Page 58
Commande ‘set’
 La commande set sans paramètres affiche la valeur de toutes les
variables d'environnement.
 Elle peut servir à découper une chaine de caractères en mots;
chacun étant récupéré dans un paramètre formel $1..$9
 Exemple
$ a=1 ; b=2 ; c=3 ; set a b c ; echo $1, $2, $3
# les valeurs de a, b, c sont récupérées dans $1, $2, $3

$ IFS=: ; set `date` ; echo $2


#le second champ après les « : » du résultat de la date est récupéré

$ set bonjour "deux coucou" salut


$ set "$*" ; echo $# ; echo $1
1
bonjour deux coucou salut

$ set bonjour "deux coucou" salut


$ set "$@" ; echo $# ; echo $2
3
Deux coucou

Page 59
Commande ‘set’
 Les paramètres spéciaux $@ et $* contiennent tous deux la liste
des valeurs des paramètres de position initialisés.
 Ces deux paramètres spéciaux ont des valeurs distinctes lorsque
leur référence est placée entre des guillemets ("$*" et "$@").
 Exemple
$ set bonjour "deux coucou" salut
$ set "$*"
$ echo $#
1
$ echo $1
bonjour deux coucou salut

$ set bonjour "deux coucou" salut


$ set "$@"
$ echo $#
3
$ echo $
Deux coucou

Page 60
Structures conditionnelles

Page 61
Structures de contrôle conditionnel
 Les structures de contrôle conditionnel sont les commandes de
branchement if et de choix multiple case
 Les structures conditionnelles peuvent bien sûr être imbriquées

 Pour définir une conditionnelle on recours à la commande test ou


son abréviation [ … ]
 La commande test permet d’effectuer divers tests (arithmétiques,
logiques, sur les fichiers, …)
#exemple pour tester si la variable lue correspond à un rérepertoire
read –p “introduire un nom de fichier ” nomfichier
test –d $nomfichier

Page 62
Structure de contrôle ‘if ‘
 Permet d’effectuer une exécution conditionnelle
if [ expression ]
then
# commandes à exécuter si la cond. est vraie
else
# commandes à exécuter si la cond. est vraie
fi

 L’expression conditionnelle est toujours le code retour d’une


commande ou d’une composition de commandes (0 pour vrai,
faux sinon)
 On peut utiliser les commandes true et false dans l’expression
d’une condition
 Composition des commandes s’exprime ainsi :
commande… && commande
commande… || commande
Page 63
Structure de contrôle ’if’
 Permet d’effectuer une exécution conditionnelle
if [ expression ]
then
# commandes à exécuter si la cond. est vraie
else
# commandes à exécuter si la cond. est vraie
fi

 On peut imbriquer des if dans la partie then ou la partie else


 La partie else n’est pas obligatoire
 Lorsque plusieurs if sont imbriqués on peut recourir à la forme
simplifiée avec elif
if condition1
then liste_instructions_1
elif condition2
then liste_instructions_2
elif condition3 ...
else liste_autres_instructions
fi

Page 64
Commande test pour exprimer la condition
 Dans l’expression d’une condition avec la commande test ou [ … ]
on recours à des opérateurs
 Liste des opérateurs logiques
• ! : Négation
• -a : Et (And)
• -o : Ou (Or)
 Liste des opérateurs numériques
• -eq : Egalité (Equals)
• -ne : Non égalité (Non Equals)
• -lt : Infériorité (Less than)
• -le : Infériorité ou égalité (Less than)
• -gt : Supériorité (Greater then)
• -ge : Supériorité ou égalité (Greater equals)

Page 65
Expression de la condition
 Liste des opérateurs sur chaîne de caractère
• -z : Chaîne vide
• -n : Chaîne non vide
• = : Egalité de chaîne
• != : Non égalité de chaîne
 Liste des opérateurs sur fichiers
• -L : Lien symbolique
• -d , -f : Répertoire, Fichier ordinaire
• -s : Fichier vide
• -r, -w, -x : Droits qui s’appliquent (Lecteur, Ecriture, Exécution)
• -nt : Plus récent (Newer than)
• -ot : Plus vieux (Older than)

Page 66
Exemples
# Teste si le paramètre $1 est egal à 2
if [ $1 -eq 2 ]
then
:
# ce qui précède est la commande ne rien faire (nop : no operation)
fi

# Teste si le paramètre $1 est un fichier OU un répertoire


if [ -d $1 –o –f $2 ]
then
# Commande
fi

# Teste si le fichier est inexistant


if [ ! –e "/etc/toto.conf" ]
then
# Commande exécutée si le fichier n‟existe pas
fi

Page 67
 Tester si le paramètre 2 est un fichier

 Tester si le paramètre 1 égal à « x » OU paramètre 2 supérieur à 3

 Tester si le paramètre 1 n’est pas un répertoire ET s’il a le droit


d’écriture

 Script capable de créer le répertoire passé en argument et de vérifier


que sa création n’a pas provoqué d’erreurs

Page 68
 Tester si le paramètre 2 est un fichier
 Réponse
if [ -f $2 ]; then echo ok ; fi

 Tester si le paramètre 1 égal à « x » OU paramètre 2 supérieur à 3


 Réponse
if [ $1="x" –o $2 –gt 3 ]; then echo ok ; fi

 Tester si le paramètre 1 n’est pas un répertoire ET s’il a le droit


d’écriture
 Réponse
if [ ! –d $1 –a –w $1 ]; then echo ok ;else echo nack ;fi

Page 69
 Script capable de créer le répertoire passé en argument et de vérifier
que sa création n’a pas provoqué d’erreurs
 Réponse
if [ $# -ne 1]; then
echo "Nombre d‟arguments erroné"
exit 1
fi

if [ ! –d $1 ] ; then
mkdir $1 2> /dev/null
if [ $? –ne 0 ] ; then
echo "Erreur lors de la création de $1"
exit 2
fi
else echo "Erreur $1 existe déjà"
exit 3
fi
#suite

Page 70
Structure conditionnelle ‘case’

 La syntaxe de la conditionnelle case


case $nomVariable in
motif1) cmde1… ;;
motif2) cmde2… ;;

*) cmde_otherwise ;;
esac

 Une vérification est réalisée pour savoir si une égalité est


trouvée entre la variable et un motif donné. Dans ce cas la liste
des commandes associée sera exécutée. Si par contre aucun
motif ne convient la partie (optionnelle) commençant par *)
sera exécutée

Page 71
Exemple d’une conditionnelle ‘case’

#!/bin/bash
echo “Affichage répertoire courant 1“
echo “Liste des fichiers du répertoire 2“
echo “Retour au répertoire HOME 3“
echo "Sortie 0"

echo -e "Introduire votre choix (0-3) : \c“


read choix

case $choix in
0) break ;;
1) pwd ;;
2) ls –l ;;
3) cd ;;
*) echo “donnée introduite erronée”; exit ;;
esac

Page 72
Exercices
 Tester si le nombre d'arguments fournis par l'utilisateur est
compris entre 1 et 2. Les afficher si c’est correct, sinon afficher un
message d’erreur.
 Tester si la réponse saisie au clavier correspond à « oui » ou
« non ». La réponse introduite n’a pas une casse particulière. On
peut introduire les minuscules et majuscules à sa guise.
 Tester sur le script admet un et un seul argument qui doit être
obligatoirement un nombre entier.

Page 73
Exercices
 Tester si le nombre d'arguments fournis par l'utilisateur est
compris entre 1 et 2. Les afficher si c’est correct, sinon afficher un
message d’erreur.
 Réponse

#!/bin/bash
case $# in
0) echo "aucun parametre"
echo "Syntaxe : $0 <nom d'utilisateur>";;
1) echo "1 parametre passe au programme : $1";;
2) echo "2 parametres passes au programme : $1 et $2";;
*) echo "TROP DE PARAMETRES !" ;;
esac

Page 74
Exercices
 Tester si la réponse saisie au clavier correspond à « oui » ou
« non ». La réponse introduite n’a pas une casse particulière. On
peut introduire les minuscules et majuscules à sa guise.
 Réponse

#!/bin/bash
read –p "Voulez vous continuer le programme ?" reponse
case $reponse in
[Oo][Uu][Ii]) echo "Ok, on continue";;
[nN][Oo][Nn]) echo "$0 arrêté ;-)"
exit 0;;
*) echo "ERREUR de saisie"
exit 1;;
esac

Page 75
Exercices
 Tester sur le script admet un et un seul argument qui doit être
obligatoirement un nombre entier.
 Réponse

#!/bin/bash
if test $# -ne 1
then echo Nombre d\‟arguments erronés
exit 1
fi

case $1 in
*[!0-9]*) echo "$1 n'est pas un nombre"
exit 2
;;
esac

Page 76
Structures de boucle

Page 77
Structures de boucle

3 formes avec les commandes :


for, while et until

Sortie exceptionnelle d’une boucle possible par l’une des


commandes
break n => sortie du niveau n d’imbrication
continue => continuation de la boucle
exit n => sortie du script avec
le code retour n

Page 78
Structures de boucle ‘for’

• Syntaxe (classique) de la boucle for


for nomVar in liste
do
Cmde…
done
• Exemples de boucle for
for i in par1 par2 ; do echo $i ; done

for i in $* ; do echo $i ; done


echo „liste arguments‟ ; for i ; do echo $i ; done

for i in `seq 5 2 25` ; do echo $i; done


for i in {5..25..2} ; do echo $i; done

echo „liste des fichiers C‟; for i in *.c do echo $i; done

Page 79
Structures de boucle ‘for’

• Autre syntaxe de la boucle for


for (( exp1; exp2; exp3 ))
do
Cmde…
done

• Exemple
#!/bin/bash
for (( ; ; ))
do echo “boucle infinie [ taper CTRL+C pour stopper]"
done

for (( c=0 ; c<10 ; c++ ))


do echo $i
done

Page 80
Structures de boucle ‘while’

• Syntaxe de la boucle while


while condition
do
Cmde…
done
La condition d’arrêt peut être la commande true
• Exemples de la boucle while
while true ; do echo OK ; done

i=1; while test $i –le 10


do echo $i; i=`expr $i + 1`
done

Page 81
Structures de boucle ‘until’

• Syntaxe de la boucle until


until condition
do
Cmde…
done
• Exemple d’une boucle until
nbr=0
until test $nbr –eq -1
do echo -e "Pour terminer saisir -1 : \c"
read nbr
done

Page 82
Exercice
• Demander à l'utilisateur de dire « oui » et répéter cette action
tant qu’il n'a pas fait ce que l'on voulait

• Compter tous les fichiers trouvés dans le répertoire actuel

• Lister les fichiers d'un ou plusieurs dossiers passé(s) en


paramètres

Page 83
Exercice
• Demander à l'utilisateur de dire « oui » et répéter cette action
tant qu’il n'a pas fait ce que l'on voulait
 Réponse
#!/bin/bash
# la variable reponse est initialement vide
while [ -z $reponse ] || [ $reponse != 'oui' ]
do
read -p 'Dites oui : ' reponse
done

• Compter tous les fichiers trouvés dans le répertoire actuel


 Réponse
#!/bin/bash
liste_fichiers=`ls`
for fichier in $liste_fichiers
do nbr=`expr $nbr + 1`
done
echo nombre de fichier trouvé = $nbr
Page 84
Exercice
• Lister les fichiers d'un ou plusieurs dossiers passé(s) en
paramètres
 Réponse
#!/bin/bash

for dossier in $*
do if [[ -d $dossier ]]
then
echo "Liste des fichiers du dossier $dossier"
for fichier in `ls $dossier`
do
echo "$fichier"
done
fi
done

Page 85
Fonctions et appel de fonctions

Page 86
Fonctions et leur appel
• Déclaration et implémentation d’une fonction :
function nomFonction ( )
{
commande…
}

• Une fonction peut


• admettre des paramètres (désignés formellement $1, $2, …)
• renvoyer un code retour avec return(n)

• L’appel d’une fonction se matérialise par l’invocation de son nom


suivi de ses paramètres effectifs

Page 87
Exemple de fonction sans paramètres
• Exemple de fonction sans paramètre

function menu_du_jour() {
echo " 1: entrée "
echo " 2: plat principal "
echo " 3: dessert "
read " préciser votre choix (1,2,3): " choix
}

• Appel de cette fonction


menu_du_jour
echo votre sélection dans le menu est $choix

Page 88
Exemple de fonction avec paramètres
• Exemple de fonction avec paramètres
function listerParam ( )
{ echo " nbr de paramètre = $# "
for i in $*
do
echo $i
done
}

• Appel de cette fonction (avec 3 paramètres)


listerParam azerty qwerty autreArgument

Page 89
Exemple de récupération de la valeur retournée
• Exemple de fonction retournant une valeur
function Coderetour( )
{ #calcul d’un résultat numérique par exemple
#la somme des 2 paramètres en entrée
res=`expr $1 + $2`
return res
}

• Appel de cette fonction puis récupération de la valeur de retour


Coderetour 12 23
echo resultat de la fonction = $?

Page 90
Exercice

• Ecrire un script pour faire du calcul simple du style op1 + op2.


• Ecrire un script avec une fonction de calcul d’un maximum de deux
entiers paramètres d’entrée du script.
• Ecrire une fonction qui va vérifier si un élément donnée figure dans
une liste

Page 91
Exercice
• Ecrire un script pour faire du calcul simple du style op1 + op2.
 Réponse

#!/bin/bash
function calcul ()
{ case $2 in
‘+’) expr $1 + $3;;
‘-’) expr $1 - $3;;
‘*’) expr $1 \* $3;;
‘/’) expr $1 ‘/’ $3;;
*) echo ‚opérateur inconnu‛; exit;;
esac
}

#Exemples d’appel de la fonction


calcul 3 + 7 # résultat : 10
calcul 3 % 7 # résultat : erreur

Page 92
Exercice

• Ecrire un script avec une fonction de calcul d’un maximum de


deux entiers paramètres d’entrée du script.
 Réponse
Function max2 () {
if [ "$1" -eq "$2" ] ; then return 0 #par hypothèse
elif [ "$1" -gt "$2" ] ; then return $1
else return $2
fi
}

if [ $# -ne 2 ]
then echo "Vous devez donner deux arguments à la fonction."
exit 0
fi
max2 $1 $2
returnval=$?
if [ $returnval -eq 0 ]
then echo "Les deux nombres sont identiques."
else echo "Le plus grand des deux nombres est $returnval."
fi
Page 93
Exercice

• Ecrire une fonction qui va vérifier si un élément donnée figure


dans une liste
 Réponse
#!/bin/bash
function in_array() {
local x
local needle=$1
shift 1
local ARRAY=( "$@" )

[ -z "${ARRAY}" ] && return 1


[ -z "${needle}" ] && return 1

for x in ${ARRAY[@]}
do [ "${x}" == "${needle}" ] && return 0
done
return 1
}

Page 94
Autres commandes

Page 95
La commande ‘select’

 La commande interne select est une structure de contrôle


de type boucle qui permet d'afficher de manière cyclique
un menu
 La syntaxe de cette commande est :
select var in item1 item2 item3 ..... itemn
do
commandes
done
 Cette commande utilise deux variables réservées :
• La variable PS3 représente le prompt utilisé pour la saisie du choix
de l'utilisateur.
Sa valeur par défaut est #?. Elle peut être modifiée si on le
souhaite.
• La variable REPLY qui contient l'indice de l'item sélectionné.

Page 96
La commande ‘select’

 Exemple

#!/bin/bash
PS3="Votre choix : "
select item in "Sauvegarde" "Restauration" "Fin"
do
case $REPLY in
1) echo Appel de la fonction sauve ;;
2) echo Appel de la fonction restaure ;;
3) echo "Fin du script" ; exit 0 ;;
*) echo "Choix incorrect" ;;
esac
done

Page 97
La commande ‘trap’

 La commande interne trap est une structure de


contrôle capable d'intercepter les signaux envoyés par
certains raccourcis claviers (comme Ctrl-C) et de changer
le comportement par défaut de ces raccourcis.
 La syntaxe de cette commande est :
trap 'commande' liste_de_signaux

 Exemple
# ignorer les signaux
trap "" 2 3 15
# changer le comportement par défaut
trap "echo interception; echo autre traitement" 2 3 15
# traitement par défaut
trap 2 3 15

Page 98
La commande ‘trap’

 On peut utiliser les noms des signaux au lieu de leur


numéro
 La liste des signaux est donnée par kill –l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE
9)SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS

 Exemple
# interception du signal SIGINT=2
trap "echo 'sig INT intercepté' " INT

Page 99
Exercice

• Ecrire un script qui utilise un select pour savoir le sexe d’une


personne pour lui dire soit bonjour monsieur soit bonjour madame
• Ecrire une boucle qui ne peut pas être interrompue, sauf par
l'entrée du bon mot de passe (par exemple mo2pass)

Page 100
Exercice

• Ecrire un script qui utilise un select pour savoir le sexe d’une


personne et lui dire soit bonjour monsieur soit bonjour madame

echo "Etes vous un homme ou une femme ?"

select i in homme femme


do
if [ "$i" = "homme" ]; then
echo "Bonjour monsieur"
elif [ "$i" = "femme" ]; then
echo "Bonjour madame"
else
echo "mauvaise reponse"
fi
done

Page 101
Exercice

• Ecrire une boucle qui ne peut pas être interrompue, sauf par
l'entrée du bon mot de passe (par exemple mo2pass)

#!/bin/sh
trap "" 2 3 15 # ignorer les signaux
while :
do
echo –e "Entrez le mot de passe : \c"
read mdp
if [ "$mdp" = "mo2pass" ]
then echo "mot de passe valide !"
break
fi
done
trap 2 3 15 # revenir à l'état par défaut

Page 102
Page 103

Vous aimerez peut-être aussi