TP3 Shells

10
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.

description

exercices script shell

Transcript of TP3 Shells

Page 1: 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.

Page 2: TP3 Shells

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.

Page 3: TP3 Shells

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

Page 4: TP3 Shells

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

Page 5: TP3 Shells

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

Page 6: TP3 Shells

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.

Page 7: TP3 Shells

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

Page 8: TP3 Shells

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

Page 9: TP3 Shells

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:

Page 10: TP3 Shells

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