TP3 Shells
description
Transcript of TP3 Shells
ISET MEDENINE [2011-2012]
1
TP3 : les shells Matière AS2
Enseignantes R. BEN AZZOUN
S.BEN CHAABAN Classe TI1 A & B
1. Définition
Sous Unix, on appelle shell l’interpréteur de commandes qui fait office d'interface entre
l'utilisateur et le système d’exploitation. Les shells sont des interpréteurs : cela signifie que
chaque commande saisie par l’utilisateur (ou lue à partir d’un fichier) est syntaxiquement
vérifiée puis exécutée.
Un shell est un interpréteur de commande en mode texte. Il peut s’utiliser en mode interactif
ou pour exécuter des programmes écrits dans le langage de programmation du shell (appelés
shell scripts).
Exemples :
sh (Bourne shell)
bash (Bourne again shell)
csh (C shell)
ksh (Korn shell)
Un shell possède un double aspect :
un aspect environnement de travail
un aspect langage de programmation.
2. Un environnement de travail
En premier lieu, un shell doit fournir un environnement de travail agréable et puissant. Par
exemple, bash permet le rappel des commandes précédentes (gestion de l’historique), la
modification en ligne du texte de la commande courante, la gestion des travaux lancés en
arrière-plan (ajout de & à la fin du commande), l’initialisation adéquate de variables de
configuration et la création de raccourcis de commandes.
En mode interactif, bash affiche à l’écran une chaîne d’appel (appelée également prompt ou
invite), qui se termine par défaut par le caractère # suivi d’un caractère espace pour
l’administrateur système (utilisateur root) et par le caractère $ suivi d’un caractère espace
pour les autres utilisateurs.
ISET MEDENINE [2011-2012]
2
3. Un langage de programmation
Les shells ne sont pas seulement des interpréteurs de commandes mais également de
véritables langages de programmation. Un shell comme bash intègre :
les notions de variable, d’opérateur arithmétique, de structure de contrôle, de
fonction, présentes dans tout langage de programmation classique, mais aussi
des opérateurs spécifiques (ex : | et ;)
Remarque : L’opérateur |, appelé tube, est un opérateur caractéristique des shells et connecte
la sortie d’une commande à l’entrée de la commande suivante.
4. Shell utilisé
La manière la plus simple de connaître le shell que l’on utilise est d’exécuter la commande
unix ps qui liste les processus de l’utilisateur
5. Métacaractères du shell
Certains caractères, appelés métacaractères, sont interprétés spécialement par le shell avant
de lancer la commande entrée par l’utilisateur.
Les métacaractères permettent donc de spécifier facilement des ensembles de fichiers, sans
avoir à rentrer tous leurs noms. Voici les plus utilisés :
*: remplacé par n’importe quelle suite de caractères
?: remplacé par un seul caractère quelconque
[ ]:remplacé par l’un des caractères mentionnés entre les crochets. On peut spécifier un
intervalle avec le tiret - (Exemple :[a-z]spécifie l’ensemble des lettres minuscules).
6. Initialisation d’un shell
Lors de leur démarrage, les shell exécutent des fichiers de configuration (généralement sous
/etc, modifiable par l'administrateur système et utilisé chaque fois qu'un shell est lancé) qui
peuvent contenir des commandes quelconques et sont généralement utilisés pour définir des
variables d’environnement et des alias.
csh exécute le fichier ~/.cshrc (le “rc” signifie run command)
sh exécute ~/.profile
bash exécute ~/.bash_profile ou à défaut ~/.profile.
ISET MEDENINE [2011-2012]
3
Rappelons que les fichiers dont le nom commence par un point ne sont pas affichés par la
commande ls (sauf si on emploie l’option -a) ; les fichiers d’initialisation sont donc
“invisibles”.
7. Variables d’environnement
Le système UNIX défini pour chaque processus une liste de variables d’environnement, qui
permettent de définir certains paramètres : répertoires d’installation des utilitaires, type de
terminal, etc. Chaque programme peut accéder à ces variables pour obtenir des informations
sur la configuration du système.
La commande set permet d’afficher la liste des variables d'environnement et de leurs valeurs.
Voici quelques variables caractéristiques :
HOME : Répertoire de base d'un utilisateur (dynamique)
LOGNAME : Login de l'utilisateur en session (dynamique)
PATH : Ensemble des chemins de recherche des applications lancées
PS1 : Prompt
PWD : Répertoire courant (dynamique)
SHELL : Nom du shell courant (dynamique)
~ : Répertoire de base d'un utilisateur (dynamique)
Remarque : pour désigner la valeur d'une variable, on utilise son nom précédé d'un $.
8. Fichiers shell ou scripts
Lorsqu’un traitement nécessite l’exécution de plusieurs commandes, il est préférable de les
sauvegarder dans un fichier plutôt que de les retaper au clavier chaque fois que le traitement
doit être lancé. Ce type de fichier est appelé fichier de commandes ou fichier shell ou encore
script shell.
Un script peut être une simple liste de commandes. La première ligne du script doit préciser
l’interpréteur utilisé, elle commence par les deux caractères #!, suivis du chemin de
l’interpréteur.
Voici un exemple simple :
#!/bin/bash
# liste
echo ‘’Contenu du repertoire courant’’
ls -l
ISET MEDENINE [2011-2012]
4
Ce script affiche la liste détaillée des fichiers du répertoire courant.
Il doit être entré à l’aide d’un éditeur de texte, enregistré dans un fichier (nommé par
exemple “liste”), puis rendu exécutable grâce à la commande chmod a+x liste (a designe
all ;users+groups+others)
La deuxième ligne s’agit d’un commentaire (inutile dans le fonctionnement de script) qui
comporte le nom du fichier.
Pour lancer l’exécution d’un fichier shell, on peut utiliser la commande :
bash nom_fich ou . /nom_fich
9. Utilisation des variables
Une variable est identifiée par un nom, c'est-à-dire une suite de lettres ou de chiffres. Les
lettres majuscules et minuscules sont différenciées.
Les variables peuvent être classées en trois groupes :
les variables utilisateur (définies par l’utilisateur lors de l’ecriture du script)
les variables prédéfinies du shell (ex : PS1, PATH, REPLY, IFS)
les variables prédéfinies de commandes unix (ex : TERM).
En général, les noms des variables utilisateur sont en lettres minuscules tandis que les noms
des variables prédéfinies (du shell ou de commandes unix) sont en majuscules.
L’utilisateur peut affecter une valeur à une variable en utilisant
l’opérateur d’affectation =
la commande interne read
a) Affectation directe
Syntaxe: nom=[valeur]
Il est impératif que le nom de la variable, le symbole = et la valeur à affecter ne forment
qu’une seule chaîne de caractères. Plusieurs affectations peuvent être présentes dans la même
ligne de commande.
Pour accéder au contenu (valeur) de variable on utilise le caractère $ suivi du nom de variable
Exemple :
> x=coucou
> echo ‘’x est :’’ $x
x est coucou
ISET MEDENINE [2011-2012]
5
b) Affectation par lecture
Elle s’effectue à l'aide de la commande interne read. Celle-ci lit une ligne entière sur l’entrée
standard (le clavier).
Syntaxe: read [ var1 ... ]
Exemple:
> read a b
bonjour Monsieur
> echo $b
Monsieur
Lorsque la commande interne read est utilisée sans argument, la ligne lue est enregistrée dans
la variable prédéfinie du shell REPLY .
Exemple:
> read
bonjour tout le monde
> echo $REPLY
bonjour tout le monde
L’option –p de read affiche une chaîne d’appel avant d’effectuer la lecture ; la syntaxe à
utiliser est : read –p chaîne_d_appel [ var … ]
Exemple:
> read -p "Entrez votre prenom : " prenom
Entrez votre prenom : Eric
> echo $prenom
Eric
Remarque : S’il y a moins de variables que de mots dans la ligne lue, le shell affecte le
premier mot à la première variable, le deuxième mot à la deuxième variable, etc., la dernière
variable reçoit tous les mots restants.
c) Variable en « lecture seule »
Pour définir une variable dont la valeur ne doit pas être modifiée (appelée constante dans
d’autres langages de programmation), on utilise la syntaxe :
declare –r nom=valeur
ISET MEDENINE [2011-2012]
6
10. Commande interne set
La commande interne set affecte une valeur à un ou plusieurs paramètres de position en
numérotant ses arguments suivant leur position. La numérotation commence à 1.
Syntaxe: set arg1 arg2 arg3
Exemple:
> set alpha beta gamma
Pour obtenir la valeur d’un paramètre de position, il suffit de placer le caractère $ devant son
numéro ; ainsi, $1 permet d’obtenir la valeur du premier paramètre de position, $2 la valeur
du deuxième et ainsi de suite.
Exemple :
> echo $3 $2
alpha beta
Pour supprimer une ou plusieurs variables, on utilise la commande interne unset ou set - -
Syntaxe : unset var
Remarques :
on peut récupérer également des items de la ligne de commande via les codes $0, $1, $2,
$3, ... dans l'ordre de frappe et incluant le nom de la commande.
Exemple :
> ls -l /home
> echo $3
/home => $0 : ls $1 : -l $2 : /home
La Récupération de la liste complète des items avec $*.
la Récupération du nombre d'items avec $#.
La Récupération du résultat d'exécution de la dernière commande via le code $?.
(0 indique "Pas d'erreur d'exécution".)
11. Substitution de commandes
Syntaxe : $( cmd )
Une commande cmd entourée par une paire de parenthèses () précédées d'un caractère $ est
exécutée par le shell puis la chaîne $( cmd ) est remplacée par les résultats de la commande
cmd écrits sur la sortie standard (l’écran). Ces résultats peuvent alors être affectés à une
variable ou bien servir à initialiser des paramètres de position.
ISET MEDENINE [2011-2012]
7
> pwd
/home/sanchis => résultat écrit par pwd sur la sortie standard
> repert=$(pwd) => la chaîne /home/sanchis remplace la chaîne $(pwd)
> echo mon repertoire est $repert
mon repertoire est /home/sanchis
12. Les structures itératives
il existe des classiques instructions de structuration comme if, case, for et while qu’on peut les
utiliser dans les scripts shell.
If case For while
if commande
then
...
else
..
fi
case variable in
v1) ... ;;
v2) ... ;;
vn) … ;;
esac
for variable in liste
do
...
done
while commande
do
...
done
13. Les tests dans le shell
UNIX propose une procédure de TEST pour programmer une condition (avec la commande
test suivie de la condition)
Tests sur les caractéristiques des fichiers.
test -f fichier : Vrai si fichier ordinaire
test -d fichier : Vrai si fichier répertoire
test -r fichier : Vrai si fichier est accessible en lecture
test -w fichier : Vrai si fichier est accessible en écriture.
test -x fichier : Vrai si fichier est exécutable.
test -s fichier : Vrai si fichier non nul
tests de comparaison entre deux expressions de type chaine de caractères :
test E1 = E2 : E1 égal à E2
test E1 != E2 : E1 différent de E2
tests de comparaison sur expressions numériques :
test E1 -eq E2 : E1 égal à E2
test E1 -ne E2 : E1 différent de E2
test E1 -ge E2 : E1 plus grand ou égal à E2
ISET MEDENINE [2011-2012]
8
test E1 –gt E2 : E1 strictement plus grand qu’E2
test E1 -le E2 : E1 plus petit ou égal à E2
test E1 -lt E2 : E1 strictement plus petit qu’E2
tests des booléens :
test (E) : E est vrai
test !E : E est faux
test E1 -a E2 : E1 et E2
test E1 -o E2 : E1 ou E2
Exercices d’applications
Exercice 1
Ecrire un script shell nommé ladate qui affiche la date du système.
Exercice 2
Ecrire un programme shell deuxfois qui affiche le message "Entrez un mot : ", lit le mot saisi
par l'utilisateur puis affiche ce mot deux fois sur la même ligne.
Exercice 3
Créer un script shell nommé "change" qui affichera la date de dernière modification d'un
fichier puis la modifiera avec l'heure actuelle et enfin réaffichera la date de dernière
modification du fichier. Cette procédure acceptera 1 paramètre qui sera le nom du fichier.
Exercice 4
Ecrire un programme shell « untrois » qui demande à l'utilisateur de saisir une suite de mots
constituée d'au moins trois mots et qui affiche sur la même ligne le premier et le troisième
mot saisis.
Exemple :
> untrois Entrez une suite de mots : un petit coucou de Rodez
un coucou
Exercice 5
copier le script suivant dans un fichier « copier » et l'exécuter avec copier /home fich et
interpréter le résultat
ISET MEDENINE [2011-2012]
9
#!/bin/bash
# copie
echo "Nom du programme : $0"
echo "Nb d'arguments : $#"
echo "Source : $1"
echo "Destination : $2"
Exercice 6
Ecrire le script suivant dans un fichier « ecrase » et l'exécuter avec la commande :
ecrase bonjour coucou. Interpréter le résultat
# !/bin/bash
echo '$1' est $1
set hello
echo '$1' est $1
Exercice 7
En utilisant la substitution de commande, écrire un fichier shell « mach » qui permet
d'afficher le nom d'utilisateur avec lequel vous travaillez et votre répertoire courant.
Exercice 8
Ecrire un script shell nommé heure dans le quel vous affichez la date sous la forme suivante:
La date du jour est: jour mois année
L’heure actuelle est: heure
Exercice 9
Créer un script shell nommé "nombreJours" qui affichera le nombre de jours du mois
courant.
"nombreJours" affichera pour mars 2012 le message "31 jours en mars 2012".
Exercice 10
Créer un script shell nommé « création » réalisant la création d'un répertoire "Exo3"
contenant 5 fichiers nommés "Un" à "cinq". Chaque fichier contient une seule ligne:
ISET MEDENINE [2011-2012]
10
"Un" contient "Première ligne"
"Deux" contient "Deuxième ligne"
...
"cinq" contient "cinquième ligne"
Vérifier que le répertoire à créer n'existe pas déjà auquel cas il ne sera pas recréé mais les fichiers si.
Exercice 11
Créer un script permettant d'afficher la liste des fichiers du répertoire /etc accessibles en
lecture puis la liste des fichiers accessibles en écriture.
Exercice 12
Créer un script nommé "table" permettant d'afficher des tables de multiplication.
"table 5 10" aura pour résultat l'affichage:
0 x 5 = 0
1 x 5 = 5
2 x 5 = 10
3 x 5 = 15
4 x 5 = 20
5 x 5 = 25
6 x 5 = 30
7 x 5 = 35
8 x 5 = 40
9 x 5 = 45
10 x 5 = 50