• Aucun résultat trouvé

Première partie. Qu est-ce qu un script?

N/A
N/A
Protected

Academic year: 2022

Partager "Première partie. Qu est-ce qu un script?"

Copied!
13
0
0

Texte intégral

(1)

Unix : shell scripts

ASR1 - Syst`emes d’exploitation

Semestre 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

(2)

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

(3)

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) Exemple

Le 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

(4)

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

(5)

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.

(6)

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

(7)

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

(8)

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

$

(9)

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

(10)

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)

(11)

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

(12)

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

(13)

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

Références

Documents relatifs

[r]

When inserting the cable connectors into the sockets, press inward on the clips so that they hook into the sockets, as shown below.. Make sure the clips on the cable connectors

Completely install Release 3.5 and reconfigure the kernel, as described in Chapters 2 and 3 of Release 3.5 Manual/or the Sun Workstation.. Ensure that you have 8 Mbytes of

If you plan to use the file server you are installing as a remote host for remote installation of another workstation, you will need an additional 5 Mbytes of free space in one

diskette contains the CP/M (Control Program for Microcomputers) program, which operates the computer, and programs such as word processing, spreadsheet, etc... CARE

L’inconv´enient essentiel des SSI est que le serveur HTTP doit lire ligne ` a ligne le code HTML de toute page `a renvoyer (tout au moins celles d’un suffixe d´etermin´e tel que

(pour élargir la colonne B, mettre le curseur entre B et C, il devient une double flèche, cliquer et déplacer le curseur puis lâcher).. Un petit carré noir apparaît en bas à droite

Cette compétence est évaluée avec l’exercice 1a et