LST Info, FST Fès Pr. M.
Talibi Alaoui
LST Info, FST Fès 2018-2019 1
Historique d’UNIX
Caractéristiques d’UNIX
SHELL : sh
Commandes de base
Scripts
Expressions régulières
Commande sed
LST Info, FST Fès 2018-2019 2
Projet du Système MULTICS (MULTiplexed Information and
Computing Service) vers la fin des années 60 entre les
laboratoires de BELL et General Electric
Un système à temps partagé
Ce projet a été abandonné par BELL
Ken THOMSON, chercheur à BELL, a décidé d’écrire une
version allégée de MULTICS en assembleur sur une machine
PDP-7
Ses collègues ont surnommé cette version, par plaisanterie,
UNICS (Uniplexed Information and Computing Service)
Le travail était impressionnant et tout le département a rejoint
le projet
UNIX a été porté sur d’autres machines PDP11-20 PDP11-45
PDP11-70
Réécrire UNIX dans un langage de haut niveau pour faciliter le
portage sur d’autres architectures
Réalisation du Langage B qui a été remplacé, par la suite, par le langage
C
LST Info, FST Fès 2018-2019 3
Première version 1973 D. Ritchie
d’UNIX 90 % en Langage C
Laboratoire BELL
Version 6
Version 7
AT & T et BELL Université de Berkeley
Système III BSD 3
Système V BSD 4.1
BSD 4.3
LST Info, FST Fès 4
2018-2019
Vers la fin des années 80, deux versions largement
utilisées et sensiblement incompatibles d’UNIX
System V release 3
BSD4.3 (Berkeley Software Distribution)
Chaque constructeur ajoutait ses propres
améliorations
Cette incompatibilité a freiné le succès
commercial du système
la standardisation d’UNIX devient une nécessité
LST Info, FST Fès 2018-2019 5
Standardisation
POSIX (Portable Open System Interface
eXchange) membre de IEEE
Définition d’un ensemble de procédures que doit
fournir tout système compatible à la norme
Intersection des deux familles
Ressemble fortement à leur ancêtre version 7
Norme IEEE P1003.1 devenue norme ISO 9945
LST Info, FST Fès 2018-2019 6
Première version 1973 D. Ritchie
d’UNIX 90 % en Langage C
Laboratoire BELL
Version 6
Version 7
AT & T et BELL Université de Berkeley
Système III BSD 3
Système V BSD 4.1
Linux BSD 4.3
LST Info, FST Fès 7
2018-2019
Multi-tâches Multi-utilisateurs
Sécurité ( login, mot de passe )
Seuls les utilisateurs ayant un login et un passwd peuvent se
connecter au système
Meilleure protection
droits d’accès au niveau des fichiers
Portabilité
Disponible pour plusieurs plateformes (Station de travail, PC,
Macintosh)
LST Info, FST Fès 2018-2019 8
Modularité
Noyau
Utilitaires
Système de fichier
Arborescent
Réparti
Réorganisation souple
Traitement uniforme des périphériques
Un périphérique est traité comme un fichier
LST Info, FST Fès 2018-2019 9
Outils de communication intégrés
Talk, write, mail …
Système de commandes
Très riche
Puissant
Plusieurs interpréteurs de commandes
Exemples : sh, ksh, csh, …
Inter chargeables sans redémarrer la machine
LST Info, FST Fès 2018-2019 10
Interface graphique conviviale :
Système de fenêtrage proche de Windows
Exemples : KDE, GNOME, …
Stable
Plante rarement
Il y a toujours moyen de débloquer le processus qui bloque
le système.
LST Info, FST Fès 2018-2019 11
Outils de
communication
Shell
Noyau
Editeurs
de texte
Gestion des processus
Gestion de la mémoire
Gestion des E/S
LST Info, FST Fès 12
2018-2019
LST Info, FST Fès 2018-2019 13
Bourne shell : sh
Korne shell : ksh
Cshell : csh
LST Info, FST Fès 2018-2019 14
Commandes
Taper une commande à l'invite du shell
Script
Un fichier de commande
LST Info, FST Fès 2018-2019 15
Organisation logique
Structure arborescente
Fichier : contient les données
Répertoire : noeud contenant des fichiers ou d'autres
sous répertoires
LST Info, FST Fès 2018-2019 16
/
Répertoires
home
bin
dupont dubois
alibaba
[Link]
images cours documents
[Link] [Link] [Link] [Link]
Unix
fichiers
LST Info, FST Fès 2018-2019 17
Chemin d’accès :
l’ensemble des nœuds qui mènent vers un fichier ou
un répertoire séparés par ‘/’.
. : répertoire courant
.. : répertoire père
LST Info, FST Fès 2018-2019 18
Chemin absolu
commence à la racine : '/'
Exemple
/home/dubois/documents/[Link]
Chemin relatif
Commence à partir du répertoire courant
Exemple :
../documents/[Link]
LST Info, FST Fès 2018-2019 19
/
bin home
dubois dupont
alibaba saladin
Répertoire images cours documents
courant
[Link] [Link] [Link] [Link]
Unix
Chemin absolu
Chemin relatif
LST Info, FST Fès 2018-2019 20
Identificateur (nom)
Suite de caractères (jusqu’à 255 caractères)
Sensible à la casse
Utiliser le caractère d’échappement ‘\’ pour les
caractères spéciaux
Exemple précéder le caractère espace par \
Nom\ fichier
LST Info, FST Fès 2018-2019 21
Caractères "joker"
Permettent d’appliquer une commande à un
ensemble de fichiers dont le nom vérifie certaines
contraintes (ex : le nom commence par la lettre
‘p’, l’extension est ‘.doc’, …)
* : remplace n’importe quelle suite de caractère (y
compris la chaîne vide)
? : remplace un et un seul caractère
[-] : définit un intervalle
LST Info, FST Fès 2018-2019 22
ls
Affiche le contenu du répertoire courant ou de celui
passé en paramètre
Options
-l : affiche les informations complètes des fichiers et sous
répertoires
-a : affiche les fichiers cachés
-R : affichage récursif
-i : affiche le descripteur des fichiers (i-numéro)
-d : n'affiche pas le contenu des répertoires
LST Info, FST Fès 2018-2019 23
pwd
Affiche le chemin du répertoire courant
cd chemin
Se déplace vers le répertoire identifié par 'chemin'
Exemples :
$ cd /home/dubois/doc
$ cd ../dubois/doc
LST Info, FST Fès 2018-2019 24
mkdir (md) nouveau_rep
Crée un nouveau_rep dans
Le répertoire courant
nouveau_rep est le nom du répertoire
Exemple :
$ mkdir stages
Dans le chemin indiqué par la première partie de
nouveau_rep
Exemple :
$ md /home/dupont/stages
$ mkdir ../dupont/stages
LST Info, FST Fès 2018-2019 25
rmdir repertoire
Supprime un repertoire vide
Exemple
$ rmdir /home/dupont/temp
LST Info, FST Fès 2018-2019 26
rm fichier
Supprime un fichier ou un répertoire non vide
Options
-r : la commande détruit de manière récursive toute la
sous arborescence du répertoire
-i : demande la confirmation avant de supprimer le fichier
Exemple
$ rm -r doc
$ rm -i /home/dupont/[Link]
LST Info, FST Fès 2018-2019 27
cat fichier [fichier,...]
Concatène et affiche sur la sortie standard le(s)
fichier(s) en paramètre OU
Affiche sur la sortie standard, le contenu des
fichiers, spécifiés en argument de la commande,
l’un après l’autre.
Exemple
$ cat fichier1.
$ cat fichier1 fichier2.
LST Info, FST Fès 2018-2019 28
more fichier
Affiche le contenu du fichier page par page
Utilisée pour les fichiers longs (contenant plusieurs
pages) :
Q : quitte la commande
Return : saute de ligne
Espace : saute de page
Exemple
$ more lettre
LST Info, FST Fès 2018-2019 29
head [-c nchar -n nline] fichier
Affiche le début du fichier
Par défaut les dix premières lignes
-c nchar : affiche les nchar premiers caractères du fichier
-n nline : affiche les nline premières lignes du fichier
Exemple
$ head lettre
$head -c 280 lettre
$ head -n 5 lettre
LST Info, FST Fès 2018-2019 30
tail [-/+c nchar -/+n nline] fichier
Affiche la fin du fichier
Par défaut les dix dernières lignes
-/+c nchar : affiche les derniers caractères du fichier
+ à partir du nchar ème caractère jusqu’ à la fin du fichier
- Les nchar derniers caractères à partir de la fin
-/+n nline : affiche les dernières lignes du fichier
+ à partir de la nline ème jusqu’à la fin du fichier
- Les nline dernières lignes à partir de la fin
Exemple
$ tail lettre
$tail -n 6 lettre affiche les 6 dernières lignes
$ tail +n 6 lettre affiche de la ligne 6 jusqu’à la fin
du fichier
LST Info, FST Fès 2018-2019 31
wc [-lwc] fichier
Compte le nombre de
-l : lignes
-w : mots
-c : caractères
du fichier
Par défaut les trois
Exemple
$ wc lettre
LST Info, FST Fès 2018-2019 32
cp source destination
Copie le fichier source dans le fichier ou
répertoire destination
mv source destination
Déplace le fichier source dans le répertoire
destination
Exemple
$ cp lettre correspondances/lettre1
$ cp lettre correspondances
$ mv lettre correspondances
LST Info, FST Fès 2018-2019 33
ln source lien
Crée un lien physique sur le fichier source
Pas possible pour les répertoires ou fichiers d'autres SGF
-s : le lien est symbolique
Exemple
$ ln lettre : lien_lettre
$ ln -s lettre : lien_symbolique
LST Info, FST Fès 2018-2019 34
Commande tar :
Archive un ensemble de fichiers dans un seul
fichier (d’extension ‘.tar’)
Facilite l’organisation (moins d’encombrement dans le
SGF)
Efficace pour envoyer, par mail, plusieurs fichiers en
attachement
Restitue l’ensemble des fichiers à partir du
fichier archive (l’opération inverse)
Possibilité de compression et de décompression
de l’archive en appelant la commande "gzip"
LST Info, FST Fès 2018-2019 35
Commande tar
Syntaxe
$ tar [options] [fichiers]
Option Description
-x Extraire le contenu d'une archive.
-c Créer une nouvelle archive.
-t Afficher seulement la liste du contenu de l'archive, sans l'extraire.
-f Fichier Indiquer le nom du fichier archive.
-v Mode verbeux, affiche le détail des opérations.
-z Compresser ou décompresser en faisant appel à l'utilitaire gzip.
-j Compresser ou décompresser avec l'utilitaire bzip2.
-p Préserver les permissions des fichiers.
2018-2019 LST Info, FST Fès 36
2018-2019
Commande find
Cherche un fichier dans une arborescence donnée
Les critères de recherche peuvent porter sur :
Le nom
La dernière date d’accès
La dernière date de modification
Le type (fichier, répertoire ou lien)
…
2018-2019 LST Info, FST Fès 37
Commande find
Syntaxe
$ find [chemin] [options]
Option Description
-atime +n (-n) Trouve les fichiers accédés il y a plus/moins de n jours
-mtime +n (-n) Trouve les fichiers modifiés il y a plus/moins de n jours
-name "pierre" Trouve les fichiers dont le nom est pierre
-maxdepth n Définit le niveau n maximum de sous répertoire à explorer
Indique le type de fichier à rechercher. type peut être:
-d : pour les répertoires
- f : pour les fichiers
-type < d | f | l >
- l : pour les liens symboliques
2018-2019 LST Info, FST Fès 38
Commande grep :
Cherche les lignes d’un fichier qui contiennent un
motif (un mot ou une chaîne de caractères)
Affiche ces lignes sur la sortie standard
Syntaxe
$ grep motif fichier
Exemple
$ grep "ali" /home/prof/[Link]
2018-2019 LST Info, FST Fès 39
who
Affiche les informations sur les utilisateurs
connectés
who ami
Affiche les informations de l'utilisateur courant
whoami
Affiche le login de l'utilisateur courant
id
Affiche l'UID et le GID de l'utilisateur courant
LST Info, FST Fès 2018-2019 40
Commande useradd (voir aussi adduser)
Limité au root.
Ajouter un nouvel utilisateur au système.
Possibilité de spécifier quelques paramètres du nouveau compte
Informations concernant l’utilisateur (nom, fonction, …)
Durée de validité du compte
Groupe
Shell
…
LST Info, FST Fès 41
2018-2019
Commande useradd :
Option Description
-c <commentaire> Informations concernant l'utilisateur (nom, poste).
-d <répertoire> Chemin du répertoire personnel de l'utilisateur.
-e <date> Date d'expiration du compte. Le format est AAAA-MM-JJ.
C'est le nombre de jours suivant l'expiration du mot de passe
après lequel le compte est désactivé. La valeur 0 permet de
-f <nombre de jours> désactiver le compte dès que le mot de passe expire. La valeur
-1 permet de désactiver cette caractéristique. La valeur par
défaut est -1 .
Le nom du groupe ou le numéro du groupe de connexion initial
-g <groupe principal> de l'utilisateur. Le nom ou le numéro du groupe doivent exister.
Le numéro de groupe par défaut est 1.
Les autres groupes auxquels appartient l'utilisateur (séparés par des
-G <groupes supplémentaires> virgules).
LST Info, FST Fès 42
Commande useradd
Option Description
Le répertoire de l'utilisateur sera créé (par défaut, cela n'est pas
-m toujours le cas).
À utiliser si et seulement si l'option -m est présente. Permet de copier
-k <répertoire> les fichiers et répertoires contenus dans le répertoire modèle
</etc/skel si non spécifié) dans le répertoire de l'utilisateur.
Vous pouvez saisir le mot de passe en option. Il doit être chiffré (pour
récupérer la version cryptée d'un mot de passe il faut utiliser la
-p <mot de passe chiffré>
bibliothèque crypt). Si le mot de passe n'est pas défini, le
comportement par défaut est de désactiver le compte.
-s <chemin> Shell lancé à la connexion de l'utilisateur.
-u L'identifiant unique de l'utilisateur.
LST Info, FST Fès 43
2018-2019
Commande useradd :
Syntaxe
$ useradd [options] nouvel_utilisateur
Exemple
Création du nouveau compte alibaba (login) appartenant au
groupe Etudiants avec bash comme shell par défaut
$ useradd –c " Ali BABA" –g Etudiants –s /bin/bash alibaba
LST Info, FST Fès 44
2018-2019
Commande userdel
Supprimer un utilisateur du système
Syntaxe
$ userdel [-r] login
Rajouter l’option –r permet de supprimer le répertoire personnel de
l’utilisateur en question
LST Info, FST Fès 45
2018-2019
Commande passwd
Changer le mot de passe
Un utilisateur normal peut changer uniquement son mot de passe
L’administrateur peut changer le mot de passe de tous les
utilisateurs
Verrouiller/déverrouiller un compte
Supprimer un mot de passe
LST Info, FST Fès 46
2018-2019
Commande passwd
Syntaxe
Option Description
Indique que seul le mot de passe doit être mis à jour, sans toucher aux propriétés
-k
d’expiration
Permet de verrouiller le compte spécifié en préfixant le mot de passe crypté par le
-1
caractère « ! ». Seul l'utilisateur root peut utiliser cette option.
- - stdin Le mot de passe doit être lu à partir de l'entrée standard qui peut alors être un pipe.
Déverrouille le mot de passe du compte. Seul l'utilisateur root peut utiliser cette
-u
option.
Supprime le mot de passe d'un compte. Le champ réservé au mot de passe crypté
sera supprimé dans le fichier de configuration. Seul l'utilisateur root peut utiliser
-d
cette option.
Affiche des informations sur le statut du mot de passe pour un compte donné.
-S
Seul l'utilisateur root peut utiliser cette option.
LST Info, FST Fès 47
2018-2019
Commande passwd :
Syntaxe
$ passwd [options] [login]
Si le paramètre login n’est pas spécifié alors, le changement
s’applique pour le compte courant. Le système demande de
saisir l’ancien et le nouveau mot de passe.
Exemple
$ passwd
$ passwd –d alibaba
LST Info, FST Fès 48
2018-2019
Commande groupadd (voir aussi addgroup)
Crée un nouveau groupe
Syntaxe
$ groupadd [options] nouveau_groupe
Option Description
-g Permet de spécifier le GID du nouveau groupe
-f Stoppe la commande si le groupe ou le GID existe déjà
LST Info, FST Fès 49
2018-2019
Commande groupdel
Supprime un groupe
Aucun utilisateur ne doit avoir ce groupe comme principal.
Syntaxe
$ groupdel groupe
LST Info, FST Fès 50
ps :
Affiche les informations des processus actifs
Options
-l : affiche les informations complètes des processus
-x : affiche tous les processus actifs (d'autres
utilisateurs)
-u : affiche les processus d'un utilisateur donné
Exemple
$ ps -l
$ ps -u dupont
LST Info, FST Fès 51
kill -signal ident_processus
Envoi un signal à un processus
Exemple
$ kill -9 33456
LST Info, FST Fès 52
Déterminent les types d’opérations qu’un utilisateur
ou une classe d’utilisateurs peuvent effectuées.
Chaque fichier peut avoir ses propres droits d’accès
Système de protection très puissant
LST Info, FST Fès 53
Types d’utilisateurs
Propriétaire (owner)
Groupe du propriétaire (ou du fichier)
Les autres utilisateurs (others)
LST Info, FST Fès 54
Types d’autorisation des fichiers
r : droit d’accès en lecture
w : droit de modification
x : droit d’exécution (limité aux fichiers exécutables)
LST Info, FST Fès 55
Types d’autorisation des répertoires
r : droit d’afficher le contenu
w : droit d’ajout et de suppression
x : droit d’exploration
LST Info, FST Fès 56
Exemple
- rwx rw- --x monexe
- rwx rw- r-- document
Droits des
autres
Droits du groupe
Droits du
propriétaire - : fichier ordinaire
d : répertoire
c, b : fichier périphérique
Type de fichier l : lien sur un fichier
s : socket
LST Info, FST Fès
p : tube 57
chmod mode fichier
Mode = utilisateurs/permission
Exemple
$chmod u+x fich1
$chmod g-w fich1
$chmod +r fich1
Mode = chiffres
Exemple User Group Other
$ chmod 754 fich1 rwx r-x r--
111 101 100
7 5 4
LST Info, FST Fès 58
chown nouveau_util fichier
Change le propriaitaire du fichier
Exemple
$ chown dubois fich1
chgrp nouveau_grp fichier
Change le groupe du fichier
Exemple
$ chgrp telecom fich1
LST Info, FST Fès 59
> : la sortie standard est redirigée vers un fichier
(écrasement de son contenu s'il existe déjà)
< : les entrées de la commande proviennent d'un
fichier
>> : la sortie standard est insérée à la fin d'un fichier
2> : la sortie d'erreur est redirigée vers un fichier
2>> : la sortie d'erreur est insérée à la fin d'un fichier
LST Info, FST Fès 60
Permet la communication des entrées/sorties entre les
processus.
Schéma
cmd1|cmd2| cmd3|….
Le résultat de cmd1 sera l’entrée de cmd2, le résultat de cmd2
sera l’entrée de cmd3 et ainsi de suite.
Exemple
$ ls –l | grep "prog"
LST Info, FST Fès 2018-2019 61
Introduction aux Scripts Shell
[Link] Alaoui LST Info, FST Fès 2018-2019 62
Imaginez un mini-langage de programmation intégré à
Linux.
Ce n'est pas un langage aussi complet que peuvent
l'être le C, le C++ ou le Java par exemple,
mais il permet d'automatiser la plupart de vos tâches :
sauvegarde des données, surveillance de la charge de
votre machine, etc.
On aurait très bien pu faire tout cela en créant un
programme en C par exemple.
Pourquoi alors ???
[Link] Alaoui LST Info, FST Fès 2018-2019 63
Le gros avantage du langage shell est d’être
totalement intégré à Linux :
- il n'y a rien à installer,
- rien à compiler.
- Et surtout : vous avez très peu de
nouvelles choses à apprendre.
[Link] Alaoui LST Info, FST Fès 2018-2019 64
En effet, toutes les commandes que l'on utilise
dans les scripts shell sont des commandes du
système que vous connaissez déjà : ls, cut, grep,
sort…
[Link] Alaoui LST Info, FST Fès 2018-2019 65
Tout d’abord on doit distinguer entre les deux
environnements très différents disponibles sous-
linux :
l'environnement console ;
l'environnement graphique.
[Link] Alaoui LST Info, FST Fès 2018-2019 66
La plupart du temps, sur sa machine, on a
tendance à utiliser l'environnement graphique, qui
est plus intuitif.
Cependant, la console est aussi un allié très puissant
qui permet d'effectuer des actions habituellement
difficiles à réaliser dans un environnement
graphique.
[Link] Alaoui LST Info, FST Fès 2018-2019 67
Voici les noms de quelques-uns des principaux shells qui
existent :
sh : Bourne Shell. L'ancêtre de tous les shells.
bash : Bourne Again Shell. Une amélioration du Bourne
Shell, disponible par défaut sous Linux et Mac OS X.
ksh : Korn Shell. Un shell puissant assez présent sur les
Unix, 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.
[Link] Alaoui LST Info, FST Fès 2018-2019 68
Tout d'abord que l'ancêtre de tous les shells est le sh (Bourne
Shell).
C'est le plus vieux et il est installé sur tous les OS basés sur Unix.
Il est néanmoins pauvre en fonctionnalités par rapport aux autres
shells.
Le bash (Bourne Again Shell) : est le shell par défaut de la plupart
des distributions Linux mais aussi celui du terminal de Mac OS X.
Il y a fort à parier que c'est celui que vous utilisez en ce moment
sous Linux.
[Link] Alaoui LST Info, FST Fès 2018-2019 69
Voici dans l’hiérarchie comment ont évolué les
shells.
Chacun hérite la plupart des fonctionnalités de
son ancêtre :
[Link] Alaoui LST Info, FST Fès 2018-2019 70
sh reste toujours plus répandu que bash.
En fait, vous pouvez être sûrs que tous les OS basés
sur Unix possèdent sh,
mais ils n'ont pas tous forcément bash.
Certains OS basés sur Unix, notamment les OS
propriétaires (AIX et Solaris…), utilisent d'autres
types de shells ;
le ksh y est par exemple très répandu.
[Link] Alaoui LST Info, FST Fès 2018-2019 71
La première chose à faire dans un script shell est
d'indiquer… quel shell est utilisé :
#!/bin/bash
Le #! est appelé le sha-bang
/bin/bash peut être remplacé par /bin/sh si vous
souhaitez coder pour sh, /bin/ksh pour ksh, etc.
Bien que non indispensable, cette ligne permet de
s'assurer que le script est bien exécuté avec le bon
shell.
[Link] Alaoui LST Info, FST Fès 2018-2019 72
En l'absence de cette ligne, c'est le shell de
l'utilisateur qui sera chargé.
Cela pose un problème : si votre script est écrit
pour bash et que la personne qui l'exécute utilise
ksh, il y a de fortes chances pour que le script ne
fonctionne pas correctement !
Laligne du sha-bang permet donc de « charger » le
bon shell avant l'exécution du script.
[Link] Alaoui LST Info, FST Fès 2018-2019 73
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.
[Link] Alaoui LST Info, FST Fès 2018-2019 74
On va donc créer un script bash qui va juste se
contenter d'afficher le contenu du dossier courant :
#!/bin/bash
ls
[Link] Alaoui LST Info, FST Fès 2018-2019 75
Les commentaires :
Ce sont des lignes qui ne seront pas exécutées mais
qui permettent d'expliquer ce que fait votre script.
Tous les commentaires commencent par un #.
Par exemple :
#!/bin/bash
# Affichage de la liste des fichiers
ls
[Link] Alaoui LST Info, FST Fès 2018-2019 76
Exécuter le script bash :
Notremission maintenant est de parvenir à
exécuter le petit script.
Commencez par enregistrer votre fichier et fermez
votre éditeur.
Vous retrouvez alors l'invite de commandes.
[Link] Alaoui LST Info, FST Fès 2018-2019 77
Donner les droits d'exécution au script :
Si vous faites un ls -l pour voir votre fichier qui
vient d'être créé, vous obtenez par exemple ceci :
$ ls -l
total 4 -rw-r--r-- 1 mateo21 mateo21 17 2018-11-
13 14:33 test_1.sh
[Link] Alaoui LST Info, FST Fès 2018-2019 78
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 :
$ chmod +x test_1.sh
Vous pouvez vérifier que le droit a bien été donné :
$ ls -l
total 4
-rwxr-xr-x 1 mateo21 mateo21 17 2018-11-13 14:33
test_1.sh
[Link] Alaoui LST Info, FST Fès 2018-2019 79
Comment font les autres programmes pour pouvoir
être exécutés depuis n'importe quel répertoire
sans « ./ » devant ?
Ils sont placés dans un des répertoires du PATH.
Le PATH est une variable système qui indique où sont
les programmes exécutables sur votre ordinateur.
Si vous tapez echo $PATH vous aurez la liste de ces
répertoires « spéciaux ».
[Link] Alaoui LST Info, FST Fès 2018-2019 80
Il vous suffit donc de déplacer ou copier votre script
dans un de ces répertoires, comme :
/bin,
/usr/bin
/usr/local/bin
ou encore un autre répertoire du PATH.
- Notez qu'il faut être root pour pouvoir faire cela.
- Une fois que c'est fait, vous pourrez alors taper
simplement [Link] pour exécuter votre programme.
[Link] Alaoui LST Info, FST Fès 2018-2019 81
Comme dans tous les langages de programmation, on
trouve en bash ce que l'on appelle des variables.
Les variables en bash sont assez particulières. Il faut
être très rigoureux lorsqu'on les utilise.
Toute variable possède un nom et une valeur :
message='Bonjour tout le monde'
Dans le cas présent :
la variable a pour nom : message ;
… et pour valeur : Bonjour tout le monde.
[Link] Alaoui LST Info, FST Fès 2018-2019 82
Ne mettez pas d'espaces autour du symbole égal
« = » ! Le bash est très pointilleux sur de nombreux
points, évitez par conséquent de le vexer.
Je vous signalerai systématiquement les pièges à
éviter, car il y en a un certain nombre !
Si vous voulez insérer une apostrophe dans la
valeur de la variable, il faut la faire précéder d'un
antislash \.
Exemple : message='Bonjour c\'est moi'
[Link] Alaoui LST Info, FST Fès 2018-2019 83
echo : afficher une variable
Son principe est très simple : elle affiche dans la
console le message demandé.
Un exemple :
$ echo Salut tout le monde
Salut tout le monde
[Link] Alaoui LST Info, FST Fès 2018-2019 84
En fait, la commande echo affiche dans la console
tous les paramètres qu'elle reçoit.
Ici, nous avons envoyé quatre paramètres :
Salut ;
tout ;
le ;
monde.
Chacun des mots est considéré comme un paramètre
que echo a affiché.
[Link] Alaoui LST Info, FST Fès 2018-2019 85
Si vous mettez des guillemets autour de votre message,
celui-ci sera considéré comme étant un seul et même
paramètre :
$ echo "Salut tout le monde"
Salut tout le monde
Si vous voulez insérer des retours à la ligne, il faudra activer
le paramètre -e et utiliser le symbole \n :
$ echo -e "Message\nAutre ligne"
Message
Autre ligne
[Link] Alaoui< LST Info, FST Fès 2018-2019 86
Afficher une variable :
Pour afficher une variable, nous allons de nouveau
utiliser son nom précédé du symbole dollar $ :
#!/bin/bash
message='Bonjour tout le monde' #pas de $
echo $message
[Link] Alaoui LST Info, FST Fès 2018-2019 87
Les quotes :
Il est possible d'utiliser des quotes pour délimiter
un paramètre contenant des espaces. Il existe trois
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.
[Link] Alaoui LST Info, FST Fès 2018-2019 88
Selon le type de quotes que vous utilisez, la réaction
de bash ne sera pas la même.
Les simples quotes ' '
Commençons par les simples quotes :
message='Bonjour tout le monde'
echo 'Le message est : $message'
Le message est : $message
Avec de simples quotes, la variable n'est pas analysée
et le $ est affiché tel quel.
[Link] Alaoui LST Info, FST Fès 2018-2019 89
Les doubles quotes " " :
Avec des doubles quotes :
message='Bonjour tout le monde'
echo "Le message est : $message"
Le message est : Bonjour tout le monde
Cette fois, la variable est analysée et son contenu
affiché.
[Link] Alaoui LST Info, FST Fès 2018-2019 90
Les back quotes `` :
Un peu particulières, les back quotes demandent à
bash d'exécuter ce qui se trouve à l'intérieur.
Exemple :
message=`pwd`
echo "Vous êtes dans le dossier $message"
Vous êtes dans le dossier /home/mateo21/bin
[Link] Alaoui LST Info, FST Fès 2018-2019 91
read : demander une saisie
La façon la plus simple de l'utiliser est d'indiquer le
nom de la variable dans laquelle le message saisi
sera stocké : read nomvariable
Exemple :
#!/bin/bash
read nom
echo "Bonjour $nom !"
[Link] Alaoui LST Info, FST Fès 2018-2019 92
Affecter simultanément une valeur à plusieurs Variables :
On peut demander de saisir autant de variables d'affilée que
l'on souhaite.
Exemple :
#!/bin/bash
read nom prenom
echo "Bonjour $nom $prenom !"
Deschamps Mathieu
Bonjour Deschamps Mathieu !
[Link] Alaoui LST Info, FST Fès 2018-2019 93
read lit ce que vous tapez mot par mot (en considérant
que les mots sont séparés par des espaces).
-p : afficher un message de prompt ou d’invite
Bon : notre programme ne permet pas à l'utilisateur de
savoir quoi faire :
Avec l'option -p de read, vous pouvez faire cela :
#!/bin/bash
read -p 'Entrez votre nom : ' nom
echo "Bonjour $nom !"
[Link] Alaoui LST Info, FST Fès 2018-2019 94
-n : limiter le nombre de caractères
Avec -n, vous pouvez au besoin couper au bout de X
caractères si vous ne voulez pas que l'utilisateur insère
un message trop long.
Exemple :
#!/bin/bash
read -p 'Entrez votre login (5 caractères max) : ' -n 5 nom
echo -e "\nBonjour $nom !"
Entrez votre login (5 caractères max) : ahmed
Bonjour ahmed !
[Link] Alaoui LST Info, FST Fès 2018-2019 95
-s : ne pas afficher le texte saisi
Le paramètre -s masque les caractères que vous
saisissez.
Cela vous servira notamment si vous souhaitez que
l'utilisateur entre un mot de passe :
Exemple :
#!/bin/bash
read -p 'Entrez votre mot de passe : ' -s pass
echo -e "\nMerci ! Je vais dire à tout le monde que votre mot de passe est $pass ! «
Entrez votre mot de passe :
Merci ! Je vais dire à tout le monde que votre mot de passe est supertopsecret2018 !
[Link] Alaoui LST Info, FST Fès 2018-2019 96
En bash, les variables sont toutes des chaînes de
caractères.
Le bash n'est pas vraiment capable de manipuler
des nombres ;
Il n'est donc pas capable d'effectuer des opérations.
Heureusement, il est possible de passer par des
commandes.
Ici, la commande à connaître est let.
[Link] Alaoui LST Info, FST Fès 2018-2019 97
Exemple :
let "a = 5"
let "b = 2"
let "c = a + b"
#!/bin/bash
let "a = 5"
let "b = 2"
let "c = a + b"
echo $c
À la fin de ce script, la variable $c vaudra ?7
[Link] Alaoui LST Info, FST Fès 2018-2019 98
Les opérations utilisables sont :
l'addition : +
la soustraction : -
la multiplication : *
la division : /
la puissance : **
le modulo : %.
Quelques exemples :
let "a = 5 * 3" # $a = 15
let "a = 4 ** 2" # $a = 16 (4 au carré)
let "a = 8 / 2" # $a = 4
let "a = 10 / 3" # $a = 3
let "a = 10 % 3" # $a = 1
[Link] Alaoui LST Info, FST Fès 2018-2019 99
Notez
qu'il est possible aussi de contracter les
commandes, comme cela se fait en langage C.
Exemple :
let "a = a * 3" équivaut à let "a *= 3"
[Link] Alaoui LST Info, FST Fès 2018-2019 100
Les variables que vous créez dans vos scripts bash
n'existent que dans ces scripts.
Les variables d'environnement sont des variables
que l'on peut utiliser dans n'importe quel
programme.
On parle aussi parfois de variables globales.
[Link] Alaoui LST Info, FST Fès 2018-2019 101
Les plus fameuses :
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.
EDITOR : l'éditeur de texte par défaut qui s'ouvre lorsque cela est
nécessaire ;
HOME : la position de votre dossier home ;
PWD : le dossier dans lequel vous vous trouvez ;
OLDPWD : le dossier dans lequel vous vous trouviez auparavant.
[Link] Alaoui LST Info, FST Fès 2018-2019 102
Exemple :
#!/bin/bash
echo "Votre éditeur par défaut est $EDITOR"
Votre éditeur par défaut est nano
[Link] Alaoui LST Info, FST Fès 2018-2019 103
Vos scripts bash peuvent eux aussi accepter des
paramètres.
Ainsi, on pourrait appeler notre script comme
ceci :
./[Link] param1 param2 param3
[Link] Alaoui LST Info, FST Fès 2018-2019 104
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 à réaliser !
[Link] Alaoui LST Info, FST Fès 2018-2019 105
En effet, des variables de paramètres sont automatiquement
créées :
$# : contient le nombre de paramètres ;
$0 : contient le nom du script exécuté (ici ./[Link]) ;
$1 : contient le premier paramètre ;
$2 : contient le second paramètre ;
…;
$9 : contient le 9e paramètre ;
[Link] Alaoui LST Info, FST Fès 2018-2019 106
Exemple :
#!/bin/bash
echo "Vous avez lancé $0, il y a $# paramètres"
echo "Le paramètre 1 est $1"
$ ./[Link] param1 param2 param3 ./[Link], il y a 3 pa
ramètres Le paramètre
Exemple : [Link]; [Link]
[Link] Alaoui LST Info, FST Fès 2018-2019 107
Comme dans la plupart des langages de programmation,
on peut créer des variables en shell qui stockent
temporairement des valeurs en mémoire.
Une variable nommée variable est accessible en
écrivant $variable.
La commande echo affiche un texte ou le contenu
d'une variable dans la console.
read attend une saisie au clavier de la part de
l'utilisateur et stocke le résultat dans une variable.
LST Info, FST Fès 2017-2018 108
On peut effectuer des opérations mathématiques
sur des nombres à l’aide de la commande let.
Certaines variables sont accessibles partout, dans
tous les scripts : ce sont les variables d'environnement.
On peut les lister avec la commande env.
Les paramètres envoyés à notre script
(comme ./script -p) sont transmis dans des variables
numérotées : $1,$2,$3…
Le nombre de paramètres envoyés est indiqué dans la
variable $#.
LST Info, FST Fès 2017-2018 109
Ce sont des variables qui contiennent plusieurs cases, comme un
tableau.
Pour définir un tableau, on peut écrire :
tableau=('valeur0' 'valeur1' 'valeur2')
Cela crée une variable tableau qui contient trois valeurs
(valeur0, valeur1, valeur2).
Pour accéder à une case du tableau, il faut utiliser la syntaxe
suivante :
${tableau[2]}
… ceci affichera le contenu de la case n° 2 (donc valeur2).
Les cases sont numérotées à partir de 0 !
[Link] Alaoui LST Info, FST Fès 2018-2019 110
Exemple : [Link], [Link]
#!/bin/bash
tableau=('valeur0' 'valeur1' 'valeur2')
tableau[5]='valeur5'
echo ${tableau[1]}
Res : valeur1
Vous pouvez afficher l'ensemble du contenu du tableau d'un seul coup en
utilisant ${tableau[*]} :
Exemple :
#!/bin/bash
tableau=('valeur0' 'valeur1' 'valeur2')
tableau[5]='valeur5'
echo ${tableau[*]}
Res : valeur0 valeur1 valeur2 valeur5
[Link] Alaoui LST Info, FST Fès 2018-2019 111
if : la condition la plus simple
La syntaxe en bash est la suivante :
if [ test ] if [ test ]; then
then
echo "C'est vrai"
echo "C'est vrai"
fi fi
Notez : il y a des espaces à l'intérieur des crochets.
On ne doit pas écrire[test] mais [ test ] !
[Link] Alaoui LST Info, FST Fès 2018-2019 112
Exemple :
#!/bin/bash
nom= "Ahmed" #*
if [ $nom = "Ahmed" ]
then
echo "Salut Ahmed !"
fi
Affiche : Salut Ahmed #car*
Exemple : [Link],
[Link] Alaoui LST Info, FST Fès 2018-2019 113
Notez aussi que vous pouvez tester deux variables à la
fois dans le if :
Exemple : [Link]
#!/bin/bash
nom1= "Ahmed"
nom2= "Ali"
if [ $nom1 = $nom2 ]; then
echo "Salut les jumeaux !"
fi
Comme ici $nom1 est différent de$nom2, le contenu du
if ne sera pas exécuté. Le script n'affichera donc rien.
[Link] Alaoui LST Info, FST Fès 2018-2019 114
Syntaxe :
if [ test ]
then
echo "C'est vrai"
else
echo "C'est faux"
fi
[Link] Alaoui LST Info, FST Fès 2018-2019 115
Exemple : [Link]
#!/bin/bash
nom= "Ahmed"
if [ $nom = "Ali" ]
then
echo "Salut Ali !"
else
echo "J'te connais pas, ouste !"
fi
[Link] Alaoui LST Info, FST Fès 2018-2019 116
Je vous propose plutôt de vous baser sur le premier paramètre ($1)
envoyé au script :
#!/bin/bash
if [ $1 = "Ahmed" ]; then
echo "Salut Ahmed!"
else
echo "J'te connais pas, ouste !"
fi
Testez maintenant votre script :./[Link] Ahmed
Exemple : [Link]
[Link] Alaoui LST Info, FST Fès 2017-2018 117
Syntaxe :
if [ test ] ; then
echo "Le premier test a été vérifié"
elif [ autre_test ]
then
echo "Le second test a été vérifié"
elif [ encore_autre_test ]
then
echo "Le troisième test a été vérifié"
else
echo "Aucun des tests précédents n'a été vérifié"
fi
Exemple : [Link]
[Link] Alaoui LST Info, FST Fès 2017-2018 118
Tests sur des chaînes de caractères :
en bash toutes les variables sont considérées comme
des chaînes de caractères.
Condition Signification
$chaine1 = $chaine2 Vérifie si les deux chaînes sont
identiques.
Il est aussi possible d'écrire « == »
pour les habitués du langage C.
$chaine1 != $chaine2 Vérifie si les deux chaînes sont
différentes.
-z $chaine Vérifie si la chaîne est vide.
-n $chaine Vérifie si la chaîne est non vide.
Exemple : [Link]
[Link] Alaoui LST Info, FST Fès 2018-2019 119
On peut aussi vérifier si le paramètre existe avec-z (vérifie si la chaîne est
vide).
En effet, si une variable n'est pas définie, elle est considérée comme vide par
bash.
On peut donc par exemple s'assurer que $1 existe en faisant comme suit :
Exemple : [Link]
#!/bin/bash
if [ -z $1 ]; then
echo "Pas de paramètre"
else echo "Paramètre présent"
fi
$ ./[Link]
Pas de paramètre
$ ./[Link] param
Paramètre présent
[Link] Alaoui LST Info, FST Fès 2018-2019 120
Test sur des nombres :
Condition Signification
$num1 -eq $num2 Vérifie si les nombres sont égaux (equal). À ne pas confondre avec le
«=»
$num1 -ne $num2 Vérifie si les nombres sont différents (nonequal). Encore une fois, ne
confondez pas avec « != »
$num1 -lt $num2 Vérifie si num1 est inférieur ( < ) à num2 (lowerthan)
$num1 -le $num2 Vérifie si num1 est inférieur ou égal ( <= ) à num2 (lowerorequal)
$num1 -gt $num2 Vérifie si num1 est supérieur ( > ) à num2 (greaterthan).
$num1 -ge $num2 Vérifie si num1 est supérieur ou égal ( >= ) à num2(greaterorequal).
[Link] Alaoui LST Info, FST Fès 2018-2019 121
Exemple : [Link]
#!/bin/bash
if [ $1 -ge 20 ]
then echo "Vous avez envoyé 20 ou plus"
else echo "Vous avez envoyé moins de 20"
fi
$ ./[Link] 23
Vous avez envoyé 20 ou plus
$ ./[Link] 11
Vous avez envoyé moins de 20
[Link] Alaoui LST Info, FST Fès 2017-2018 122
Tests sur des fichiers :
Un des avantages de bash sur d'autres langages est
que l'on peut très facilement faire des tests sur des
fichiers.
Condition Signification
-e $nomfichier Vérifie si le fichier existe.
-d $nomfichier Vérifie si le fichier est un répertoire. N'oubliez pas
que sous Linux, tout est considéré comme un fichier,
même un répertoire !
-f $nomfichier Vérifie si le fichier est un… fichier. Un vrai fichier
cette fois, pas un dossier.
-L $nomfichier Vérifie si le fichier est un lien symbolique (raccourci).
-r $nomfichier Vérifie si le fichier est lisible (r).
-w $nomfichier Vérifie si le fichier est modifiable (w).
-x $nomfichier Vérifie si le fichier est exécutable (x).
[Link] Alaoui LST Info, FST Fès 2018-2019 123
Je vous propose de faire un script qui demande l'utilisateur
d'entrer le nom d'un répertoire et qui vérifie si c’est bien un :
#!/bin/bash
read -p 'Entrez un répertoire : ' repertoire
if [ -d $repertoire ]
then echo "Bien, vous avez compris ce que j'ai dit !
else echo "Vous n'avez rien compris..."
fi
Entrez un répertoire : /home
Bien, vous avez compris ce que j'ai dit !
Entrez un répertoire : [Link]
Vous n'avez rien compris...
Exemple : [Link]
[Link] Alaoui LST Info, FST Fès 2018-2019 124
Effectuer plusieurs tests à la fois
Dans un if, il est possible de faire plusieurs tests à
la fois.
Les deux symboles à connaître sont :
&& : signifie « et » ;
|| : signifie « ou ».
[Link] Alaoui LST Info, FST Fès 2018-2019 125
Il faut encadrer chaque condition par des crochets.
Exemple :
#!/bin/bash
if [ $# -ge 1 ] && [ $1 = 'vrai' ]
then echo "Bravo !"
echo "Vous connaissez le mot de passe"
else echo "Vous n'avez pas le bon mot de passe"
fi
$ ./[Link] vrai
Bravo ! Vous connaissez le mot de passe
#à condition que la 1ere condition soit satisfaite.
Exemple : [Link], [Link]
[Link] Alaoui LST Info, FST Fès 2018-2019 126
Inverser un test :
Il est possible d'inverser un test en utilisant la
négation :
if [ ! -e fichier ]
then echo "Le fichier n'existe pas"
fi
[Link] Alaoui LST Info, FST Fès 2018-2019 127
case : tester plusieurs conditions à la fois
Exemple : [Link], [Link]
#!/bin/bash
case $1 in
"Ahmed") echo "Salut Ahmed !"
;;
"Ali") echo "Bien le bonjour Ali"
;;
"Jamal") echo "Hé Jamal, ça va ?"
;;
*) #rôle du default en C
echo "J'te connais pas, ouste !"
;;
esac #Marque le fin du case
# ;; le double point-virgule dit à bash d'arrêter là, la lecture du case, si la condition
est verifiée.
[Link] Alaoui LST Info, FST Fès 2018-2019 128
Oneffectue des tests dans ses programmes grâce
aux if, then, [[ elif, then, fi] else,] fi.
Onpeut comparer deux chaînes de caractères
entre elles, mais aussi des nombres.
On peut également effectuer des tests sur des
fichiers : est-ce que celui-ci existe ? Etc.
LST Info, FST Fès 2017-2018 129
Aubesoin, il est possible de combiner plusieurs
tests à la fois avec les symboles&&(ET) et||(OU).
Lesymbole ! (point d'exclamation) exprime la
négation dans une condition.
Lorsquel'on effectue beaucoup de tests sur une
même variable, il est parfois plus pratique d'utiliser
un bloc case in… esac plutôt qu'un bloc if… fi.
LST Info, FST Fès 2017-2018 130
while : boucler « tant que »
while [ test ] while [ test ]; do
do echo 'Action en boucle'
echo 'Action en boucle'
done done
Exemple : [Link]
#!/bin/bash
while [ -z $reponse ] || [ $reponse != 'oui' ]
do
read -p 'Dites oui : ' reponse
done
[Link] Alaoui LST Info, FST Fès 2018-2019 131
for : boucler sur une liste de valeurs
En bash, la boucle for s'écrit comme ceci :
#!/bin/bash
for variable in 'valeur1' 'valeur2' 'valeur3'
do
echo "La variable vaut $variable"
done
[Link] Alaoui LST Info, FST Fès 2018-2019 132
Ce qui donne, si on l'exécute :
La variable vaut valeur1
La variable vaut valeur2
La variable vaut valeur3
Toutefois, la liste de valeurs n'a pas besoin d'être définie
directement dans le code.
On peut utiliser une variable :
#!/bin/bash
liste_fichiers=`ls`
for fichier in $liste_fichiers
do
echo "Fichier trouvé : $fichier"
done
[Link] Alaoui LST Info, FST Fès 2018-2019 133
Un for plus classique :
En bash, comme on l'a vu, le for permet de parcourir une
liste de valeurs.
Toutefois, en trichant un peu à l'aide de la commande seq, il
est possible de simuler un for classique :
#!/bin/bash
for i in `seq 1 10`;
do
echo $i
done
Seq : génère tous les nombres allant du premier
paramètre au dernier paramètre.
Exemple : [Link]
[Link] Alaoui LST Info, FST Fès 2018-2019 134
Comment déclarer une fonction :
# déclaration méthode 1 # déclaration méthode 2
maFonction () function maFonction
{ {
bloc d’instructions bloc d’instructions
} }
#appel de ma fonction #appel de la fonction
maFonction maFonction
Vous pouvez déclarer une fonction Bash avec maFonction()
ou function maFonction.
Vous faites ensuite appel à votre fonction maFonction() en
tapant simplement
[Link] Alaoui
dans votre code2018-2019
LST Info, FST Fès
maFonction. 135