La page des exos d'IS1

Table des matières

Système de fichiers

BILAN SUR LE SYSTÉME DES FICHIERS

Processus

BILAN SUR LES PROCESSUS

Programmer en Shell

BILAN SUR LES SCRIPTS SHELL

Les exos...

Mercredi 17 septembre 2008 : Chemins absolus et relatifs

Voici une arborescence (j'ai mis les fichiers réguliers en noir et les répertoires en bleu) :

Arborescence

Lorsque je tape pwd, l'ordinateur me répond /home/mgaune47.

Quel est le chemin relatif des fichiers/répertoires dont le chemin absolu est :

Quel est le chemin absolu des fichiers/répertoires dont le chemin relatif est :

Correction

Une toute petite remarque sur la dernière réponse : il faut savoir qu'un répertoire contient toujours au moins deux choses : . et .. (on les voit si on tape ls -a). Le .. désigne le répertoire parent et le . désigne le répertoire lui-même. Ainsi par exemple cd .. me fait reculer d'un cran alors que cd . ne change rien. C'est pour ça que je n'arrive qu'à /home et pas à /.


Jeudi 18 septembre 2008 : Lister, supprimer, déplacer, copier

On considère l'arborescence de la figure de l'exo du mercredi 17 septembre.

Lorsque je tape pwd, l'ordinateur me répond /home/mgaune47.

Rappelons que la commande ls -R liste récursivement ce que contient mon répertoire courant. Par exemple, ici elle m'affichera :

.:
test/     testbis/

./test:
f1     f2

./testbis:

(Pour bien comprendre ce que veulent dire ., ./test et ./testbis, souvenez vous que le . dans un répertoire désigne le répertoire lui-même.)

Que va m'afficher l'ordinateur si je tape la suite de commandes :

Correction


Vendredi 19 septembre 2008 : Complétion automatique

On considère l'arborescence de la figure de l'exo du mercredi 17 septembre.

Lorsque je tape pwd, l'ordinateur me répond /home/lmahio25.

Que va afficher l'ordinateur si je tape :

Que dois-je taper pour lister les répertoires :

Correction

Rappelons que * signifie "n'importe quel mot (éventuellement vide)" et que ? signifie "n'importe quel caractère" (exactement un caractère).

Souvenez vous aussi que ls rep renvoie :

fichiers_dans_rep

alors que ls rep1 rep2 renvoie:

rep1:
fichiers_dans_rep1

rep2:
fichiers_dans_rep2

Les réponses à l'exercice sont donc :


Samedi 20 septembre 2008 : Options (apprendre à lire le manuel)

Le manuel d'une commande cmd sous FreeBSD est disponible soit en tapant man cmd dans un terminal, soit en ligne à la page du manuel sur le site de FreeBSD. Même si ça peut paraître un peu aride au premier abord, je vous conseille d'apprendre rapidement à lire les pages de man. L'information que l'on cherche est très souvent contenue dedans.

Sauriez vous trouver dans la page du manuel sur ls les informations suivantes :

Correction

Voici les réponses (avec entre parenthèses les lignes du man qui vous donnent l'information).


Lundi 22 septembre 2008 : Bilan

Je me trouve devant un terminal. Lorsque je tape pwd, l'ordinateur me répond /home/vpilau94/IS1 ; et lorsque je tape ls -GR, l'ordinateur me dit
.:
admin/     tp1/     tp2/

./admin:
info1A4     informations

./tp1:
tp1.pdf     tp1.tex     tp1.tar

./tp2:
tp2.pdf     tp2.tex     tp2.tar

J'ai le droit de taper seulement une commande. Que dois-je taper pour que si je retape ls -GR, j'obtienne :

Deux petites questions au passage :

Correction


Mercredi 24 septembre 2008 : Se renseigner sur ses droits

Je tape id et l'ordinateur me répond
uid=638(vpilau94) gid=100(these) groups=100(these).

Je tape ls -Gl et l'ordinateur me répond
-r-xr-xr-- 1 vpilau94 these 2008-09-23 14:07 fichier1
-rw-r-xr-- 1 kgodel23 profs 2008-09-15 18:22 fichier2
drwxr-x--- 2 vpilau94 these 2008-09-21 15:35 rep1
drwxr-xr-x 5 dhilbe46 these 2008-08-09 09:12 rep2

Quels sont mes droits (et qu'est-ce qu'ils signifient) sur les fichiers/répertoires suivants :

Questions subsidiaires :

Correction

Les droits en octal :

Dernière chose : comme j'ai mis l'option G de ls, il m'affiche les résultats en couleur. Les répertoires sont en bleu, les fichiers non-executables sont en noir et les fichiers executables sont en vert. (Voir la page du manuel de ls.)


Jeudi 25 septembre 2008 : Messages d'erreur

Je tape id et l'ordinateur me répond
uid=638(vpilau94) gid=100(these) groups=100(these).

Je tape ls -Gl et l'ordinateur me répond
-r-xr-xr-- 1 vpilau94 these 2008-09-23 14:07 fichier1
-rw-r-xrw- 1 kgodel23 profs 2008-09-15 18:22 fichier2
drwxr-x--- 1 vpilau94 these 2008-09-21 15:35 rep1
drwxr-xr-x 5 dhilbe46 these 2008-08-09 09:12 rep2

Je tape cat fichier1 et l'ordinateur me répond
toto tata titi

Je tape cat fichier2 et l'ordinateur me répond
momo mama mimi

Que va me répondre l'ordinateur si je tape :

Correction

Note : j'ai changé un tout petit peu la troisième question en rajoutant w dans les droits de o du fichier fichier2 (j'avais posé deux fois la même question sinon).


Vendredi 26 septembre 2008 : chmod

Je tape id et l'ordinateur me répond
uid=638(vpilau94) gid=100(these) groups=100(these).

Je tape ls -l fichier et l'ordinateur me répond
-r-xr--r-- 1 vpilau94 these 2008-09-23 14:07 fichier

Quels droits aurais-je sur fichier si je tape :

Que dois-je taper pour avoir comme droits

Correction


Samedi 27 septembre 2008 : umask

Je tape umask et l'ordinateur me répond
421.

Je tape ensuite touch fichier et mkdir rep

Quels sont les droits sur fichier et rep ?

Quelle valeur dois-je donner à l'umask pour que les droits par défaut soient

Correction

Les droits sur fichier sont 245 (666-umask), i.e., -w-r--r-x

Les droits sur rep sont 356 (777-umask), i.e., -wxr-xrw-

Les valeurs à donner à l'umask sont :


Lundi 29 septembre 2008 : Bilan

Je me trouve dans un répertoire vide.

Je tape umask et l'ordinateur me répond
421.

Je tape ensuite touch fichier et mkdir rep.

Je tape chmod ug+x,o+r fichier et chmod g=r rep.

Que va m'afficher l'ordinateur si je tape ls -Gl ?

Correction

--wxr-xr-x 1 propriétaire groupe_propriétaire 0 date fichier
d-wxr--rw- 2 propriétaire groupe_propriétaire 4096 date rep


Mercredi 1 octobre 2008 : Repérer des liens physiques et symboliques

Je tape ls -il et l'ordinateur me répond :
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic2
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic3 -> fic1
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic4 -> fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic5
11518501 drwxr-xr-x 2 pilaud users 4096 2008-10-01 10:46 rep1/
11502084 lrwxrwxrwx 1 pilaud users 4 2008-10-01 10:46 rep2 -> rep1/

Quels sont les fichiers/répertoires qui sont liés physiquement/symboliquement ?

Correction

Les fichiers/répertoires liés physiquement sont ceux qui ont le même numéro d'inoeud, c'est à dire, fic1, fic2 et fic5 d'une part et fic3 et fic4 d'autre part.

Les liens symboliques se repèrent par la flèche : fic3 et fic4 sont symboliquement liés à fic1 et rep2 est symboliquement lié à rep1.


Jeudi 2 octobre 2008 : Comportement des liens physiques et symboliques

Je tape pwd et l'ordinateur me répond :

/home/vpilau94/IS1

Je tape ls -ilR et l'ordinateur me répond :
.:
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic2
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic3 -> fic1
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic4 -> fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic5
11518501 drwxr-xr-x 3 pilaud users 4096 2008-10-02 11:37 rep1/
11502084 lrwxrwxrwx 1 pilaud users 4 2008-10-01 10:46 rep2 -> rep1/

./rep1:
11518505 drwxr-xr-x 2 pilaud users 4096 2008-10-02 11:37 rep3/
11518506 lrwxrwxrwx 1 pilaud users 4 2008-10-02 11:36 rep4 -> rep3/

./rep1/rep3:
11518502 -rw-r--r-- 1 pilaud users 0 2008-10-02 11:35 fic6
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic7
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic8

Que va afficher l'ordinateur si je tape

Correction


Vendredi 3 octobre 2008 : Nombre de liens sur un répertoire

Je tape ls -l et l'ordinateur me répond :
11518501 drwxr-xr-x 8 pilaud users 4096 2008-10-02 11:37 rep/

Combien le répertoire rep contient-il de répertoires ?

Correction

Le répertoire rep contient lui-même 6 répertoires. En effet, il y a 8 liens, chacun correspondant à un répertoire contenu dans rep sauf le lien qui vient de son père et son auto-lien (le . qu'il contient forcément).


Samedi 4 octobre 2008 : Créer des liens

Pouvez-vous donner une suite de commande qui permet de créer l'arborescence suivante :
.:
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic2
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic3 -> fic1
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic4 -> fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic5
11518501 drwxr-xr-x 3 pilaud users 4096 2008-10-02 11:37 rep1/
11502084 lrwxrwxrwx 1 pilaud users 4 2008-10-01 10:46 rep2 -> rep1/

./rep1:
11518505 drwxr-xr-x 2 pilaud users 4096 2008-10-02 11:37 rep3/
11518506 lrwxrwxrwx 1 pilaud users 4 2008-10-02 11:36 rep4 -> rep3/

./rep1/rep3:
11518502 -rw-r--r-- 1 pilaud users 0 2008-10-02 11:35 fic6
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic7
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic8

Correction

Je suppose que le répertoire de travail (.) est vide.

mkdir rep1
mkdir rep1/rep3
touch fic1
touch rep1/rep3/fic6
touch rep1/rep3/fic7
ln fic1 fic2
ln fic1 fic5
ln -s fic1 fic3
ln fic3 fic4
ln -s rep1 rep2
ln rep1/rep3/fic7 rep1/rep3/fic8
ln -s rep3 rep1/rep4


Lundi 6 octobre 2008 : Bilan

Je tape ls -ilR et l'ordinateur me répond :
.:
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic2
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic3 -> fic1
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic4 -> fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic5
11518501 drwxr-xr-x 3 pilaud users 4096 2008-10-02 11:37 rep1/
11502084 lrwxrwxrwx 1 pilaud users 4 2008-10-01 10:46 rep2 -> rep1/

./rep1:
11518505 drwxr-xr-x 2 pilaud users 4096 2008-10-02 11:37 rep3/
11518506 lrwxrwxrwx 1 pilaud users 4 2008-10-02 11:36 rep4 -> rep3/

./rep1/rep3:
11518502 -rw-r--r-- 1 pilaud users 0 2008-10-02 11:35 fic6
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic7
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic8

Quelle(s) commande(s) dois-je taper pour :

Correction


Mercredi 8 octobre 2008 : Reconstituer l'arborescence

Voici à quoi ressemble ma table d'inoeuds sur disque (j'oublie les informations concernant les tailles et les dates) :

2 3 4 5 6 7 8 9 10 11 12
d
rwxr-xr-x
root
admin
1
add0
d
rwxr-xr-x
root
admin
5
add2
d
rwxr-xr-x
root
admin
2
add19
d
rwxr-xr--
root
admin
4
add6
d
rwxr-xr--
fdsilv48
is1
4
add3
d
rwxr-xr--
lmahio25
is1
6
add10
d
rwxrw-r--
mgaune47
is1
4
add5
d
rwxr-xr-x
root
admin
2
add14
13 14 15 16 17 18 19 20 21 22 23
d
rwxr-xr--
fdsilv48
is1
2
-
d
rwxr-xr--
fdsilv48
is1
2
-
d
rwxr-xr--
mgaune47
is1
2
-
d
rwxr-xr--
mgaune47
is1
2
add8
d
rwxr-xr--
lmahio25
is1
2
-
d
rwxr-xr--
lmahio25
is1
2
add15
-
rwxrw-r--
mgaune47
is1
1
-
-
rwxr--r--
mgaune47
is1
2
add7
d
rwxr-xr--
lmahio25
is1
2
-
24 25 26 27 28 29 30 31 32 33 34
-
r-xr--r--
lmahio25
is1
2
add17
d
rwxr-xr--
mgaune47
is1
2
add12
-
rwxr--r--
root
admin
1
add13
-
r-xr--r--
lmahio25
is1
2
-
-
rwxr--r--
root
admin
2
add16
-
rwxr--r--
root
admin
1
-
-
rwxr--r--
root
admin
1
-

... et voici la table des blocs :

add0 add1 add2 add3 add4 add5 add6 add7 add8 add9
(home,3)
(media,6)
(fdsilv48,7)
(mgaune47,10)
(lmahio25,9)
(Desktop,15)
(rep,13)
(test,17)
(testbis,16)
(USB1,12)
(USB2,5)
bonjour (f1,21)
(f2,22)
add10 add11 add12 add13 add14 add15 add16 add17 add18 add19
(A,20)
(B,23)
(AA,18)
(ABC,25)
(f5,28)
(f6,24)
(f7,24)
heho (f8,30)
(f9,30)
(f10,31)
(f3,28)
(f4,22)
coucou salut (f11,26)
(f12,33)

Quelle est l'arborescence correspondante ?

Correction

C'est l'arborescence de la figure de l'exo du mercredi 17 septembre.


Jeudi 9 octobre 2008 : Droits, liens

Étant donné la table d'inoeuds sur disque et la table de blocs de l'exo mercredi du 8 octobre,

Correction


Samedi 11 octobre 2008 : Algorithmes en jeu derrière une commande

La table d'inoeuds sur disque et la table de blocs sont celles de l'exo mercredi du 8 octobre.

La table d'inoeuds en mémoire est la suivante :

0 1 2 3 4 5 6 7 8 9
INOEUD 2
d
rwxr-xr-x
root
admin
1
add0
INOEUD 10
d
rwxrw-r--
mgaune47
is1
4
add5
INOEUD 3
d
rwxr-xr-x
root
admin
5
add2

Enfin, mon superbloc est [4,11,14] et le plus petit inoeud sur disque libre et hors du superbloc est 8.

Que fait l'ordinateur (quelles sont les étapes et les algorithmes en jeu) si je tape la commande :

Correction


BILAN SUR LE SYSTÉME DES FICHIERS

On ne reviendra plus sur le système de fichiers (bien qu'on l'utilisera tout le temps). Il faut savoir :


Mercredi 15 octobre 2008 : ps et kill

Lorsque je tape ps -o pid,ppid,stat,cmd, l'ordinateur répond :
   PID         PPID     STAT    CMD
13287     11757       Ss      zsh
13289     11757       Ss      zsh
14526     13287       T         xclock
14528     13287       S         xeyes
14632     13289       S         xclock
14635     13287       S         emacs
14705     13287       R+      ps -o pid,ppid,stat,cmd

Je tape alors les commandes suivantes :
kill -9 13289
kill -SIGSTOP 14528
kill -SIGCONT 14526
kill -SIGTERM 13287

Que va afficher l'ordinateur si je retape ps -o pid,ppid,stat,cmd ?

Correction

Avec le premier signal (9, ou autrement dit, SIGKILL), j'ai tué le shell 13289 et tous les processus qui en descendent. Avec les signaux SIGSTOP et SIGCONT, je suspends ou réactive une tache. Enfin, le signal SIGTERM termine une tache, mais est inactif sur un terminal. Par conséquent, l'ordinateur va afficher :
   PID         PPID     STAT    CMD
13287     11757       Ss      zsh
14526     13287       S         xclock
14528     13287       T         xeyes
14635     13287       S         emacs
14712     13287       R+      ps -o pid,ppid,stat,cmd


Jeudi 16 octobre 2008 : Job control

J'ai deux terminaux ouverts t1 et t2 dans lesquels je n'ai encore aucun job. En utilisant le job control, donner une (ou des) séquence(s) de commandes équivalente(s) aux séquences de commandes suivantes :

Correction


Vendredi 17 octobre 2008 : Valeur de retour

En lisant éventuellement le manuel de la commande test, pouvez-vous dire quelles sont les valeurs de retour des commandes suivantes :

Correction


Samedi 18 octobre 2008 : Enchainements de commandes

Que font les enchainements de commandes suivants :

Quel enchainement de commande puis-je taper pour

Correction

Voici ce que font ces commandes :

Commande Si f existe Si f n'existe pas
test -e f && echo present || echo absent affiche present affiche absent
test -e f || echo absent && echo present affiche present affiche absent puis present
test -e f && (echo present || echo absent) affiche present rien
test -e f || (echo absent && echo present) rien affiche absent puis present

Et voici les commandes à taper :


Lundi 20 octobre 2008 : Bilan

Lorsque je tape ps -o uid,pid,ppid,stat,cmd, l'ordinateur répond :
UID     PID       PPID     STAT    CMD
638     8930     8756     Ss       zsh
638     9046     8930     T          xclock
638     9047     8930     S          xeyes
638     9051     8930     R+       ps -o uid,pid,ppid,stat,cmd

Lorsque je tape jobs, l'ordinateur me répond :
[1] + suspended     xclock
[2] - running               xeyes

Que va afficher l'ordinateur si je tape kill -SIGCONT 9046 || kill -9 9047 && test salut = bonjour || (echo différents && xclock &) && ps -o pid,stat,cmd ?

Correction

différents
PID          STAT     CMD
8930       Ss            zsh
9046       S               xclock
9047       S               xeyes
9085       S               xclock
9086       R+            ps -o pid,stat,cmd


Mercredi 22 octobre 2008 : Redirections

Je tape echo bonjour > fic1, puis echo salut > fic2. Je suppose que je n'ai pas de fichier nommé fic3 dans mon répertoire de sorte que si je tape wc fic1 fic2 fic3, l'ordinateur répond :
1 1 8 fic1
1 1 6 fic2
wc: fic3: No such file or directory
2 2 14 total

Qu'y aura-t-il dans les fichiers out1 et out2 si je tape :

Correction

Comande cat out1 cat out2
wc fic1 fic2 fic3 > out1 2> out2 1 1 8 fic1
1 1 6 fic2
2 2 14 total
wc: fic3: No such file or directory
wc fic1 fic2 fic3 >out1 2>&1 1 1 8 fic1
1 1 6 fic2
wc: fic3: No such file or directory
2 2 14 total
n'existe pas
wc < fic1 > out1 1 1 8 n'existe pas
wc < fic3 2> out2 n'existe pas n'existe pas
wc < fic1 > out1 ; wc < fic2 > out1 1 1 6 n'existe pas
wc < fic1 > out1 ; wc < fic2 >> out1 1 1 8
1 1 6
n'existe pas

Jeudi 23 octobre 2008 : Tubes

Comment peut-on faire pour :

Au besoin, on pourra se référer au manuel des commandes less cut tee sort uniq.

Correction


Vendredi 24 octobre 2008 : cut

J'ai un fichier geo dans lequel j'ai noté les noms des capitales des pays de l'Union Européenne : lorsque je tape cat geo, l'ordinateur me répond:
Amsterdam Pays-Bas
Athènes Grèce
Berlin Allemagne
Bratislava Slovaquie
Bruxelles Belgique/Europe
Bucarest Roumanie
Budapest Hongrie
Copenhague Danemark
Dublin Irlande
Helsinki Finlande
La Valette Malte
Lisbonne Portugal
Ljubljana Slovénie
Londres Royaume-Uni
Luxembourg-Ville Luxembourg
Madrid Espagne
Nicosie Chypre
Paris France
Prague Tchéquie
Riga Lettonie
Rome Italie
Sofia Bulgarie
Stockholm Suède
Tallinn Estonie
Varsovie Pologne
Vienne Autriche
Vilnius Lituanie

Comment peut-on faire pour :

Correction


Samedi 25 octobre 2008 : Tubes nommés

Exercice difficile

Vous avez deux terminaux t1 et t2 ouverts. Comment feriez-vous pour que :

Correction


Lundi 27 octobre 2008 : Bilan

Exercice difficile (exercice 15 de la feuille du TP 5)

Vous avez deux terminaux t1 et t2 ouverts. Comment feriez-vous pour taper des commandes dans t1, pour que ces commandes s'exécutent dans t2, et pour voir le résultat de ces commandes à la fois dans t1 et dans t2 ?

Correction

D'abord, je crée deux tubes nommés mkfifo tube1 tube2. Ensuite, dans t1, je tape cat tube2 & cat > tube1, et dans t2, je tape bash < tube1 2>&1 | tee tube2


BILAN SUR LES PROCESSUS

Ce qu'il faut savoir :


Mardi 4 novembre 2008 : Variables

Que se passe t'il si je tape $a $b pour les valeurs suivantes des variables a et b :

Que se passe t'il si je tape :

Lorsque je tape ls *, je vois
f1     f2     f3

Que se passe t'il si je tape :

Correction

L'ordinateur affiche :


Mercredi 5 novembre 2008 : Expansions

Je tape ls et l'ordinateur répond :
baba bebe bobo haha hehe hoho tata tete toto

Que dois-je taper pour désigner (après expansion) exactement les fichiers :

Correction


Jeudi 6 novembre 2008 : Executable

Écrivez un executable qui lit dans le terminal deux nombres a et b (voir le manuel de la commande read) et écrit
a+b=s
(où a et b sont remplacées par leurs valeurs, et s est la somme de a et b calculée par le bash).

Correction

Dans un fichier texte, que l'on rendra executable, on écrit :
echo entrer deux entiers
read a
read b
echo $a + $b = $(($a+$b))


Dimanche 9 novembre 2008 : Conditionnelle

Écrivez un executable qui lit dans le terminal deux chaines de caractères a et b (voir le manuel de la commande read) et écrit a si elles sont identiques et a/b si elles sont différentes.

Correction

Dans un fichier texte, que l'on rendra executable, on écrit :
echo entrer deux chaines de caractères
read a
read b
if(test $a = $b)
then
    echo $a
else
    echo $a/$b
fi


Mardi 11 novembre 2008 : Case

En utilisant la commande case, écrire un executable qui demande un entier, vérifie s'il est entre 1 et 12, et renvoie le nom du mois correspondant.

Correction

Dans un fichier texte, que l'on rendra executable, on écrit :
echo "entrer un entier entre 1 et 12"
read n
case $n in
    1) echo Janvier
    2) echo Fevrier
    3) echo Mars
    4) echo Avril
    5) echo Mai
    6) echo Juin
    7) echo Juillet
    8) echo Aout
    9) echo Septembre
    10) echo Octobre
    11) echo Novembre
    12) echo Decembre
    *) echo "J'avais dit un entier entre 1 et 12 ..."
esac


Mercredi 12 novembre 2008 : Divisions

Je suis supersticieux. Mon nombre préféré est le 5, mais j'aime bien le 7 aussi.

Écrivez-moi un executable qui m'affiche :

Remarque : pour avoir le reste de la division de a par b, on tape $((a%b)).

Dans le troisième cas, sauriez vous en plus faire afficher le temps qu'il reste à passer avant de terminer ce mauvais moment ?

Correction

Fichier texte ... executable ... blahblah ... :
#D'abord, je calcule le reste modulo 5 du nombre de minutes écoulées depuis ce matin (remarque : pas la peine d'ajouter le nombre d'heures multipliées par 60, puisque 60 est divisible par 5)

a=$((`date "+%M"`%5))

#Ensuite, je calcule le reste modulo 7 du nombre de minutes écoulées depuis ce matin

b=$(((`date "+%H"`*60+`date "+%M"`)%7))

#Et finalement, ce n'est qu'une conditionnelle...

if ( (($a==0)) ) then echo bon moment
elif ( (($b%7==0)) ) then echo passable
elif ( (((5-$a)<(7-$b))) ) then echo "ce mauvais moment ne va durer que $((5-$a)) minute(s)"
else echo "ce mauvais moment ne va durer que $((7-$b)) minute(s)"
fi


Mercredi 19 novembre 2008 : Paramètres et variables (1)

Écrivez un exécutable qui prend en argument un chemin (absolu ou relatif) vers un fichier, et :

Correction

Attention à la différence entre arguments et variables :
if(test -f $1)
then
    cat $1
else
    echo entrer une phrase
    read phrase
    echo phrase de substitution : $phrase
fi


Jeudi 20 novembre 2008 : Paramètres et variables (2)

Écrivez un exécutable qui prend n arguments arg1 arg2 ... argn et affiche : mon premier argument est arg1, et les suivants sont arg2 ... argn (en remplaçant bien sûr arg1 ... argn par leurs valeurs respectives). On pourra se servir de la commande shift.

Correction

#Dans une variable arg1, je conserve le premier argument. Ensuite, j'utilise le shift pour décaler tous les autres arguments (la variable @ contiendra alors arg2 ... argn).
arg1=$1
shift
echo mon premier argument est $arg1, et les suivants sont $@


Vendredi 21 novembre 2008 : Paramètres et variables (3)

Écrivez un exécutable execute qui prend en arguments le nom d'une commande cmd suivi d'arguments arg1 arg2 ... argn et affiche :
la commande cmd a reçu n arguments : arg1 arg2 ... argn
et le résultat de cette commande est
res
cmd, n, arg1 arg2 ... argn ont été remplacés par leurs valeur et res est le résultat de la commande cmd sur les arguments arg1 arg2 ... argn.

Par exemple, si un fichier fic1 contenant le mot bonjour et un fichier fic2 contenant le mot au revoir, et si je tape execute cat fic1 fic2, je dois voir apparaître :
la commande cat a reçu 2 arguments : fic1 fic2
et le résultat de cette commande est
bonjour
au revoir

Correction

Il faut utiliser la fonction shift :
cmd=$1
shift
echo la commande $cmd a reçu $# arguments : $@
et le résultat de cette commande est
$cmd $@


Samedi 22 novembre 2008 : Options

Écrivez un exécutable inverse qui prend en parametres :

et renvoie :

Par exemple, inverse -i haha hehe renvoie hehe haha alors que inverse haha hehe renvoie haha hehe.

Correction

if([ $1 = "-i" ]) then echo $3 $2 ; else echo $1 $2 ; fi


Mercredi 26 novembre 2008 : Caractères centraux

Écrire un exécutable centre qui prend en argument un mot m et affiche :

Par exemple, centre bonjour va afficher j tandis que centre coucou va afficher uc.

Correction

On peut utiliser une conditionnelle :
n=${#1}
a=$((n%2))
b=$((n/2))
if (($a==0)); then echo ${1:$(($b-1)):2}; else echo ${1:$b:1}; fi

Pour ceux qui veulent réfléchir un peu, on peut aussi faire ça sans conditionnelle :
echo ${1:$((${#1}/2-1+${#1}%2)):$((2-${#1}%2))}


Jeudi 27 novembre 2008 : Répétitions en début de mot

Ècrire un exécutable repetitions qui prend en argument un mot m et affiche autant d'occurences de la première lettre de m qu'il y en a au début de m. Par exemple, repetitions aaaabcabb doit afficher aaaa.

Vous pouvez utiliser :

Correction

METHODE 1 : recursif

Dans un executable nommé occurencesInitiales, j'écris :
if ((${#2}==0)) || test ${2:0:1} != "$1"; then echo ""; else echo -n $1; ./occurencesInitiales $1 ${2:1}; fi
Autrement dit, occurencesInitiales prend en argument une lettre a et un mot m. Il teste si a est la première lettre de m. Si c'est le cas, il affiche a puis recommence avec le mot m privé de sa première lettre. Sinon, il s'arrête.
Ensuite, dans l'exécutable repetitions on écrit juste :
./occurencesInitiales ${1:0:1} $1

METHODE 2 : boucle

Dans l'exécutable repetitions on écrit :
i=0
while (($i<${#1})) && test ${1:$i:1} = ${1:0:1}
do
    echo -n ${1:0:1}
    i=$(($i+1))
done
echo

METHODE 3 : sed

Dans l'exécutable repetitions on écrit juste :
echo $1 | sed 's/\(.\)\(\1*\)[^\1].*/\1\2/'


Vendredi 28 novembre 2008 : Lettres impaires d'un mot

En utilisant une des trois possibilités de l'exercice du Jeudi 27 novembre (i.e., récursivité, boucles, ou sed), proposez un exécutable qui prend en argument un mot et affiche toutes ses lettres en position impaire : la première, la troisième, la cinquième, etc. Par exemple impair abcde doit afficher ace.

Correction

METHODE 1 : recursif

Dans l'exécutable impair on écrit :
echo -n ${1:0:1}
if((${#1}>2)); then ./impair ${1:2}; else echo ""; fi

METHODE 2 : boucle

Dans l'exécutable impair on écrit :
i=0
while (($i<${#1}))
do
    echo -n ${1:i:1}
    i=$(($i+1))
done
echo

METHODE 3 : sed

Dans l'exécutable impair on écrit juste :
echo $1 | sed 's/\(.\)./\1/g'


Mercredi 23 décembre 2008 : grep

Dans un fichier fic, j'ai rentré des lignes de texte.

Correction


Jeudi 24 décembre 2008 : sed

Dans un fichier fic, j'ai rentré des lignes de texte.

Correction


Vendredi 25 décembre 2008 : expr

Écrivez un exécutable qui prend en argument un mot et retourne comme valeur de retour 0 si ce mot contient deux lettres identiques qui se suivent, et 1 sinon.

Correction

Dans un fichier doubleLettre, que je rends exécutable, je tape :
expr $1 : ".*\([a-zA-Z]\)\1" > /dev/null


Mercredi 10 décembre 2008 : Boucle for

Écrire un exécutable qui prend en argument un répertoire (chemin relatif ou absolu) et transforme le noms de tous les fichiers situés dans ce répertoire en y ajoutant la date avant le premier point : par exemple, le 10 décembre 2008, un fichier nommé fic.pdf doit être renommé en fic20081210.pdf.

Correction

Dans un fichier ajouterDate, que je rends exécutable, je tape :
for fic in $1/*
do
    mv $fic $(echo $fic | sed -e "s/\([^.]*\)\./\1$(date +%Y%m%d)\./" -e "s/^\([^.]*\)$/\1$(date +%Y%m%d)/")
done


Jeudi 11 décembre 2008 : Boucle while

Écrire une ligne de commande qui demande à l'utilisateur un nombre et affiche s'il est premier ou pas.

Correction

echo -n "entrer un entier "
read n
i=2
while (($i*$i<=$n))
do
    if (($n%$i==0)) ; then echo "pas premier"; exit ; fi
    i=$(($i+1))
done
echo "premier"


Vendredi 12 décembre 2008 : Boucles imbriquées

Écrire un exécutable qui demande quel était le jour de la semaine (lundi, mardi,...,dimanche) le premier janvier, et si nous sommes dans une année bissextile, et affiche tous les jours de l'année sous la forme jour date mois. Par exemple, si on répond mardi et oui (comme en 2008), l'exécutable doit afficher :
mardi 1 janvier
mercredi 2 janvier
etc
mercredi 31 décembre
BONNE ANNÉE

Correction

D'abord, j'ai besoin de quelques petits exécutables intermédiaires (je vous laisse écrire les deux premiers...) :

Ensuite, j'écris dans mon exécutable afficherAnnee :
echo -n "Quel jour étions nous le 1 janvier ? "
read jour
echo -n "Sommes-nous dans une année bissextile ? "
read rep
for((m=1; m<=12; m++))
do
    for((j=1; j<=$(nbrjours $m $rep); j++))
    do
       echo $jour $j $(mois $m)
       jour=$(jourSuivant $jour)
    done
done
echo BONNE ANNEE


BILAN SUR LES SCRIPTS SHELL

Ce qu'il faut savoir :


Valid XHTML 1.0 Strict CSS Valide !