Polycopié sur le shell

Transcription

Polycopié sur le shell
Shell
Auteur : Dominique Bouillet
Frédérique Silber-Chaussumier, mastère IPISO
Novembre, 2009
Shell
Plan
1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Interpréteur de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 Langage de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
2/68
Shell
1 Introduction
¥ Tout utilisateur doit être "déclaré" cad enregistré avec un compte
→ nom (connexion) & mot de passe
¥ Connexion ==> interpréteur de commandes (interface de dialogue
Homme/Machine)
¥ Interpréteur UNIX est appelé shell
¥ C’est un outil −→ il existe plusieurs shells :
¨ shell de Bourne (sh) AT&T
¨ Korn Shell (ksh) (D. Korn) : interactivité (contrôle des jobs, alias),
programmation (variables, arithmétique)
¨ C_Shell (csh) (Berkeley) : interactivité (history)
¨ le Tenex Shell (tcsh)
¨ Bash (Bourne-Again shell) (ksh et csh)
¥ Le shell a un double rôle :
¨ interpréteur de commandes
¨ langage de programmation
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
3/68
Shell
2 Interpréteur de commandes
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Redirections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6
Tubes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Métacaractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
4/68
Shell
2 Interpréteur de commandes
2.1 Algorithme
¥ Principe :
Boucle_infinie
affichage du prompt ($) d’attente clavier
lecture d’une commande (RETURN)
analyse syntaxique (découpe en mots)
substitution (caractères spéciaux)
exécution de la commande
Fin_de_Boucle
¥ Exemple :
¨ le shell affiche $ et lit le clavier
¨ l’utilisateur tape ls -l /usr
¨ le shell reconnaît 3 mots : ls (nom de commande), -l et /usr (arguments)
¨ il crée un processus qui exécute la commande ls avec ses arguments
¨ il attend la fin avant de ré-afficher $
¥ Sortie de la boucle (déconnexion) par exit, ou CTRL D (à éviter)
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
5/68
Shell
2 Interpréteur de commandes
2.2 Redirections
2.2.1
2.2.2
2.2.3
2.2.4
2.2.5
2.2.6
2.2.7
Redirections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Redirection de la sortie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
Redirection double. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
Redirection de l’entrée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Autres redirections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12
Here document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Traitement des redirections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
6/68
2 Interpréteur de commandes
2.2 Redirections
2.2.1 Redirections
¥ À la connexion, le shell dispose de : 3 flots de communication
¨ l’entrée standard : stdin (0)
¨ la sortie standard : stdout (1)
¨ la sortie des erreurs : stderr (2)
¥ Ces 3 flots sont associés par défaut avec :
¨ l’écran pour stdout et pour stderr
¨ le clavier pour stdin
¥ Redirection = modification de l’une ou de l’autre de ces associations
¥ Une redirection n’est valable que le temps de la commande sur laquelle elle porte
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
7/68
2 Interpréteur de commandes
2.2 Redirections
2.2.2 Redirection de la sortie
¥ Permet de récupérer le résultat d’une commande dans un fichier
commande > nom_de_fichier
$ who
domy
paul
clode
# sortie sur l’écran
console
Aug 2 09:45
ttyp2 Aug 2 12:17 (celia)
ttyp3 Aug 3 1152 (:0.0)
$ who > qui
$ ls
qui
# rien à l’écran
# le fichier ‘‘qui’’ a été créé
$ cat qui
domy console Aug 2 09:45
paul ttyp2 Aug 2 12:17 (celia)
clode ttyp3 Aug 3 1152 (:0.0)
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
8/68
2 Interpréteur de commandes
2.2 Redirections
¥ Fichier de redirection créé avant exécution de la commande (donc même si celle-ci
échoue)
¥ Si le fichier de redirection existe, son contenu initial est perdu
$ date > qui
$ cat qui
Fri Sep 13 17:11:22 MET DST 1996
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
9/68
2 Interpréteur de commandes
2.2 Redirections
2.2.3 Redirection double
¥ On peut éviter de détruire le contenu initial du fichier de redirection en utilisant une
"double redirection"
¥ L’écriture se fait en mode ajout en fin de fichier
commande >> nom_de_fichier
$ pwd >> qui
$ cat qui
Fri Sep 13 17:11:22 MET DST 1996
/mci/inf/domy/public
¥ Si le fichier n’existe pas, il est créé, comme pour une redirection simple
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
10/68
2 Interpréteur de commandes
2.2 Redirections
2.2.4 Redirection de l’entrée
¥ commande < nom_de_fichier
¥ Exemple : write
$ write paul
un petit bonjour
^D
# message reçu par paul
Message from domy@bromo
un petit bonjour
EOF
$ cat message
Un autre Bonjour
$ write paul <message
# message reçu par paul
Message from domy@bromo
Un autre Bonjour
EOF
# texte lu au clavier
# touche CTRL D
:
on ttyp0 at 10:14 ...
# redirection
:
on ttyp0 at 10:16 ...
¥ Remarque : en entrée, le fichier de redirection doit exister, alors qu’en sortie, il est
créé automatiquement
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
11/68
2 Interpréteur de commandes
2.2 Redirections
2.2.5 Autres redirections
¥ Redirection des erreurs : commande 2> fichier
¨ Exemple : compilation
$ cc prog.c
"prog.c", line 4: j undefined
"prog.c", line 7: syntax error at or near symbol }
$ cc prog.c 2>prog.err
$ cat prog.err
"prog.c", line 4: j undefined
"prog.c", line 7: syntax error at or near symbol }
¥ Combinaison des redirections
¨ Redirection de l’erreur vers la sortie standard : commande > fichier 2>&1
I Notation &> équivalente à 2>&1
¨ Traitement des redirections de gauche à droite
I L’ordre des redirections est important
I « commande > fichier 2>&1 » n’est pas équivalent à
« commande 2>&1 > fichier »
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
12/68
2 Interpréteur de commandes
2.2 Redirections
2.2.6 Here document
¥ Autre redirection de l’entrée : Here document (texte joint)
¥ Utiliser << et un séparateur quelconque :
commande << séparateur
texte passé à la commande
séparateur
¥ Principale utilisation : exécution d’une commande interactive dans un shell-script
¥ Exemple : avec un éditeur
ed fichier << MARK
1,5s/ab/AB/
w
q
MARK
#
#
#
#
#
appel ed
commandes d’édition
pour ed
fin redirection
¥ Séparateur = 1 caractère ou une chaîne
¥ Il doit être seul sur une ligne après le texte
¥ Le shell interprète le texte redirigé (variables...)
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
13/68
2 Interpréteur de commandes
Exemple: 1,\$s/ab/AB/
2.2 Redirections
$s = contenu variable s
¥ Pour l’éviter, soit écrire le séparteur ’MARK’ au début (entre simple quotes), soit
annuler la signification du $ avec \$
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
14/68
2 Interpréteur de commandes
2.2 Redirections
2.2.7 Traitement des redirections
¥ Le shell lit les commandes, les analyse, effectue les substitutions et exécute les
actions
¥ Mais il traite les redirections en tout premier
¨ Exécution de « commande > fich » : le fichier fich est créé (ou vidé s’il
existait) même si la commande n’existe pas ou échoue
¨ « commande > fich » est équivalent à « > fich commande »
¥ De plus, le shell n’interprète pas les noms de fichiers lorsqu’il traite les redirections
¥ Exemple : soit un répertoire rep contenant les fichiers fic1, fe2, fr3 et fe4
write fred < fr* --> erreur: fr* n’existe pas
cat fe2 fe4 > fe* --> création fichier fe*
cat f* > f* --> création f*
(f*= fic1+fe2+fr3+fe4+fe*)
¥ Redirection possible avec &n (n : descripteur)
¨ Exemple : cmde > f1 2>&1 (stdout et stderr dans f1)
¨ Possibilité de fermeture avec <&- (stdin), >&- (stdout), 2>&- (stderr)...
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
15/68
Shell
2 Interpréteur de commandes
2.3 Tubes
¥ Tube (pipe) = zone mémoire permettant à deux processus de communiquer tout en
étant synchronisés :
¨ écrivain attend une place disponible
¨ lecteur attend une information prête
¥ En shell, cela permet de faire agir une commande sur le résultat d’une autre sans
passer par des fichiers intermédiaires
¥ Symbole | placé entre deux commandes redirige la sortie de la 1ère sur l’entrée de la
deuxième
$ who | wc -l
3
# Nombre d’utilisateurs
¥ Le tube évite des E/S disques plus coûteuses :
$ who > qui
# Création d’un fichier temporaire
$ wc -l qui
# Traitement de ce fichier
3
$ rm qui
# Suppression du fichier
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
16/68
Shell
2 Interpréteur de commandes
2.4 Métacaractères
2.4.1
2.4.2
2.4.3
2.4.4
2.4.5
2.4.6
Suppression de l’interprétation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Résultat d’un commande. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
Guillemets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Interprétation des noms de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Métacaractère . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Enchaînement de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
17/68
2 Interpréteur de commandes
2.4 Métacaractères
2.4.1 Suppression de l’interprétation
¥ Un texte donné entre simples quotes ( ’ ) n’est pas interprété par le shell mais
considéré comme un simple mot :
¥ cela permet d’utiliser les caractères spéciaux dans les arguments
$ echo ’Deux>Trois’ # Affichage de:
Deux>Trois
$ echo Deux>Trois
# Aucun affichage MAIS création
# du fichier Trois contenant Deux
¥ Autre possibilité : le caractère \(anti-slash) supprime l’interprétation du caractère
spécial qui le suit
echo aujourd\’hui
aujourd’hui
¥ Action ne porte que sur un seul caractère ⇒ il faut la répéter si nécessaire
echo Deux\>\>Trois
# pour afficher
Deux>>Trois
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
18/68
2 Interpréteur de commandes
2.4 Métacaractères
2.4.2 Résultat d’un commande
¥ Un texte donné entre anti quotes ( ‘ ) est considéré comme une commande à
exécuter et remplacé par son résultat.
¥ Cela permet d’utiliser le résultat d’une commande comme argument d’une autre.
¥ Exemple
$ echo Je suis sous ‘pwd‘
1) exécution de la commande: pwd
2) exécution de la commande:
echo Je suis sous résultat de pwd
d’où l’affichage:
Je suis sous /usr
¥ Exemple : $ echo il y a ‘who | wc -l‘ utilisateurs connectes
⇒ Affichage de : il y a 3 utilisateurs connectes
¥ Notation bash : entre « $( » et « ) »
$ echo Je suis sous $(pwd)
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
19/68
2 Interpréteur de commandes
2.4 Métacaractères
2.4.3 Guillemets
¥ Si on veut mélanger des caractères spéciaux, des variables, des commandes..., il faut
utiliser les guillemets :
¥ Dans un texte donné entre guillemets ("), seuls sont interprétés les métacaractères $
(variables), \(annulation) et ‘ (commandes)
$ echo "Mon repertoire courant est ‘pwd‘
> alors que mon repertoire de connexion
> est $HOME"
Mon repertoire courant est /usr alors que mon repertoire de
connexion est /mci/inf/domy
¥ Notes :
¨ $ est la valeur de PS1 et > est celle de PS2
¨ avec de simples quotes (’...’), ‘pwd‘ et $HOME ne seraient pas interprétés
¨ sans rien, seule la première ligne serait prise en compte (le premier code Return
validerait la commande echo et ne serait donc pas intégré au texte du message).
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
20/68
2 Interpréteur de commandes
2.4 Métacaractères
2.4.4 Interprétation des noms de fichiers
¥ Plusieurs métacaractères jouent le rôle de "jokers" pour référencer des noms de
fichiers
¨ * −→ une chaîne quelconque (même vide)
¨ ? −→ un caractère quelconque
¨ [...] −→ un caractère quelconque de l’ensemble
¨ [ !...] −→ un caractère quelconque hors de l’ensemble
¥ L’ensemble = liste de caractères [adefgw] ou intervalle [a-g] ou toute combinaison
des deux [ab0-9A ;x-z]
¥ Exemples :
¨ *.c : suffixe .c
¨ *.[csp] : suffixe .c, .s ou .p
¨ [a-z][0-9] : nom composé de 2 caractères, une minuscule et un chiffre
¨ [ !a-z]* : noms ne commençant pas par une minuscule
¥ Notations POSIX de classes de caractères : alnum alpha ascii blank cntrl
digit graph lower print punct space upper word xdigit
¨ [[:lower:]][[:digit:]] : nom composé de 2 caractères, une minuscule et un
chiffre
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
21/68
2 Interpréteur de commandes
2.4 Métacaractères
2.4.5 Métacaractère ~
¥ Le ksh interprète le caractère ~ pour référencer un répertoire de différentes manières :
¨ ~ ou ~/ répertoire de connexion ($HOME)
¨ ~nom répertoire de connexion de l’utilisateur nom
¨ ~+ répertoire courant ($PWD)
¨ ~- répertoire précédent ($OLDPWD)
¥ Un alias : bak=’cd ~-’ permet après un déplacement dans l’arborescence de revenir
au point de départ
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
22/68
2 Interpréteur de commandes
2.4 Métacaractères
2.4.6 Enchaînement de commandes
¥ Exécution séquentielle de plusieurs commandes tapées sur une même ligne en les
séparant par le caractère “;”
¥ Exemple : ls ;who ;pwd
¥ Exécution de 2 commandes en fonction du succès ou de l’échec de la première
¨ && exécution de la deuxième commande si la première a réussi
¨ || exécution de la deuxième commande si la première a échoué
¥ Exemple : mv f1 f2 && pwd
¨ si f1 existe, f1 renommé par mv et pwd exécuté
¨ sinon mv échoue
¥ Exemple : mv f1 f2 || pwd
¨ si f1 existe, f1 renommé par mv
¨ sinon mv échoue et alors pwd est exécuté
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
23/68
Shell
2 Interpréteur de commandes
2.5 Processus
2.5.1 Exécution différée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.2 Exécution suspendue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.3 Autres commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
24/68
2 Interpréteur de commandes
2.5 Processus
2.5.1 Exécution différée
¥ Par défaut, sous le shell, exécution en séquence (foreground)
¨ Ex : l’utilisateur tape date
¨ Le shell crée un fils (par fork)
¨ attend qu’il se termine (par wait)
¨ Le fils créé exécute /bin/date (par exec)
¥ Exécution différée : (background)
¨ Ex : l’utilisateur tape date&
¨ Le shell crée un fils (par fork)
¨ n’attend pas qu’il se termine
¨ Le fils créé exécute /bin/date (par exec)
⇒ exécution en parallèle (père et fils)
⇒ risque de mélanges à l’écran
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
25/68
2 Interpréteur de commandes
2.5 Processus
2.5.2 Exécution suspendue
¥ Processus : plusieurs états (actif, attente...)
¥ Etat suspendu = processus interrompu avec possibilité de relance :
¨ en direct : fg (foreground)
¨ en différé : bg (background)
¥ Exemples
¨ a) édition en cours
CTRL Z
==> édition suspendue
autres commandes
fg
==> reprise de l’édition
¨ b) commande longue −→ attente
CTRL Z
==> commande suspendue
bg
==> reprise de commande en différée
suite en parallèle
¥ Intérêt : poursuite de l’exécution sans perte du travail déjà effectué (évite de détruire
le processus en cours pour le relancer)
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
26/68
2 Interpréteur de commandes
2.5 Processus
2.5.3 Autres commandes
¥ jobs = liste des "jobs" c’est-à-dire
¨ processus en exécution différée
¨ processus suspendus
¨ processus bloqués (attente E/S)
¥ Jobs repérés par un numéro (%n), utilisable avec diverses commandes, en particulier
bg et fg.
¥ kill = envoi d’un signal à un processus (kill -l : liste des signaux)
¨ Par défaut, signal 15 (SIGTERM) : terminaison du processus
¨ Principal cas d’utilisation : destruction d’un processus avec le signal 9 (SIGKILL)
kill -9 numPID ou kill -9 %numJob
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
27/68
Shell
2 Interpréteur de commandes
2.6 Historique
2.6.1 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.6.2 Fonction fc (ksh) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
28/68
2 Interpréteur de commandes
2.6 Historique
2.6.1 Historique
¥ Le Korn shell enregistre toutes les commandes tapées et permet de les rappeler, soit
pour les ré-exécuter, soit pour les modifier
¥ Variable EDITOR pour préciser l’éditeur choisi (mieux emacs)
¨ EDITOR=emacs
¨ CTRL P commande précédente
¨ CTRL N commande suivante (si on est allé trop loin )
¨ CTRL A début de ligne
¨ CTRL E fin de ligne
¨ CTRL F caractère suivant
¨ CTRL B caractère précédent
¨ CTRL D suppression caractère sous le curseur
¨ BackSpace effacement du caractère précédent
¥ On peut aussi préciser l’éditeur par une option du shell : set -o emacs
¥ Les flèches sont utilisables avec la dernière version
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
29/68
2 Interpréteur de commandes
2.6 Historique
2.6.2 Fonction fc (ksh)
¥ Toute commande de l’historique est accessible par les codes de contrôle (CTRL P,
CTRL N...)
¥ On peut aussi accéder à un ensemble avec fc
¥ Liste de commande : fc -l [deb] [fin]
¨ Les valeurs deb et fin sont des numéros de commande ou le début de
commandes
¥ Modification : fc -e editeur [deb] [fin]
¨ Entrée sous l’éditeur editeur (ou celui précisé par $FCEDIT si editeur = -) sur la
partie concernée de l’historique
¨ À la sortie de l’éditeur, toutes les commandes du texte sont exécutées en
séquence
¥ Substitution rapide : fc -e - chaine1=chaine2 cmde
find /users/promo90 -name a.out -print
fc -e - promo90=promo91 fi --> find /users/promo91 -name a.out -print
¨ Un alias prédéfini r permet une écriture plus rapide : r chaine1=chaine2 cmde
¨ Syntaxe Bash : fc -s chaine1=chaine2 cmde
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
30/68
Shell
2 Interpréteur de commandes
2.7 Alias
¥ alias = redéfinir ses propres mnémoniques pour les commandes
$ alias dir=’ls -l’
# définition
$ dir
# utilisation
total 4
-rw-r--r-- 1 domy
42 Nov 10 09:44 liste
-rw-r--r-- 1 domy
23 Nov 10 09:43 ou
-rw-r--r-- 1 domy
29 Nov 10 09:40 quand
-rw-r--r-- 1 domy
171 Nov 10 09:40 qui
$ dir >listebis
# autre utilisation
$ alias
# liste des alias
dir=’ls -l’
$ unalias dir
# suppression d’alias
$ dir
# commande inexistante
dir: not found
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
31/68
Shell
3 Langage de programmation
3.1
3.2
3.3
3.4
Langage de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Structures de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
32/68
Shell
3 Langage de programmation
3.1 Langage de programmation
¥ Variables, paramètres, fonctions, structures de contrôle...
¥ Utilisation interactive ou le plus souvent dans un shell-script (fichier interprété par le
shell)
¥ Exécution d’un shell-script dans un nouveau shell
ksh fichier
ou
fichier (s’il a l’attribut x)
¥ Exécution d’un shell-script dans le shell courant
. fichier
¥ Shell-scripts particuliers pour ksh
¨ .profile (exécuté à la connexion), .kshrc (exécuté à chaque sous-shell)
¥ Shell-scripts particuliers pour Bash
¨ /etc/profile, /etc/bashrc
¨ .bash_profile (shell de login .profile), .bashrc (shell interactif mais
non-login), $ENV (shell non-interactif non-login)
¥ # !/bin/bash
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
33/68
Shell
3 Langage de programmation
3.2 Variables
3.2.1 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2.2 Portée des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2.3 Variables prédéfinies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2.4 Affectation groupée de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2.5 Protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2.6 Opérations sur les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2.7 Substitutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2.8 Opérations arithmétiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.9 Ajouts ksh sur les variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .43
3.2.10 Paramètres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
3.2.11 Affectation de paramètres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
34/68
3 Langage de programmation
3.2 Variables
3.2.1 Variables
¥
¥
¥
¥
¥
Variables non typées
Nom d’une variable : lettres, chiffres et le caractère souligné ( _ )
Premier caractère : lettre ou souligné
Affectation : nom=contenu (sans espace)
Utilisation : $nom
$ mois=Janvier
$ echo $mois
Janvier
$ pwd
/dio/sys/domy/exo_enpc
$ rep=/usr
$ cd $rep
$ pwd
/usr
¥ Affichage : set
¥ Suppression : unset var1 ...
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
35/68
3 Langage de programmation
3.2 Variables
3.2.2 Portée des variables
¥ Les variables sont locales au processus dans lequel elles ont été créées
¥ Pour les rendre "globales" c-à-d les mettre dans l’environnement, il faut les exporter :
export [var1 ...]
¥ Ainsi, quand le shell créé un processus, celui-ci hérite de cet environnement.
¥ Exemple : soit un fichier f1 exécutable contenant la commande ci-dessous :
echo "Dans f1 : a = $a"
¥ Exécution :
a=oui
affectation de a dans le père
f1
exécution de f1
--> Affichage: Dans f1 : a =
export a
a est exportée
f1
ré-exécution de f1
--> Affichage: Dans f1 : a = oui
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
36/68
3 Langage de programmation
3.2 Variables
3.2.3 Variables prédéfinies
¥ HOME : répertoire de connexion
cd = cd $HOME
¥ MAIL : nom de la boîte aux lettres
¥ PATH : répertoires de recherche des commandes
¨ L’ordre des répertoires est significatif, ce qui permet de choisir par défaut une
version donnée d’une commande.
¥ PS1 : invite (prompt) de commande (par défaut $)
¥ PS2 : invite de continuation (>).
¥ IFS : séparateurs (espace, Tab et NL)
¥ TERM : type de terminal utilisé
¥ LOGNAME : nom de connexion
¥ SHELL : nom du shell utilisé
¥ PWD : répertoire courant
¥ ...
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
37/68
3 Langage de programmation
3.2 Variables
3.2.4 Affectation groupée de variables
¥ L’affectation de variables étant une instruction, on peut donc en grouper plusieurs
avec ;
a=oui ; b=non ; c=0
affectation de a, b puis c
¥ On peut aussi les grouper avec espace mais l’ordre d’affectation diffère
a=oui b=non c=0
affectation de c, b puis a
¥ Exemple
a=/bin ; b=‘ls $a‘ −→ affectation de a avec /bin puis affectation de b avec le
résultat de ls /bin
a=/bin b=‘ls $a‘ −→ affectation de b avec le résultat de ls (sur le répertoire
courant) puis affectation de a avec /bin
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
38/68
3 Langage de programmation
3.2 Variables
3.2.5 Protection
¥ Protection d’une variable avec readonly
⇒ toute modification interdite
⇒ toute suppression (unset) impossible
¨ Syntaxe : readonly [var1 ...]
¨ Sans argument, readonly affiche la liste des variables protégées
¥ Exemple
$jour=Lundi
# affectation jour
$readonly jour
# protection
$jour=Mardi
# impossible
$unset jour
# impossible
$readonly
# affichage "readonly jour"
¥ Syntaxe Bash
¨ Déclarer et fournir des attributs aux variables : declare
¨ readonly est équivalent à declare -r
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
39/68
3 Langage de programmation
3.2 Variables
3.2.6 Opérations sur les variables
¥ Substitution
a=oui
b=$a
--> b vaut oui
¥ Concaténation : juxtaposition simple s’il n’y a pas d’ambiguité ou en entourant le
nom de la variable par des accolades (${var} )
¥ Exemples :
a=Bon b=jour
--> affectation de a et de b
echo $a$b
--> Bonjour
echo $b1
--> rien: b1 non définie
echo ${b}1
--> jour1
¥ Substitution conditionnelle
${var:-mot}
--> $var si var existe, mot sinon
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
40/68
3 Langage de programmation
3.2 Variables
3.2.7 Substitutions
¥ ${var:-mot} = $var si var existe, mot sinon
¥ Exemple : soit un script exo contenant dir=${1:-/usr}
¨ Si exécution de exo /etc alors dir=/etc
¨ Si exécution de exo alors dir=/usr
¥ Remarque : mot peut prendre diverses formes
¨ a=${1:-.} −→ mot = répertoire courant
¨ a=${1:-‘pwd‘} −→ mot = résultat de pwd
¨ a=${1:-$x} −→ mot = contenu variable x
¥ Autres possibilités
¨ ${var:=mot}
Résultat : $var si var existe, mot sinon, et de plus var=mot
¨ ${var:+mot}
Résultat : mot si var existe, rien sinon
¨ ${var:?mot}
Résultat : $var si var existe, fin processus sinon
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
41/68
3 Langage de programmation
3.2 Variables
3.2.8 Opérations arithmétiques
¥ En shell de Bourne, pour toute opération arithmétique ou logique sur une variable :
commande expr d’UNIX (création d’un nouveau processus : long)
a=1
a=‘expr $a + 1‘
--> a=2
¥ Korn shell : nouvelle fonction let : let var="val1 op val2"
¨ vali : constante ou variable
¨ op = opération arithmétique (+, -, *, /, %) ou logique ( ! (non)) ou comparaison
(<, <=, >, >=, ==, !=)
a=1
let a="$a+1"
--> a=2
let a="$a >5"
--> a=0 (faux)
¥ Bash : $((val1 op val2))
a=2
a=$(($a+1))
--> a=3
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
42/68
3 Langage de programmation
3.2 Variables
3.2.9 Ajouts ksh sur les variables
¥ Variables de type "tableau" : tab[i]
¨ tab[i]=val : affectation du ième élément
¨ ${tab[i]} : ième élément de tab (0≤i≤511)
¨ ${#tab[*]} : nombre d’éléments de tab
¨ ${tab[*]} : ensemble des valeurs de tab
¥ Manipulation de chaînes
¨ ${#var} : nombre de caractères de var
¨ ${var#exp} : retrait d’exp au début de var
¨ ${var%exp} : retrait d’exp à la fin de var
exp peut contenir des caractères d’extension shell
¨ Si on double # ou %, suppression maximale
Exemple: a=abcxyczt
${#a}
--> 8 (caractères)
${a#*c}
--> xyczt (retrait abc)
${a%c*}
--> abcxy (retrait czt)
${a##*c}
--> zt (retrait maximal abcxyc)
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
43/68
3 Langage de programmation
3.2 Variables
3.2.10 Paramètres
¥ Initialisés lors de l’exécution d’un shell-script
¨ $# nombre d’arguments
¨ $0 nom du shell-script
¨ $i ième argument avec i = 1, 2 ... 9
¨ $* ensemble des arguments
¥ Exemple : soit le fichier demo
echo "Nb Parametres = $#"
echo "Parametre 1 = $1"
echo "Liste = $*"
¥ Exécution : demo un 2 trois
Nb Parametres = 3
Parametre 1 = un
Liste = un 2 trois
¥ Décalage ($2→$1, $3→$2...) : shift
¥ Décalage de n ($n+1→$1 ...) : shift n
¥ Le paramètre $ ? contient le code de retour de la dernière commande
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
44/68
3 Langage de programmation
3.2 Variables
3.2.11 Affectation de paramètres
¥ Les paramètres $1, ...$# sont normalement affectés lors de l’appel d’un shell-script
¥ Ils peuvent l’être aussi par la fonction set : set arg1 [arg2 ...]
¥ Exemples :
set a b c
--> $1=a, $2=b, $3=c, $#=3, $*=a b c
set ‘ls‘
--> $#=nombre de fichiers, $i=nom du ième fichier
¥ D’autres paramètres sont affectés dynamiquement par le shell :
¨ $$ numéro (PID) du processus
¨ $ ! numéro (PID) du dernier processus différé
¨ $ ? code de retour de la dernière commande
¨ $- options du shell
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
45/68
Shell
3 Langage de programmation
3.3 Fonctions
3.3.1 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.3.2 Fonctions d’entrées/sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.3.3 Fonction test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.3.4 Fonction test (2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.3.5 Fonction eval. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
3.3.6 Autres fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.3.7 Fonctions liées aux processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3.8 Fonction "point" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.3.9 Fonction set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55
3.3.10 Principales options du shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
46/68
3 Langage de programmation
3.3 Fonctions
3.3.1 Fonctions
¥ Une fonction est une action interprétée et exécutée dans le même processus shell et
non pas dans le cadre d’un processus fils comme pour une commande UNIX ou un
shell-script.
¥ Définition
nom()
cwd()
{
{
commandes
cd $1
PS1="<‘pwd‘> "
}
}
¥
¥
¥
¥
Exécution : nom [par1 par2 ...]
Les paramètres sont utilisables comme pour un shell-script avec $1 ... $9, $# et $*
Appel : cwd /usr −→ prompt = </usr>
La fonction return marque la fin d’une fonction
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
47/68
3 Langage de programmation
3.3 Fonctions
3.3.2 Fonctions d’entrées/sorties
¥ Affichage : echo [-n] [arg1 ...]
¨ Option -n : pas de retour à la ligne après
¨ Codes \x pour Tab (\t), NL (\n), alert (\a), NoCR (\c)...
¨ Variante ksh : print avec de nouvelles options (accès à un tube ...)
¥ Lecture d’une ligne sur stdin (clavier) : read var1 [var2...]
¨ Séparateur : IFS
Exemple: read a b c
il fait beau ce matin
# frappe clavier
Résultat: a="il" b="fait" c="beau ce matin"
¨ Variante ksh pour afficher une invite : (premier argument de la forme
var ?prompt : read a ?"Quel temps ? " b c
¨ Variante bash pour afficher une invite : option -p
Exemple: read -p "Quel temps? " a b c
Quel temps?
# lecture clavier
¨ Si aucune variable n’est fournie, la ligne est affectée à la variable REPLY.
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
48/68
3 Langage de programmation
3.3 Fonctions
3.3.3 Fonction test
¥ Syntaxe : test expression ou [ expression ]
¥ La fonction test évalue l’expression puis
¨ si elle est vraie, retourne VRAI (0)
¨ si elle est fausse, retourne FAUX (6=0)
¥ 3 types de tests :
¨ attributs de fichiers
¨ variables
¨ entiers
¥ Possibilité :
¨ de grouper des expressions entre parenthèses
¨ de les combiner avec les opérateurs logiques : -o (OU), -a (ET), ! (NON)
¥ Remarque : la commande composée [[ expression ]] est différente de la fonction
test notamment ne fait pas l’expansion des chemins
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
49/68
3 Langage de programmation
3.3 Fonctions
3.3.4 Fonction test (2)
¥ Test des attributs de fichiers : -type fichier
¨ type = r, w, x
¨ ou type = f, d, c, b, p
¨ ou type = u(suid), g (sgid) k (sticky)
¨ ou type = s (taille > 0)
¥ Exemple : test -x /vmunix ou [ -x /vmunix ]
¥ Test des variables :
¨ -z var variable de longueur nulle
¨ -n var variable de longueur non nulle
¨ var1 = var2 pour var1 et var2 identiques
¨ var1 != var2 pour var1 et var2 différentes
¥ Exemple : test $rep = "q" ou [ $rep = "q" ]
¥ Test des entiers : n1 cmp n2
¨ cmp = -eq (n1= n2), -ne (n16=n2)
¨ cmp = -gt (n1 > n2), -ge (n1>= n2), -lt (n1 < n2), -le (n1<= n2)
¥ Exemple : test $# -gt 0 ou [ $# -gt 0 ]
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
50/68
3 Langage de programmation
3.3 Fonctions
3.3.5 Fonction eval
¥ Syntaxe : eval commande [arguments...]
¥ eval force l’interprétation par le shell de la commande et de ses arguments avant de
l’exécuter
⇒ permet une double évaluation
¥ Principal intérêt : accéder au contenu du contenu d’une variable
¥ Exemple : soit un script exo contenant
nb=$#
eval Der=\${$nb}
echo "Dernier Par = $Der"
Exécution: exo oui non peut_etre
Résultat: Dernier Par = peut_etre
¥ Seule possibilité ici, car si on utilise :
${nb}
Résultat = 3
${$nb}
Erreur de syntaxe (bad substitution)
\${$nb}
Résultat =${3}
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
51/68
3 Langage de programmation
3.3 Fonctions
3.3.6 Autres fonctions
¥ : (2 points) fonction NOP, rien : permet des boucles infinies
while :
do
commandes
done
¥ type arg1 :
type
type
type
type
affiche la nature de arg1
ls
ls is the alias ’/bin/ls -F’
date
date is /bin/date
export
export is a shell-builtin
whi
whi is unknown
¥ times affiche le temps d’exécution du shell et de ses fils (user et system)
¥ ulimit fixation de taille maximale pour un fichier en écriture (-f) ou un tube (-p)
¥ typeset typage d’une variable (fonction, entier, readonly...)
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
52/68
3 Langage de programmation
3.3 Fonctions
3.3.7 Fonctions liées aux processus
¥
¥
¥
¥
exit [n] fin du processus
wait [n] attente de la fin de tous les fils
exec cmde exécution de cmde à la place du processus courant
trap cmde n exécution de cmde sur réception du signal n (ou 0 pour EXIT)
¨ trap n −→ traitement par défaut
¨ trap "" n −→ signal n ignoré
¨ trap cmde 0 −→ cmde exécutée lors de la terminaison du processus
¨ trap -l −→ liste des signaux
¥ Exemple : trap "echo ’Attente avant de sortir’ ; sleep 2" 0
¥ Exemple : trap "echo ’Vous avez tape CTRL C’" 1
¥ Les parenthèses permettent d’exécuter une suite d’actions dans un processus fils
pwd
(cd /usr ; ls -la )
pwd
cd /usr ; ls -la
pwd
Résultat: /user1
Listage de /usr
Résultat: /user1
Listage de /usr
Résultat: /usr
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
53/68
3 Langage de programmation
3.3 Fonctions
3.3.8 Fonction "point"
¥ L’exécution d’un shell-script exo
¨ soit par exo (s’il a le droit x)
¨ soit par ksh exo
s’effectue dans le cadre d’un processus fils
¥ La fonction . (point espace) permet de l’exécuter dans le même processus −→ même
environnement (variables, répertoire courant...)
¥ Par exemple, si un fichier fonctions contient une liste de déclarations de fonctions,
on peut intégrer celles-ci dans le processus courant avec :
. fonctions
¥ Remarques :
¨ un tel fichier n’a pas besoin du droit x
¨ ksh xyz : exécution du fichier xyz
ksh -c xyz : exécution de la commande xyz
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
54/68
3 Langage de programmation
3.3 Fonctions
3.3.9 Fonction set
¥ Fonction set : 3 types d’actions
¨ Liste des variables : set (sans argument)
¨ Affectation des paramètres : set arg1 ... argn
$1=arg1 ... $#=n $*= arg1 ... argn
¨ Modification d’une option du shell :
set -x
ajout option x
set +x
retrait option x
¥ Avec ksh, ajout de set -o option pour offrir plus de lisibilité (set -o verbose =
set -v) ou des ajouts
¥ En particulier : set -o ignoreeof invalide CTRL D pour une déconnexion (utiliser
alors exit) et set -o bgnice exécute les processus en différé avec une priorité plus
faible
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
55/68
3 Langage de programmation
3.3 Fonctions
3.3.10 Principales options du shell
a
e
f
n
u
x
-
export de toute variable
fin si un code de retour est non nul
non interprétation de *?[]
lecture sans exécution (mise au point)
variables non définies = erreur
affichage des commandes après interprétation et avant exécution
pas d’option (utile pour affecter $1 avec une valeur
commençant par tiret)
¥ Exemples
set -f ; echo *
set +f ; echo *
a=/usr ; set -x
cd $a
b=‘pwd‘
set ‘ls -l f‘
set - ‘ls -l f‘
# affichage de *
# liste des fichiers
# affichage +cd /usr
# affichage +pwd et b=/usr
# erreur option inconnue (-rw..)
$1=-rw... $2=1 ... $9=f $#=9
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
56/68
Shell
3 Langage de programmation
3.4 Structures de contrôle
3.4.1
3.4.2
3.4.3
3.4.4
3.4.5
3.4.6
3.4.7
3.4.8
Structure de contrôle : if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Structures for, while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Structure case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Structure until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Structure while redirigée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Fonction break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Fonction continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Structure select (ksh) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
57/68
3 Langage de programmation
3.4 Structures de contrôle
3.4.1 Structure de contrôle : if
if commande
then
commandes
fi
if commande
then
commandes 1
else
commandes 2
fi
if commande1
then commandes 1
elif commande2
then commandes 2
else commandes 3
fi
¥ Affichage du type de l’entrée fic1
if [ -f fic1 ]
then
echo "fic1 : fichier"
elif [ -d fic1 ]
then
echo "fic1 : répertoire"
else
echo "fic1 : spécial"
fi
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
58/68
3 Langage de programmation
3.4 Structures de contrôle
3.4.2 Structures for, while
for var in liste
do
commandes
done
while commande
do
commandes
done
¥ Copie d’un fichier fic1 sous les répertoires /users/rep1 à /users/rep4
for n in 1 2 3 4
do
cp fic1 /users/rep$n
done
¥ Affichage de tous les paramètres un à un
while [ $# -gt 0 ]
do
echo "Paramètre 1 = $1"
shift
done
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
59/68
3 Langage de programmation
3.4 Structures de contrôle
3.4.3 Structure case
case mot in
motif1)
motif2)
...
motifn)
esac
commandes 1;;
commandes 2;;
commandes n;;
¥ Développe mot puis met en correspondance avec chacun des motifs (développement
des chemins)
¥ Exemple : récupération dans une variable dir du répertoire courant ou du premier
paramètre
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
60/68
3 Langage de programmation
3.4 Structures de contrôle
case $# in
0)
dir=‘pwd‘;;
1)
dir=$1;;
*)
echo "Erreur de syntaxe"
exit;;
esac
¥ Exemple : affichage
case $fic in
*.c|*.s)
*.o)
*.a)
*)
esac
de la nature de la variable fic
echo
echo
echo
echo
"Fichier source";;
"Programme Objet";;
"Bibliothèque";;
"Autre fichier";;
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
61/68
3 Langage de programmation
3.4 Structures de contrôle
3.4.4 Structure until
until commande
do
commandes
done
¥ Structure similaire à while mais de type jusqu’à au lieu de tant que
¥ Exemple : lecture stdin jusqu’à un code de sortie
until [ "$x" = "SVP" ]
do
echo "Et la politesse..."
read x
done
¨ Sortie de la boucle quand x vaut SVP
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
62/68
3 Langage de programmation
3.4 Structures de contrôle
3.4.5 Structure while redirigée
¥ Boucle while sur lecture clavier :
while read x
do
commandes
done
¥ Sortie de la boucle sur échec de read x c’est-à-dire sur lecture de CTRL D
¥ Boucle while sur lecture fichier :
while read x
do
commandes
done <fichier
¥
¥
⇒
¥
La redirection doit se placer après done et non pas après read x
Si la redirection est placée après read x, alors ouverture du fichier à chaque itération
boucle infinie de lecture de la première information
Principe analogue pour until
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
63/68
3 Langage de programmation
3.4 Structures de contrôle
3.4.6 Fonction break
¥ La fonction break permet de forcer la sortie d’une boucle for, while ou until.
¥ L’exécution reprend après done sans exécuter les instructions entre break et done
¥ Exemple
while read x
do
if [ "$x" = "q" ]
then break
# sortie de boucle
fi
# commandes exécutées si x!=q
...
done
¥ break accepte un argument entier n pour sortir d’un seul coup de n niveaux
d’imbrication
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
64/68
3 Langage de programmation
3.4 Structures de contrôle
3.4.7 Fonction continue
¥ La fonction continue permet de passer à l’itération suivante d’une boucle for,
while ou until.
¥ Les commandes entre continue et done ne sont pas exécutées pour l’itération
courante.
¥ Exemple :
for f in *
do
if [ $f = "a.out" ]
then continue
# au suivant
fi
# commandes exécutées si f != a.out
...
done
¥ continue accepte un argument entier n pour passer d’un seul coup à la nième
itération suivante.
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
65/68
3 Langage de programmation
3.4 Structures de contrôle
¥ Remarque : l’écriture
for var
do
commandes
done
est équivalente à for var in $* ...
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
66/68
3 Langage de programmation
3.4 Structures de contrôle
3.4.8 Structure select (ksh)
select var in liste
do
commandes
done
¥
¥
¥
¥
¥
Affichage sur stderr de la liste, chaque élément étant précédé d’un numéro
lecture réponse sur stdin (mise dans REPLY)
si réponse = un numéro, alors var=valeur associée, sinon var=""
exécution des commandes
boucle jusqu’à CTRL D ou break
select editor in ed vi emacs xedit
do
echo "Editeur $editor"
$editor
done
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
67/68
3 Langage de programmation
3.4 Structures de contrôle
¥ Résultat : affichage de
1
ed
2
vi
3
emacs
4
xedit
<???>
lecture de la réponse (par exemple 3), affichage
de Editeur emacs, appel d’emacs et à la sortie d’emacs,
re-boucle jusqu’à CTRL D
Télécom SudParis — Dominique Bouillet — Novembre, 2009 — Frédérique Silber-Chaussumier, mastère IPISO
68/68