Unix : shell scripts
ASR1 - Syst`emes d’exploitationSemestre 1, ann´ee 2012-2013
D´epartement d’informatique HCM IUT Bordeaux 1
Janvier 2013
1 / 148
Premi`ere partie Qu’est-ce qu’un script ?
2 / 148
Contenu
1 Dialogue en ligne de commande
2 Interpr`ete de commande
3 Ex´ecution d’un script
4 Exercice
5 Int´erˆet des scripts
6 Exemples
7 Programmer des scripts
3 / 148
Dialogue en ligne de commande
Pourdialogueravec la machine, vous utilisez
une interface graphique (Gnome, Kde, etc.) unterminal(console) o`u vous tapez deslignes de commandes
4 / 148
Interpr`ete de commande
L’interpr`ete de commandes(ou interpr´eteur), est un programme qui
1 lit une lignede commande
2 l’analyse
3 ex´ecutel’action indiqu´ee
4 et recommence.
Vous utilisez l’interpr`ete/bin/bash
5 / 148
Script
Les commandes peuvent provenir
d’un utilisateur (fonctionnement interactif)
d’unfichiertexte, appel´escript.
6 / 148
Exemple de script
Dans sa forme la plus simple, unscriptest unesuite de commandes 1 # e x e m p l e de s c r i p t
2
3 echo Nous sommes l e 4 d a t e
5
6 echoA Bordeaux i l e s t` 7 TZ=Europe / P a r i s d a t e
qui sontex´ecut´ees s´equentiellement.
7 / 148
Ex´ecution d’un script
Un script est dans un fichier
# b o n j o u r . sh echo Xin ch`ao echo B o n j o u r echo H e l l o
qui peut ˆetre lanc´e en tapant son chemin d’acc`es ./bonjour.sh si on l’a d’abord renduex´ecutablepar
chmod +x bonjour.sh
8 / 148
Exercice
A partir de l’exemple` 1 # Exemple 2
3 echo”`A Bordeaux i l e s t ” 4 TZ=Europe / P a r i s d a t e
´ecrivez un script quiaffiche l’heure de plusieurs grandes villes.
9 / 148
Int´erˆet des scripts
Int´erˆet
D´efinir des s´equences d’op´erations complexes.
les faire ex´ecuter facilement et automatiquement tˆaches r´ep´etitives
tˆaches programm´ees
Exemples
Installation d’un logiciel
tester la pr´esence de composants indispensables cr´eer des r´epertoires
y d´esarchiver le logiciel et ses donn´ees ...
S´equence de d´emarrage d’un syst`eme d’exploitation assurer le d´emarrage des diff´erentsservices Proc´edures d’administration
enregistrement des utilisateurs
lancement de travaux `a heures fix´ees (sauvegardes) ...
Programmer des scripts
Un script ne contient pas seulement une s´equence de commandes, il y a aussi
la possibilit´e d’indiquer desparam`etres d’utiliser desvariables
de faire desr´ep´etitions(boucles) de prendre desd´ecisions de d´ecouper le scripts enfonctions ...
Le langage de commandes est donc un v´eritablelangage de programmation
En r´esum´e
Lesshell-scripts
sont des programmes qui lancent des commandes Unix.
Ils permettent d’automatiser des tˆaches r´ep´etitives et/ou complexes Pour ´ecrire des scriptsil faut
connaˆıtre lesprincipales commandes Unix, les m´ecanismes de redirection, etc.
apprendre `a´ecrire des boucles, des d´ecisionsetc. dans le langage de l’interpr`ete
Le langage de commande est un v´eritablelangage de programmation
13 / 148
Deuxi`eme partie Param`etres
14 / 148
Contenu
8 Exemple
8 Param`etres d’un script
9 Essais
10Application
15 / 148
Param`etres
Exemplede script avec unparam`etre
# c l o c k . sh
# a f f i c h e l ’ h e u r e d an s une c a p i t a l e d ’ Europe
# p a r a m`et r e : nom de l a v i l l e echo ”`A $1 i l e s t : ” TZ=Europe / $1 d a t e Usage du script :
$ ./clock.sh Paris
D´eroulement :lepremier param`etre effectifParisest affect´e `a$1pour l’ex´ecution du script.
16 / 148
Param`etres $1 $2 ...
le premier param`etre de la ligne de commande est affect´e `a$1 le second `a$2
...
laliste des param`etresva dans `a$*
lenombre de param`etresdans$#
Question :et$0?
17 / 148
Essais
Essayez le script suivant
#
# params . sh
#
echo” p a r a m`et r e 1 = ’ $1 ’ ” echo” p a r a m`et r e 2 = ’ $2 ’ ” echo” l i s t e = ’ $∗’ ”
echo” nombre = ’ $#’”
$ ./params.sh un
$ ./params.sh un deux trois
$ ./params.sh "un deux" "trois quatre"
18 / 148
Application
´Ecrivez un script qui re¸coit comme param`etres
1 le nom d’un r´epertoire
2 un numero de version
construit une archive (commandetar) de ce r´epertoire dans /archives
Exemple d’utilisation s a u v e r . sh p r o j e t v3 lancera la commande
t a r−c z f ˜/ a r c h i v e s / p r o j e t−v3 . t g z p r o j e t
19 / 148
Troisi`eme partie Quelques commandes utiles
20 / 148
Contenu
11Quelques commandes que vous connaissez d´ej`a
12Les redirections
13Pipe
14Pipeline
15Encore des commandes grep
cut sort join
21 / 148
Vous connaissez d´ej`a...
´editeur de textes(geany, ...) compilateur(g++) cp, rm, mv, ls cat, less, more mkdir, rmdir, cd, pwd echo, clear man ...
Les redirections
Les commandes produisent du texte sur leursortie standard Exemples de commandes
echo "Bonjour"
ls date "+%H:%M"
Ce texte peut ˆetreredirig´evers un fichier Exemples : redirections sortie standard echo "bonjour" > message.txt date "+%H:%M" >> message.txt
Redirections de la sortie standard
Remplacementd’un fichier :>
Exemple
echo "bonjour" > message.txt Extensiond’un fichier : >>
Exemple date >> fichier
Sortie d’erreur
Certains messages sont produits sur lasortie d’erreur Mise en ´evidence
$ g++ essai.cc > resultat.log
essai.cc:1: error: ISO C++ forbids declaration of
’exemple’ with no type
$
Redirection de la sortie d’erreurs2> 2>>
Exemple
$ g++ mon-programme.cc 2> erreurs.txt
$
25 / 148
Autres usages de la sortie d’erreur
Exemple
$ dialog --inputbox "Votre nom ?" 8 40 2> /tmp/nom
26 / 148
Redirection de l’entr´ee standard
Depuis un fichier :<
Exemple
tr ’[a-z]’ ’[A-Z]’ < texte.txt
“here document”: <<
Exemple
$ tr ’[a-z]’ ’[A-Z]’ <<XXX ceci Est un
exemple XXX
27 / 148
Redirection entre deux commandes
L’op´erateur| (pipe) redirige lasortie standardd’une commande vers l’entr´ee standardd’une autre commande
Exemple w | cat -n
28 / 148
Pipeline de plusieurs commandes
On peut constituer unpipelinede plusieurs commandes Exemple : redimensionner une image
anytopnm dscn3214.jpg | pnmscale -width 100 |
pnmtopng > statue-hcm-100px.png
29 / 148
Quelques commandes
grep : s´election de lignes cut : s´elections de colonnes sort : tri
join : jointure
Ces commandes permettent de manipuler des donn´ees repr´esent´ees sous forme de textes.
On s’en servira surtout pour des donn´ees en “tableau”
P a r i s : F r a n c e : Europa :GMT+1 London : F r a n c e : Europa :GMT
H o C h i M i n h C i t y : Vietnam : A s i a :GMT+7
30 / 148
La commande grep : s´election de lignes
S´electionne leslignesqui contiennent unmotif(pattern) ExempleLe fichiervilles.txtcontient :
1 f r a n c e : p a r i s
2 v i e t n a m : ho c h i minh
3 i t a l i e : roma
4 f r a n c e : b o r d e a u x
5 v i e t n a m : h a n o i
6 i n d e : d e l h i la commande grep italie villes.txt
affiche les lignes du fichier qui contiennentitalie
31 / 148
grep : essayez
villes.txt
1 f r a n c e : p a r i s
2 v i e t n a m : ho c h i minh
3 i t a l i e : roma
4 f r a n c e : b o r d e a u x
5 v i e t n a m : h a n o i
6 i n d e : d e l h i
Essayer
grep ’i’ villes.txt grep ’:h’ villes.txt
32 / 148
grep : ancrage
Les caract`eres^et$servent `a “ancrer” le motif de recherche au d´ebut ˆ
ou`a la fin $ d’une ligne.
Essayer
grep ’^i’ villes.txt grep ’i$’ villes.txt
33 / 148
La commande cut
La commandecuts´electionne unecolonnede donn´ees.
Essayer
cut -c 1-3 villes.txt cut -d: -f1 villes.txt
grep vietnam villes.txt | cut -d: -f2
la commande sort
Ordonne les lignes sort villes.txt tri par ligne
tri selon la seconde colonne (d´elimit´ee par des deux-points).
sort -t: -k2 villes.txt
Exercices “sort”
Exercice
Cr´eer un fichiervilles-pays.txt(villes ordonn´ees par pays) Cr´eer un fichiercontinents-pays.txt(continents ordonn´ees par pays) `a partir decontinents.txt
1 e u r o p e : f r a n c e
2 e u r o p e : i t a l i e
3 a s i e : v i e t n a m
4 a s i e : c h i n e
Commande “join”
Rapproche deux fichiers sur unecl´e commune.
Les fichiers doivent ˆetre tri´es Exemple
join -t: -1 2 -2 1 continents-pays.txt villes-pays.txt
-t:: d´elimiteur de champs
-1 2 : cl´e du premier fichier = second champ -2 1 : cl´e du second fichier = premier champ
37 / 148
Quatri`eme partie Droits d’acc`es
38 / 148
Contenu
16Les droits d’acc`es (bases)
17chmod : changer les droits d’acc`es
39 / 148
Droits d’acc`es
La commandels -lmontre lesdroits d’acc`es Exemple
billaud@feathers:~/Essais/C++$ ls -l total 64
drwxr-xr-x 2 billaud profs 4096 ao^u 29 12:22 Heap -rwxr-xr-x 1 billaud profs 6495 nov 2 21:19 initTab -rw-r--r-- 1 billaud profs 236 nov 2 21:19 initTab.cc ...
Premier caract`ere
dpour lesr´epertoires(directory) -pour lesfichiers
40 / 148
Droits d’acc`es : suite
Exemple
drwxr-xr-x 2 billaud profs 4096 ao^u 29 12:22 Heap -rwxr-xr-x 1 billaud profs 6495 nov 2 21:19 initTab -rw-r--r-- 1 billaud profs 236 nov 2 21:19 initTab.cc Lettres suivantes : indiquent lesdroits d’acc`es
- rwx r-x r-x Pr´esentation par groupe de trois :
rwx pour lepropri´etairedu fichier (billaud) r-xles utilisateurs dugroupeprofs r-x pour lesautres
41 / 148
Les droits d’acc`es
Les lettres indiquent lesdroits d’acc`es (oumode, oupermissions)
r pourread(droit de lecture) w pourwrite(droit d’´ecriture, modification) x pour
execute(droit d’ex´ecution) pour les fichiers, x=cross(droit de traverser) pour les r´epertoires.
42 / 148
Exemples :
Exemple
drwxr-xr-x 2 billaud profs 4096 ao^u 29 12:22 Heap -rwxr-xr-x 1 billaud profs 6495 nov 2 21:19 initTab -rw-r--r-- 1 billaud profs 236 nov 2 21:19 initTab.cc
initTab.ccpeut ˆetre
lu et modifi´e par son propri´etaire (rwx), lu par les membres du groupe (r) et par les autres (r).
initTab?
43 / 148
Exemples :
Exemple
drwxr-xr-x 2 billaud profs 4096 ao^u 29 12:22 Heap -rwxr-xr-x 1 billaud profs 6495 nov 2 21:19 initTab -rw-r--r-- 1 billaud profs 236 nov 2 21:19 initTab.cc
initTab.ccpeut ˆetre
lu et modifi´e par son propri´etaire (rwx), lu par les membres du groupe (r) et par les autres (r).
initTabpeut ˆetre
lu,modifi´eetex´ecut´epar son propri´etaire (rw-),
luetex´ecut´epar les utilisateurs du groupe (rx) ainsi que par les autres (rx).
44 / 148
Exemples :
Exemple
drwxr-xr-x 2 billaud profs 4096 ao^u 29 12:22 Heap -rwxr-xr-x 1 billaud profs 6495 nov 2 21:19 initTab -rw-r--r-- 1 billaud profs 236 nov 2 21:19 initTab.cc
le r´epertoireHeappeut ˆetre
lu, modifi´e et travers´epar le propri´etaire (rwx), lu et travers´epar les membres du groupe (rx) et les autres.
45 / 148
chmod : changer les droits d’acc`es
La commande “chmod” change les droits d’acc`es (CHange MODe) Notation octale
Exemple:chmod 750 mon-fichier chaque groupe de trois bits est cod´e enoctal, avec r=4, w=2, x=1.
Doncchmod 750 ...donne les droitsrwx r-x ---au fichier
Exercices
Exercice : notation octale Compl´etez la table d’´equivalence
octal droits octal droits
0 - - - 4
1 5 r - x
2 6
3 7 r w x
Exercices
Exercice : droits sur les fichiers
1 Tapez
ls -l > mon-fichier chmod 777 mon-fichier
pouvez-vous lire le fichier (cat mon-fichier) ? le modifier
(echo >> mon-fichier) ?
2 mˆeme question apr`es chmod 666 mon-fichier
3 ...
droits lire ? modifier ?
000 non non
111 222 333 444 555 666
777 oui oui
Exercices
Exercice : droits
1 Tapez
ls -l > mon-fichier chmod 777 mon-fichier
pouvez-vous lire le fichier ? le modifier ?
2 Changez les droits chmod 077 mon-fichier
pouvez-vous le lire ? le modifier ?
3 Conclusions ?
49 / 148
chmod : notation symbolique
Exemple
chmod u=rwx,g=rx,o= mon-fichier u user(propri´etaire) g groupe o others(autres)
50 / 148
chmod : modification des droits
Sousforme symbolique, permet demodifiercertainsdroits.
+ ajouterdes droits -enlever Exemple chmod go-w f
enl`eve le droitwau groupe (g) et aux autres (o), sans changer les autres permissions.
Exemple chmod +x f ajoute les droits “x”
51 / 148
Cinqui`eme partie Variables, param`etres, expressions...
52 / 148
Contenu
18 Variables
19 Environnement, export
20 Param`etres positionnels
21 Affectations
22Lecture de variables Essais read, exercice read, IFS
53 / 148
Variables
Lesvariablesdushellcontiennent deschaˆınes de caract`eres.
la liste des variables est affich´ee parset Variables d´efinies automatiquement : HOME PWD SHELL USERNAME PATH LANG etc.
54 / 148
Affectation / Expansion
affectationde variable :NOM=[CHAINE]
expansionpar “$NOM” ou “${NOM}”
Exemple
1 message=” B i e n v e n u e p a r m i nous ”
2 echo $message
55 / 148
Variables : exemple
1 #! / b i n / b as h
2
3 echo” B o n j o u r $USER”
4 echo−n ” a u j o u r d ’ h u i ”
5 d a t e
6
7 f r a n c e=” Europe / P a r i s ”
8 v i e t n a m=” A s i a / Ho Chi Minh ”
9
10 echo−n ” h e u r e Vietnam = ”
11 TZ=$ v i e t n a m d a t e
12
13 echo−n ” h e u r e F r a n c e = ”
14 TZ=$ f r a n c e d a t e
15 e x i t0
56 / 148
Environnement, export
un processus s’ex´ecute dans unenvironnement(valeurs de variables) commandeprintenv
les variables syst`eme sont transmises (export´ees) automatiquement lors d’un appel de script
les autres doivent ˆetre export´ees explicitement (= ajout´ees `a l’environnement)
commandeexportNOM[=VALEUR]
liste des variables export´ees :export
57 / 148
Param`etres positionnels
Invocation d’un script
Un script peut ˆetreinvoqu´e avec des param`etres, exemple : ./mon-script Hanoi Paris Bordeaux "Ho Chi Minh City"
Pendant l’ex´ecution
$1="Hanoi",
$2="Paris",
$3="Bordeaux",
$4="Ho Chi Minh City"
Param`etres positionnels (suite)
Autres variables utiles
$# = 4– le nombre de param`etres
$* = Hanoi Paris Bordeaux "Ho Chi Minh City"’
$0 = "./mon-script"– le nom du script
Exercice
Ecrire un script `a un param`etre qui indique les villes d’un pays.
$ villes.sh france paris
bordeaux ...
$
Utiliser le fichier de donn´ees pr´ec´edent.
Affectation
Met une valeur dans une variable.
Noms de variable
lettres, des chiffres, blancs soulign´es ne commence pas par un chiffre MAJUSCULES/minuscules diff´erenci´ees
61 / 148
Affectation (suite)
Deux formes NOM=CHAINE affectation simple letNOM=EXPRESSION
affectation dur´esultat d’un calcul arithm´etique letest unecommande internedubash(help let)
62 / 148
Affectations (suite)
Essayez
1 a=12
2 b=42
3 4 c=a+b
5 echo $c
6 7 d=$a+$b
8 echo$d
9
10 l e t e=a+b
11 echo $e
63 / 148
Lecture de variables
La commande read v1 v2 ...
lit une ligne au terminal, et affecte les mots dans les variables cit´ees.
Exemple read nom prenom
64 / 148
Essais avec read
Essayez
read nom prenom
que se passe-t-il si on tape plus de mots qu’il n’y a de variables ?
65 / 148
Exercice read
Exercice Ecrire un script qui´
demande l’ann´ee de naissance, imprime l’ˆage.
Exemple d’ex´ecution
$ ./quel_age.sh Votre ann´ee de naissance ? 1990
Vous ^etes n´e en 1990, vous avez donc 24 ans.
66 / 148
S´eparateur
La variableIFS
indique le s´eparateur reconnu parread(input field separator)
$ export IFS=,
$ read NOM PRENOM einstein,albert
$ echo $PRENOM albert
Alternative `a “export”
Affectation temporaire : IFS=, read NOM PRENOM valide pendant la dur´ee d’ex´ecution duread
67 / 148
Sixi`eme partie Expansions
68 / 148
Contenu
23Expansions Exercices
24Une petite application
25Affectation du r´esultat d’une commande
26Chaˆınes et expansion
27Substitution
28Compl´ement : Commandes dirname et basename
69 / 148
Expansion
D´efinition
Expansion: remplacement d’une expression par savaleur Exemples
expansion devariables: echo bonjour $USER expansionnum´erique:
echo p´erimetre = $((2*(longueur+hauteur))) expansion dur´esultat d’une commande:
echo il y a $(who | wc -l) connexions
Expansion
(suite)
Autre notation
Historiquement,shutilisait des “anti-quotes” pour$(...): echo il y a ‘who | wc -l‘ connexions Moins lisible, risque de confusion avec les apostrophes
echo il y a ’who | wc -l’ connexions
Exercices
1. Exercice simple
Dans le script qui calcule l’ˆage, remplacez laconstante 2013par un appel `a date +%Y
Exercices
2. Mieux
´Ecrire un script qui affiche le nombre de processus qui vous appartiennent.
Ex´ecution :
Sur tuba, adupont a 45 processus
Indication: comptez les lignes qui commencent par votre nom dans le r´esultat de “ps axu”.
73 / 148
Exercices (suite)
´Ecrire un script qui indique les5 plus gros sous-r´epertoiresd’un r´epertoire donn´e.
Ex´ecution
1 $ p l u s−g r o s . sh ˜/ E s s a i s
2 196 /home/ b i l l a u d / E s s a i s /LATEX
3 152 /home/ b i l l a u d / E s s a i s /C++
4 96 /home/ b i l l a u d / E s s a i s / Python
5 36 /home/ b i l l a u d / E s s a i s /PHP
6 32 /home/ b i l l a u d / E s s a i s /PyUNO
Indications script `a 1 param`etre du -s repertoire/*
trinum´erique
commandetail -n nombre
74 / 148
Application : carnet de t´el´ephone
Sous forme de trois commandes tel-ajouter numero nom tel-chercher nom tel-afficher
qui agissent sur un fichier de donn´eestelephones.dat Format : un num´ero et un nom par ligne
exemple 01234578 PUF 98765444 Charlie
75 / 148
application (suite)
1 #
2 # t e l−a f f i c h e r
3 #
4 n o m F i c h i e r=” t e l e p h o n e s . d a t ”
5 cat $ n o m F i c h i e r
1 #
2 # t e l−a j o u t e r numero nom
3 #
4 n o m F i c h i e r=” t e l e p h o n e . d a t ”
5 echo $∗>>$ n o m F i c h i e r
1 #
2 # t e l−c h e r c h e r nom
3 #
4 n o m F i c h i e r=” t e l e p h o n e . d a t ”
5 g r e p $1 $ n o m F i c h i e r
76 / 148
Exercice, suite
Am´eliorez la pr´esentation avec la commandedialog dialog --infobox message hauteur largeur dialog --textbox nomfichier hauteur largeur dialog --inputbox message hauteur largeur Attention :Avec une “inputbox”, le r´esultat va sur la sortie d’erreur.
77 / 148
Commande et variable
Ne pas confondre
v=date affectation de la chaine ”date”
date > f redirection de la sortie vers un fichier v=$(date) affectation de la sortie dans une variable Exercice : que fait ceci
$cmd > $f
?
78 / 148
(suite)
Exercice: que fait ceci
$cmd > $f
? Exemple
1 #
2 f o r m a t=”%Y−%M−%d”
3 cmd=” d a t e +$ f o r m a t ”
4 f =/tmp/ r e s u l t a t
5
6 $cmd> $ f
79 / 148
Chaˆınes et expansion
L’expansion
se fait dans les chaˆınes d´elimit´ees par ”...”
pas dans les chaines d´elimit´ees par ’...’
Exemple
echo ’la variable $USER ’ "contient $USER"
80 / 148
Substitution
On peut demander unesubstitutionpendant l’expansion d’une variable.
Exemple : remplacement d’un suffixe source=monProgramme.cc g++ $source -o ${source/.cc/ } Plus simple que :
g++ $source $(echo $source | sed -e s/.cc//})
81 / 148
dirname, basename
Commandes tr`es utiles, permettent de d´ecomposer un chemin d’acc`es en morceaux
$ d i r n a m e /home/ j o h n / p r o j e t / p r o g . c c /home/ j o h n / p r o j e t
$ basename /home/ j o h n / p r o j e t / p r o g . c c p r o g . c c
$ basename /home/ j o h n / p r o j e t / p r o g . c c . c c p r o g
Exercice
´Ecrire un scriptarchiver.shqui
re¸coit en param`etre le chemin d’acc`es d’un r´epertoire archiver.sh AP1/projet/projet-v1
cr´ee dans le r´epertoire d’accueil une archiveprojet-v1.2013-01-23.
Le nom de l’archive est compos´e
du dernier ´element du chemin d’acc`es (projet) de la date (obtenue pardate
Septi`eme partie
Fonctions
Contenu
29 Les fonctions
30 Exemple
31Avantages
32Variables globales
33Variables locales
85 / 148
Fonctions
Un script peut comporter desfonctions, avec desparam`etres positionnels Syntaxe
function nom-de-fonction {
commande commande ...
}
86 / 148
Fonctions : exemple
Exemple
1 #
2 f u n c t i o n a r c h i v e r
3 {
4 t a r −c z f / v a r / s v g d / $1 . t g z $2
5 }
6
7 a r c h i v e r p h o t o s /home/ b i l l a u d / p h o t o s
8 a r c h i v e r musique /home/ b i l l a u d / musique
87 / 148
Fonctions : avantages
Avantages : d´ecoupage logique, code plus facile `a lire fonctions r´eutilisables
88 / 148
Fonctions : exemple
Par d´efaut, les variables sontglobales Exemple
1 #
2 d e s t i n a t i o n =/ v a r / s v g d
3
4 f u n c t i o n a r c h i v e r
5 {
6 t a r−c z f $ d e s t i n a t i o n / $1 . t g z $2
7 }
8
9 a r c h i v e r p h o t o s /home/ b i l l a u d / p h o t o s
10 a r c h i v e r musique /home/ b i l l a u d / musique
89 / 148
Variables locales
kes fonctions peuvent avoir desvariables locales: Exemple
1 #
2 d e s t i n a t i o n =/ v a r / s v g d
3 o p t i o n s=c z f
4
5 f u n c t i o n a r c h i v e r
6 {
7 l o c a l nom=$ ( basename $1 )
8 t a r $ o p t i o n s $ d e s t i n a t i o n /$nom . t g z
9 }
10
11 a r c h i v e r /home/ b i l l a u d / p h o t o s
12 a r c h i v e r /home/ b i l l a u d / musique
90 / 148
Huiti`eme partie Arithm´etique
91 / 148
Contenu
34 Let : affectation arithm´etique
35 Exercices
36Exercice 3
37Expansion arithm´etique
38Exercice
92 / 148
Let : affectation arithm´etique
Syntaxe
let VARIABLE=EXPRESSION Exemple `a essayer
1 #! / b i n / b as h
2
3 l e t somme=$1+$2
4 echo$somme Comparer
let somme=$1+$2 somme=$1+$2
93 / 148
Note
Dans une affectation arithm´etique, l’expansion des variables est automatique
let c=a+b let c=$a+$b
Exercice 1
Ecrire un script qui
demande l’ann´ee de naissance affiche l’age
scenario
$ exercice1.sh
Vous ^etes n´e en quelle ann´ee ? 1992
Vous avez donc 21 ans
$
Exercice 2
Convertir une heure (donn´ee sous la forme HHMM) en nombre de minutes scenario
$ exercice2.sh 1015 615
$
Exercice
Ecrire un script qui calcule la dur´ee d’un trajet, `a partir des heures de d´epart et d’arriv´ee sous la forme HHMM
Sc´enario
$ ./duree.sh 630 2215 1545
97 / 148
Expansion arithm´etique
A la place de
let surface=hauteur*largeur
echo la surface du rectangle est $surface m2 On peut ´ecrire
let surface=hauteur*largeur
echo la surface du rectangle est $((largeur*hauteur)) m2
98 / 148
Exercice
Utiliser la boite de dialogue “calendar” et la commandedate +%Ypour faire un script qui
demande une date de naissance affiche l’ˆage
Conseil : afficher le r´esultat par une “msgbox”
$ dialog --msgbox "hello, world" 5 20
99 / 148
Neuvi`eme partie Structure de contrˆole : case
100 / 148
Contenu
39 Pr´esentation
40Exemple
41Motifs d’uncase
101 / 148
Structure de contrˆole “case”
Choisit les commandes `a ex´ecuter en fonction d’uns´electeur semblable au”switch’ de C++
le s´electeur est une chaˆıne de caract`eres
102 / 148
Exemple s´erieux
#! / b i n / b a s h
# Usage : a r c h i v e r nom−de−r ´e p e r t o i r e e ch o ” Format = n o r m a l gz ? ’ ’ r e a d f o r m a t
c a s e ” $ f o r m a t ” i n gz )
o p t i o n=z ; s u f f i x e =t g z ; ; n o r m a l | ”” )
o p t i o n= ; s u f f i x e =t a r ; ;
∗)
e c h o ” f o r m a t ’ $ f o r m a t ’ non r e c o n n u ”>&2 e x i t 1
; ; e s a c
p r e f i x e=$ ( basename $1 )
t a r−c${o p t i o n}f $ p r e f i x e . $ s u f f i x e $1
103 / 148
case
Exemple
1 #
2 # u s a g e :
3 # t e l a j o u t e r num nom
4 # t e l c h e r c h e r nom
5 # t e l v o i r
6 #
7 n o m F i c h i e r=” t e l e p h o n e . d a t ”
8
9 case” $1 ” i n
10 a j o u t e r )
11 s h i f t
12 echo $∗>>$ n o m F i c h i e r
13 ; ;
14 c h e r c h e r )
15 g r e p ” $2 ” $ n o m F i c h i e r
16 ; ;
17 v o i r )
18 cat $ n o m F i c h i e r
19 ; ;
20 ∗)
21 echo” E r r e u r ”
22 e x i t1
23 ; ;
24 e s a c
104 / 148
Motifs d’un case
Plusieurs motifs pour un mˆeme cas case $response of oui | o )
echo "d’accord"
;;
non | n ) echo "tant pis"
;;
esac
105 / 148
Motifs d’un case jokers
Utilisation des “jokers” de bash case $response of [oO][Uu][iI] | [oO] )
echo "d’accord"
;;
[nN][oO] ) echo "tant pis"
;;
*)
echo "quoi ?"
;;
esac
Dixi`eme partie Processus
Contenu
42D´efinitions
43Table des processus
44kill
45Pilotage des processus
46Une application Un exemple de service Le code principal Les fonctions
D´efinitions
Un processus = un programme “qui tourne”
Un programe lanc´e depuis le shell peut
tourner en “avant plan”(foreground) : il faut attendre sa fin pour lancer une autre commande
tourner en “arri`ere-plan”(background) ˆetrestopp´e
109 / 148
Pour
lancerune commande enavant-plan xclock stopperla commande en avant-plan CTRL-Z relancerla commande stopp´eeen avant-plan fg relancerla commande stopp´eeen arri`ere plan bg lancerune commandeen arri`ere-plan xclock &
Note : Si il y a plusieurs commandes en arri`ere-plan, commandes jobs,
fg %n, etc.
110 / 148
La table des processus
On peut la voir par la commandeps, outop, ...
Exemple
$ ps
PID TTY TIME CMD
4056 pts/1 00:00:00 bash 4236 pts/1 00:00:07 xpdf.bin 4243 pts/1 00:00:10 emacs 4471 pts/1 00:00:00 xterm 4613 pts/1 00:00:00 ps
ps sans option montre les processus issus du shell options int´eressantes :axule...
voir aussipstree
111 / 148
La commande “kill”
Syntaxe:kill[-signal] num-processus ...
Rˆole: envoie unsignal`a des processus Exemple
$ xclock &
[6] 4734
$ ps
PID TTY TIME CMD
4056 pts/1 00:00:00 bash 4236 pts/1 00:00:07 xpdf.bin 4734 pts/1 00:00:00 xclock 4739 pts/1 00:00:00 ps
$ kill -TERM 4734
112 / 148
La commande “kill” (suite)
Par d´efaut, utilise le signal TERM (9) qui termine le programme.
le signal STOP arrˆete un processus le signal CONT le relance kill -laffiche la liste des signaux
113 / 148
Pilotage des processus
commande &lance une commande en arri`ere-plan la variable $ ! contient son num´ero de processus la variable $$ = numero du shell courant Exemple
mplayer funny-music.mp3 >/dev/null &
music=$!
# sauvegardes tar czf ...
# arr^eter la musique `a la fin kill -9 $music
114 / 148
Wait
wait nnnattend un processus Exemple
mplayer funny-music.mp3 >/dev/null &
music=$!
# sauvegardes en parall`ele tar czf archive1.tar ... &
svgd1=$!
tar czf archive2.tar ... &
svgd2=$!
wait $svgd1 wait $svgd2
kill -9 $music # arr^ete la musique
115 / 148
Un exemple de service
Une commande pour faire apparaˆıtre / disparaˆıtre une pendule sur le bureau
Usage
./pendule.sh start ./pendule.sh stop ./pendule.sh usage ./pendule.sh restart
116 / 148
Le code principal
Code 2/2 ...case "$1" in start)
do_start ;;
stop) do_stop ;;
restart) do_stop do_start ;;
usage) print_usage ;;
*)
print_usage exit 1 esac
utilise 3 fonctions :do_start,do_stopetprint_usage
117 / 148
Constantes et Fonctions
Code 1/2 prog=/usr/bin/xclock pid_file=/tmp/$USER.pid function do_start {
$prog &
echo $! > $pid_file }
function do_stop { kill -9 $(cat $pid_file)) }
function usage {
echo "usage: pendule {start|stop|restart|usage}"
}
Onzi`eme partie Boucle for
Contenu
47Boucle for
48Exercice
49Exercice (seq)
50Exercice (find)
Boucle for
Forme g´en´erale for VAR in LISTE do
COMMANDE COMMANDE ....
done
Boucle avec une variable qui parcourt une liste de mots.
121 / 148
Boucle for, exemples simples
for f in *.cc do
astyle --syle=gnu $f done
for f in *.cc do
echo "le fichier $f contient $(wc -l $f) lignes"
done
122 / 148
Boucle for, exercice
Ecrire une commande qui calcule la somme de ses param`etres (en nombre illimit´e)
$ somme 100 3 20 123
123 / 148
Exercice (seq)
Analyser le script r=1
for i in $(seq 1 $1) do
let r*=i done
124 / 148
Exercice (find)
Analyser le script
for f in $(find ~ -name ’*.cc’ -ctime -7) do
ls -l "$f"
done
rˆole defind ~
rˆole defind ~ -name ’*.cc’
rˆole defind ~ -name ’*.cc’ -ctime -7r pourquoi les guillemets dansls?
125 / 148
Douzi`eme partie D´ecisions
126 / 148
Contenu
51 Code de retour (exit status)
52 if-then-else-fi
53La commandetest
54Enchaˆınement conditionnel
55if-then-elif-else, forme g´en´erale
127 / 148
Code de retour (exit status)
Lecode de retourd’un programme indique si il s’est bien termin´e.
Le code de retour de la derni`ere commande est dans la variable$?
Par convention : 0 = OK.
128 / 148
code de retour
Exemple
$ ls -ld /tmp
drwxrwxrwt 10 root root 12288 d´ec 22 17:32 /tmp
$ echo code de retour = $?
code de retour = 0
$ ls -l qsdsqd
ls: ne peut acc´eder qsdsqd: Aucun fichier ou r´epertoire de ce type
$ echo code de retour = $?
code de retour = 2
129 / 148
Codes de retour et documentation
Les codes de retour des commandes sont d´ecrits dans le manuel Exemple : man ls
...
Exit status is 0 if OK, 1 if minor problems, 2 if serious trouble.
exit
Par d´efaut, un script returne le code de sa derni`ere commande Il peut retourner un code sp´ecifique par
exit [code]
Exemple
1 #! / b i n / b as h
2 echo ” Something s t r a n g e happened ”
3 e x i t 42
La structure de contrˆoleif then else fiutilise le code de retour d’une commande
Exemple
1 #
2 # u s a g e :
3 # c o m p i l e r . sh p r e f i x e
4 #
5 i f g++−o $1 $1 . c c
6 then
7 echo” l a c o m p i l a t i o n s ’ e s t b i e n p a s s ´e e ”
8 e l s e
9 echo” i l y a eu un p r o b l`em e ”
10 f i
Test
Le code de retour du programmetestd´epend d’unecondition.
Exemple: test -f nomFichier indique si le fichier existe.
133 / 148
Application
fichier ”compiler.sh”
1 #! / b i n / b as h
2
3 i f t e s t−f $1 . c c
4 then
5 g++ −Wall −o $1 $1 . c c
6 echo C o m p i l a t i o n t e r m i n ´e e
7 e l s e
8 echo” E r r e u r : p a s de f i c h i e r $1 . c c ”
9 e x i t 1
10 f i
134 / 148
Autre notation :[ condition ] Autres tests :
[ -d nom ] # nom d´esigne un r´epertoire [ chaine1 = chaine2 ] # comparaison de chaines [ chaine1 != chaine2 ]
[ chaine1 \< chaine2 ] [ chaine1 \> chaine2 ]
[ nombre1 -eq nombre2 ] # comparaison de nombres [ nombre1 -ne nombre2 ]
[ nombre1 -le nombre2 ] # less or equal [ nombre2 -ge nombre2 ] # greater or equal
# voir aussi -lt et -gt
135 / 148
Exercice
Ecrire une commande qui affiche le maximum de deux param`etres.
Sc´enario
$ max.sh 37 421 421
136 / 148
Enchaˆınement conditionnel
Syntaxe
COMMANDE1 && COMMANDE2 COMMANDE1 || COMMANDE2
Ex´ecute la seconde commande seulement si la premi`ere a r´eussi (&&) ou
´echou´e (||) Exemple
g++ prog.cc && echo OK
137 / 148
Application
1 #
2 max=$1
3 [ $2−ge $max ] && max=$2
4 echo$max
138 / 148
if-then-elif-else, forme g´en´eral
Syntaxe if COMMANDES then
COMMANDES [ elif COMMANDES
then COMMANDES ]...
[ else COMMANDES ] fi
139 / 148
Treizi`eme partie Boucle while
140 / 148
Contenu
56Boucle while Syntaxe
57Boucle while-read
58break
141 / 148
Boucle while
while COMMANDE do
COMMANDES done
1 #
2 # f a c nombre
3 # c a l c u l e l a f a c t o r i e l l e d ’ un nombre
4 #
5 # e x e m p l e : f a c 5
6 i =1
7 f =1
8 w h i l e [ $ i −l e $1 ]
9 do
10 l e t f=f∗i
11 l e t i++
12 done
13 echo $ f
Boucle while-read
Tournure habituelle pour exploiter le contenu d’un fichier, ligne par ligne.
while read numero nom do
printf "| %12s | %-30s |\n" $numero $nom done < $nomFichier
L’instruction break
permet de sortir d’une boucle while true
do ....
echo "voulez-vous arr^eter ?"
read reponse
[ $reponse = oui ] && break ...
done
145 / 148
Quatorzi`eme partie Structures de Contrˆole
146 / 148
Contenu
147 / 148
Il y en a d’autres select until ...
148 / 148