Vous êtes sur la page 1sur 9

UNIC J1 - Sujet

Copyright
Copyright c Jules Aubert <jules.aubert@ext.devinci.fr>

1
Table des matières

1 Exercices 5
1.1 strlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.1 But . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 rot13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.1 But . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 80 columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.1 But . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4 seq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4.1 But . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4.2 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.5 Readable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.5.1 But . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.5.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.6 Dectobin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.6.1 But . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.6.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.7 Mypar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.7.1 But . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.7.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.8 La tour, prends garde ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.8.1 But . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.8.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2
Obligations
Les obligations sont des règles fondamentales partagées pour tous les sujets. Ainsi, n’hésitez pas à demander des
explications si vous ne comprenez pas une de ces règles.

Obligations#0 : Votre répertoire racine de soumission doit contenir un fichier AUTHORS. Son format est décrit dans
Données de projet. Si ce fichier est manquant, vous aurez zéro.
Obligations#1 : Tricher, tout comme partager du code source, des tests, des outils de tests ou des outils de correction de
la coding style est strictement interdit et est pénalisé en vous marquant comme tricheur (note = -42/20) et est reporté
au personnel académique.
Obligations#2 : Si vous ne soumettez pas votre travail avant la fin de projet, votre note sera remplacé par 0.
Obligations#3 : Votre répertoire de soumission doit être propre. Exceptés les cas spéciaux, ce qui (s’il y en a) sont
explicitement mentionné dans ce document, un dépôt impropre peut contenir :
— des fichiers binaires ; 1
— des fichiers avec des permissions inappropriées ;
— des fichiers interdits : *∼, *.swp, *.o, *.a, *.so, *.class, *.log, *.core, etc. ;
— un fichier qui ne suit pas mes spécifications (voir Données de projet).
Obligations#4 : Si une fonction, une commande ou une bibliothèque n’est pas explicitement autorisée, elle est interdite.
Obligations#5 : Lorsque des exemples présentent l’utilisation d’un format de sortie, vous devez le suivre scrupuleusement.
Obligations#6 : Respecter la coding style.

Conseils
— Lisez le sujet en entier.
— Si le moindre problème lié au projet arrive, vous pouvez prendre contact avec moi.
— Dans les exemples, le symbole $ est mon prompt : utilisez-le comme référence.
— N’attendez pas la dernière minute pour commencer votre projet !

1. Si un fichier exécutable est requis, merci de ne donner que sa source, je le compilerai moi-même.

3
Données du projet
Instructeur
— JULES AUBERT <jules.aubert@ext.devinci.fr>
Dates importantes :
— début : Jeudi, 26, Septembre, 2019, 17h
— fin : Mercredi, 02, Octobre, 2019, 23h42
— duration : 7 jours, 06 heures, 42 minutes
Membre par équipe : 1

Langages & compilateurs :


shell avec Shell → sh

Arborescence 2 de votre répertoire de soumission


./src/*
./doc/*
./AUTHORS * : Contient votre login de ce format : un asterisque *, un espace, un login (e.g. jules.aubert) et un retour à
la ligne. Un login se présente sous la forme "prenom.nom" (sans accent).
Ainsi :
1 $ cat -e AUTHORS
2 * jules . aubert$
3 $

Tag :
— Tag : submission
— Token : unic-j1-sujet
Contact
— Mail : jules.aubert@ext.devinci.fr
— Sujet du mail : [BSC2][UNIC][J1] Login - Sujet du problème

2. Les fichiers marqués d’un astérisque sont obligatoires. Le point "." est la racine de votre répertoire. Cette liste n’est pas exhaustive !

4
Chapitre 1

Exercices

1.1 strlen
— Fichier : strlen.sh
— Répertoire source : src/ex1
— Commandes autorisées : les builtins, grep, sed, wc, tr, head ,tail,cat,cut,expr,stat,find

1.1.1 But
Ecris un shell script autorisant un nombre arbitraire d’arguments, et qui affiche, pour chacun d’entre eux, le message
suivant :
1 " WORD " counts N character ( s )

avec WORD l’argument courant, et N son nombre de caractères. Remarquez que "character" doit être en accord avec le
nombre. Pour résumer :
— Pour N < 2, le message sera : "WORD" counts N character$
— Pour N ≥ 2 : "WORD" counts N characters$
Le symbole $ signifie "fin de ligne", donc ne l’écris pas ! Si une erreur arrive, votre script doit quitter avec le code de retour
1. Sinon, il retournera 0. L’utilisation de caractères spéciaux ne sera pas testé.

1.1.2 Exemple
1 $ ./ strlen . sh foo
2 " foo " counts 3 characters$
3 $ echo $ ?
4 0
5 $ ./ strlen . sh
6 $ echo $ ?
7 1
8 $ ./ strlen . sh foo bar Solarium l33t a " "
9 " foo " counts 3 characters$
10 " bar " counts 3 characters$
11 " Solarium " counts 8 characters$
12 " l33t " counts 4 characters$
13 " a " counts 1 character$
14 " " counts 0 character$

1.2 rot13
— Fichier : rot13.sh
— Répertoire source : src/ex2
— Commandes autorisées : les builtins, grep, sed, wc, tr, head, tail, cat, cut, expr, stat, find

1.2.1 But
Ton shell script doit seulement prendre en argument un fichier texte, et afficher sur la sortie standard le contenu du fichier
après avoir appliqué dessus un rot13. Si une erreur survient, votre script ne doit rien afficher et retourner 1. En cas de
succès, il retournera évidemment 0. Les tests ne seront effectués que sur des fichiers avec des caractères ASCII (lettres,
espaces, chiffres, ..., man ascii pour plus d’informations.)

5
1.2.2 Exemple
1 $ cat - te foo . txt
2 J ’ aime UNIX . $
3 School is cool ! $
4 $ ./ rot13 . sh foo . txt | cat - te
5 W ’ nvzr HAVK . $
6 Fpubby vf pbby ! $

1.3 80 columns
— Fichier : 80cols.sh
— Répertoire source : src/ex3
— Commandes autorisées : les builtins, grep, wc, tr, head, tail, cat, cut, expr, stat, find

1.3.1 But
Le but de cet exercice est d’afficher, depuis un fichier donné en argument, les lignes qui ont strictement plus de 80
caractères, en inclutant les retours à la ligne. La tabulation doit être considérée comme n’importe quel autre caractère.
Ainsi, elle comptera comme un caractère.

1.3.2 Exemple
1 $ cat test . txt
2 This is a short line .
3 This is a very long line , maybe the longest line I have ever seen in this subject !
4 This is another short line .
5 $ ./80 cols . sh test . txt
6 This is a very long line , maybe the longest line I have ever seen in this subject !

1.4 seq
— Fichier : seq.sh
— Répertoire source : src/ex4
— Commandes autorisées : les builtins, grep, sed, wc, tr, head, tail, cat, cut, expr, stat, find

1.4.1 But
Tu dois écrire un shell script qui permet de générer des listes de nombres. L’usage attendu est le suivant :
1 $ ./ seq . sh FIRST INCREMENT LAST

— Si le nombre d’arguments n’est pas correct, le script doit retourner 1 et afficher l’usage (voir les exemples)
— Je considère que les arguments FIRST, INCREMENT et LAST peuvent être négatifs, mais seront toujours des
entiers.
— INCREMENT doit être strictement positif. Si ce n’est pas le cas, le script n’affiche rien et retourne 1.
— LAST doit être strictement supérieur à FIRST. Si ce n’est pas le cas, le script n’affiche rien et retourne 1. Tu dois
afficher les nombres ’n’ dans l’odre croissant, tel que :
— FIRST ≤ n ≤ LAST
— n = FIRST + i × INCREMENT (∀i ∈ N, i ≥ 0)
— Si FIRST = LAST, affiche FIRST et le script retourne 0.
Pour plus de détails sur les caractèristiques du script, regarde les examples suivants comme références.
Le cas où FIRST > LAST ne sera pas testé.

1.4.2 Exemples
1 $ ./ seq . sh 1 1 1
2 1
3 $ ./ seq . sh 42 1 42
4 42
5 $ ./ seq . sh 40 -2 42
6 $ echo $ ?
7 1
8 $ ./ seq . sh 10 3 23
9 10
10 13
11 16
12 19
13 22
14 $ ./ seq . sh -10 2 -1

6
15 -10
16 -8
17 -6
18 -4
19 -2
20 $ ./ seq . sh 42
21 Usage : ./ seq . sh FIRST INCREMENT LAST
22 $ echo $ ?
23 1

Pour que tu sois au courant, la commande seq existe : si tu es curieux, lis le man !
1.5 Readable
— Fichier : readable.sh
— Répertoire source : src/ex5
— Commandes autorisées : les builtins, grep, sed, wc, tr, head ,tail,cat,sort, cut,expr,stat,find

1.5.1 But
Tu dois écrire un script shell qui prend un en argument le nom d’un répertoire et affiche sur l’entrée standard tous ses
fichiers et sous-fichiers - mais pas les répertoires - auxquels le propriétaire a le droit de lecture. Pour chaque répertoire, tu
dois classer les résultats dans l’ordre alphabétique.

Si tout se passe bien, ton script renverra 0. Il renverra 1 si le nombre d’aguments est insuffisant, et 2 pour toutes les autres
erreurs. Si un problème survient, le contenu de la sortie standard n’importe pas. L’erreur standard ne sera pas vérifiée. Il y
a plusieurs moyens de procéder, tu dois trouver le plus simple !

1.5.2 Exemple
1 $ ll -R
2 .:
3 total 8
4 drwxr - xr - x 4 jules . aubert teachers 4096 Sep 3 19:42 folder1
5
6 ./ folder1 :
7 -rw -r - -r - - 1 jules . aubert teachers 69 Sep 3 19:42 folder1f1
8 --w - - - - - - - 1 jules . aubert teachers 64 Sep 3 19:42 folder1f2
9 drwxr - xr - x 4 jules . aubert teachers 4096 Sep 3 19:42 folder2 -1
10 drwxr - xr - x 4 jules . aubert teachers 4096 Sep 3 19:42 folder2 -2
11
12 ./ folder1 / folder2 -1:
13 total 0
14 -rw -r - -r - - 1 jules . aubert teachers 512 Sep 3 19:42 folder -1 -1 f1
15
16 ./ folder1 / folder2 -2:
17 total 0
18 -rw -r - -r - - 1 jules . aubert teachers 1024 Sep 3 19:42 folder2 -2 - f1
19 $ ./ readable . sh .
20 ./ folder1 / foldeer1f1
21 ./ folder1 / foldeer2 -1/ folder2 -1 - f1
22 ./ folder1 / foldeer2 -2/ folder2 -2 - f1
23 ./ readable . sh
24 echo $ ?
25 0

1.6 Dectobin
— Fichier : dectobin.sh
— Répertoire source : src/ex6
— Commandes autorisées : les builtins, grep, sed, wc, tr, head ,tail,cat,cut,expr,stat,find

1.6.1 But
Le but de cet exercice est de convertir l’argument en base 10 vers la base 2. Si tout se passe bien, le script retourne 0.
Sinon, il retourne 1.

1.6.2 Exemple
1 $ ./ dectobin . sh 42
2 101010
3 $ echo $ ?
4 0
5 $ ./ dectobin . sh
6 $ echo $ ?
7 1

7
Le cas où l’argument n’est pas un entier valide et positif ne sera pas testé.
1.7 Mypar
— Fichier : my_par.sh
— Répertoire source : src/ex7
— Commandes autorisées : les builtins, grep, sed, wc, tr, head ,tail,cat,cut,expr,stat,find

1.7.1 But
Le but de cet exercice est de réécrire un outil pour couper un fichier en plusieurs sous-fichiers, dans le même répertoire. Tu
dois écrire un script shell qui prend deux arguments :
— Le nom du fichier à couper ;
— La taille de chaque fichier résultant (en octets), il doit être supérieur ou égal à 1.
Le script doit créer les fichiers file.ext.1, file.ext.2, file.ext.3, etc. correspondants au fichier d’entrée.coupé en utilisant la
taille du second argument, excepté pour le dernier fagment qui sera probalement plus petit.

Si tout s’exécute bien, le script retourne 0, 1 sinon.

1.7.2 Exemple
1 $ head -c 10000 / dev / urandom > bigfile . in
2 $ ./ my_par . sh bigfile . in 1024
3 $ echo $ ?
4 0
5 $ ls -l bigfile . in .*
6 -rw -r - -r - - 1 root root 1024 2019 -06 -06 03:12 bigfile . in .1
7 -rw -r - -r - - 1 root root 784 2019 -06 -06 03:12 bigfile . in .10
8 -rw -r - -r - - 1 root root 1024 2019 -06 -06 03:12 bigfile . in .2
9 -rw -r - -r - - 1 root root 1024 2019 -06 -06 03:12 bigfile . in .3
10 -rw -r - -r - - 1 root root 1024 2019 -06 -06 03:12 bigfile . in .4
11 -rw -r - -r - - 1 root root 1024 2019 -06 -06 03:12 bigfile . in .5
12 -rw -r - -r - - 1 root root 1024 2019 -06 -06 03:12 bigfile . in .6
13 -rw -r - -r - - 1 root root 1024 2019 -06 -06 03:12 bigfile . in .7
14 -rw -r - -r - - 1 root root 1024 2019 -06 -06 03:12 bigfile . in .8
15 -rw -r - -r - - 1 root root 1024 2019 -06 -06 03:12 bigfile . in .9
16 $ cat bigfile . bin .1 bigfile . bin .2 bigfile . bin .3 bigfile . bin .4 bigfile . bin .5 bigfile . bin .6 bigfile . bin .7 bigfile . bin .8
bigfile . bin .9 bigfile . bin .10 > out . bin
17 $ cmp bigfile . in out . bin
18 $ echo $ ?
19 0
20 $ ./ my_par . sh bigfile . in 0
21 $ echo$ ?
22 1

Pour information, il existe une commande split qui exécute plus ou moins cette action. Si tu es curieux, lis le man.
1.8 La tour, prends garde !
— Fichier : tower.sh
— Répertoire source : src/ex9
— Commandes autorisées : les builtins, grep, sed, wc, tr, head ,tail,cat,cut,expr,stat,find

1.8.1 But
Votre script doit desisner une tour en ASCII-art. Le script prend en argument le nombre d’étages et le type de fenêtres. Le
reste du dessin doit être strictement identique aux exemples qui suivent. Le type de fenêtre est soit square soit triangle.

Valeurs de retour :
— Pas d’erreur : 0
— Sinon : 1
Obscervation :
— Si les arguments ne sont pas corrects, le script ne doit rien afficher et retourner la valeur 1.
— Tu dois faire attention à ne pas afficher des espaces inutiles.
— A nombre négatif d’étage et considéré comme une erreur.

1.8.2 Exemple

8
1 $ ./ tower 2 square
2 _ _ _ _ _ _ __ ___ __ ___ _
3 | ___ ___ |
4 | |_|_| |_|_| |
5 | |_|_| |_|_| |
6 | |
7 | |
8 | ___ ___ |
9 | |_|_| |_|_| |
10 | |_|_| |_|_| |
11 | |
12 | |
13 | _ |
14 | | | |
15 | | | |
16 | _______ | | _______ |
17 $ echo $ ?
18 0
19 $ ./ tower . sh 1 triangle
20 _ _ _ _ _ _ __ ___ __ ___ _
21 | |
22 | /\ /\ |
23 | / __ \ / __ \ |
24 | |
25 | |
26 | _ |
27 | | | |
28 | | | |
29 | _______ | | _______ |
30 $ ./ tower . sh 0 triangle
31 _ _ _ _ _ _ __ ___ __ ___ _
32 | _ |
33 | | | |
34 | | | |
35 | _______ | | _______ |
36 $ ./ tower . sh 3 rectangle
37 $ echo $ ?
38 1
39 $ ./ tower . sh -42 triangle
40 $ echo $ ?
41 1

Vous aimerez peut-être aussi