Prochaine révision | Révision précédente |
tp1 [2019/01/14 08:38] – created gilles | tp1 [2023/09/25 13:59] (Version actuelle) – [Q.1 - Quelques manipulations] gilles |
---|
===== Durée ===== | ===== Durée ===== |
| |
4 heures | 2 heures |
| |
---- | ---- |
| |
Le but de ce TP est d'illustrer les principes vus en cours et en TD au travers d'un certains nombre d'exercices. Vous travaillerez dans un répertoire de votre compte nommé ''se1/tp1''. | Le but de ce TP est d'illustrer les principes vus en cours et en TD au travers d'un certains nombre d'exercices. Vous travaillerez dans un répertoire de votre compte nommé ''se1/tp-introduction''. |
| |
---- | Pour mémoire un Shell-Script est un fichier texte qui est exécutable (i.e. dont les droits sont correctement positionnés) Ce fichier texte est une succession de commandes ''bash'' - **une commande par ligne** - qui peuvent s'exécuter par lots. Par convention, la première ligne d'un Shell-Script sera : ''#!/bin/bash''. Cette ligne s'appelle le ''shebang'' et spécifie, pour certains systèmes d'exploitation, l'interpréteur qui doit exécuter le code se trouvant en dessous. Vous retrouverez cette technique dans de nombreux langages tels que ''Perl'', ''Python'', etc. |
| |
* Ecrivez un //shell-script// nommé ''hello.sh'' qui affiche "bonjour" | Ainsi pour répondre à la question : |
* **Keys** : ''bash'', ''echo'', ''chmod'' <code bash>Exemple: | |
| * Ecrivez un //shell-script// nommé ''hello.sh'' qui affiche ''bonjour'' |
| * **Keys** : ''bash'', ''echo'', ''chmod'' |
| |
| tel que l'on obtienne : |
| |
| <code bash>Exemple: |
$> ./hello.sh | $> ./hello.sh |
bonjour | bonjour |
$> </code> | $> </code> |
| |
| * Ouvrez un éditeur |
| * Saisissez le code suivant : |
| |
| <code bash> |
| #!/bin/bash |
| echo 'bonjour' |
| </code> |
| |
| * Sauvegardez sous le nom ''hello.sh'' |
| * donnez les droits d'exécution en tapant la commande : ''chmod u+x ./hello.sh'' |
| * exécutez le script par la commande : ''./hello.sh'' |
| |
---- | ---- |
| |
* Quelques manipulations | ===== Q.1 - Quelques manipulations ===== |
* L'affectation de variable en shell-script doit se faire de la façon suivante ''v=valeur'' (**Attention** : jamais d'espace à gauche et à droite de l'espace). Sur la ligne de commande, tapez ''v=6''. Validez. Tapez ''echo $v''. Vous avez en votre possession l'outil d'affectation et de déréférencement d'une variable en ''bash''. | |
* tapez maintenant ''echo 5 > mavaleur5'', validez, puis ''cat mavaleur5''. Que constatez-vous ? | * L'affectation de variable en shell-script doit se faire de la façon suivante ''v=valeur'' (**Attention** : jamais d'espace à gauche et à droite du caractère ''=''). Sur la ligne de commande, tapez ''v=6''. Validez. Tapez ''echo $v''. Vous avez en votre possession l'outil d'affectation et de déréférencement d'une variable en ''bash''. |
| * tapez maintenant ''echo 5 > mavaleur5'', validez |
| * tapez ''ls mavaleur5''. Validez. Que constatez-vous ? |
| * tapez ''cat mavaleur5''. Que constatez-vous ? |
* si vous tapez ''echo $v'', vous devez toujours constater l'affichage de ''6'' sur la sortie standard. Tapez ''v=`cat mavaleur5`'' puis ''echo $v''. Que constatez-vous ? | * si vous tapez ''echo $v'', vous devez toujours constater l'affichage de ''6'' sur la sortie standard. Tapez ''v=`cat mavaleur5`'' puis ''echo $v''. Que constatez-vous ? |
* tapez maintenant ''echo 6 > > mavaleur5'', validez, puis ''cat mavaleur5''. Que constatez-vous ? | * tapez maintenant ''echo 6 > > mavaleur5'', validez, puis ''cat mavaleur5''. Que constatez-vous ? |
* Tapez ''v=`cat mavaleur5`'' puis ''echo $v''. Que constatez-vous ? | * Tapez ''v=`cat mavaleur5`'' puis ''echo $v''. Que constatez-vous ? |
| |
| Avec l'ensemble de ces commandes vous venez d'apprendre différentes façons d'affecter une variable ''bash'' et d'accéder à son contenu. |
| |
---- | ---- |
| |
| * Tout au long de ce TP vous devrez utiliser les ''manpages'' comme élément de documentation de référence. Ainsi, la commande ''man bash'' vous fournit une documentation exhaustive du shell de commandes ''bash''. Cette documentation vous permettra de prendre connaissance de toutes les subtilités du langage de script ''bash''. Cette documentation est dans le document fournit {{ :bash.pdf |ici}}. Pour les questions suivantes, vous devez vous renseigner sur les variables d'environnement ''$#'', ''$0'', ''$1'', ''$2'', ''$?'', etc. |
| |
| ===== Q.2 - manipulation d'un paramètre ===== |
| |
* Ecrivez un //shell-script// nommé ''check-arg.sh'' qui vérifie qu'il a un argument passé en paramètre et que cet argument est un fichier régulier. Votre script s'échappera avec une erreur égale à ''1'' (et ''0'' sinon) si l'argument est un fichier inexistant, ou s'il ne s'agit pas d'un fichier régulier. | * Ecrivez un //shell-script// nommé ''check-arg.sh'' qui vérifie qu'il a un argument passé en paramètre et que cet argument est un fichier régulier. Votre script s'échappera avec une erreur égale à ''1'' (et ''0'' sinon) si l'argument est un fichier inexistant, ou s'il ne s'agit pas d'un fichier régulier. |
* **Keys** : ''$#'', ''$0'', ''$1'', ''test'', ''if'', ''[ ... ]'', ''...''<code bash>Exemple: | * **Keys** : ''$#'', ''$0'', ''$1'', ''test'', ''if'', ''[ ... ]'', ''...'' |
| |
| <code bash>Exemple: |
$> ./check-args.sh | $> ./check-args.sh |
vous n'avez pas passé de paramètre ! | vous n\'avez pas passé de paramètre ! |
$> ./check-args.sh fsdfdf | $> ./check-args.sh fsdfdf |
fsdfdf n'existe pas ou n'est pas un fichier régulier | fsdfdf n\'existe pas ou n\'est pas un fichier régulier |
$> ./check-args.sh /etc/hosts | $> ./check-args.sh /etc/hosts |
/etc/hosts existe, c'est un fichier régulier | /etc/hosts existe, c\'est un fichier régulier |
$> </code> | $> </code> |
| |
---- | ---- |
| |
* A partir de ''check-arg.sh'', construisez ''check-multiple-args.sh'' afin qu'il réalise le même traitement en admettant un nombre multiple de paramètres. Vous sortirez avec la valeur ''1'' si au moins un des fichier passé en argument n'est pas régulier et ''0'' sinon. | ===== Q.3 - Manipulation de plusieurs paramètres ===== |
* **Keys** : ''while'', ''$0'', ''$1'', ''test'', ''shift'', ''let'', ''...''<code bash>Exemple: | |
| * A partir de ''check-arg.sh'', construisez ''check-multiple-args.sh'' afin qu'il réalise le même traitement en admettant un nombre multiple de paramètres. Vous sortirez avec la valeur ''1'' si au moins un des fichier passé en argument n'est pas régulier et ''0'' sinon. Pour ce faire, veuillez vous renseigner sur la nature de la variable ''$?'' et sur la commande ''exit''. |
| * **Keys** : ''while'', ''$0'', ''$1'', ''test'', ''shift'', ''let'', ''...'' |
| |
| <code bash>Exemple: |
$> ./check-multiple-args.sh | $> ./check-multiple-args.sh |
vous n'avez pas passé de paramètre ! | vous n\'avez pas passé de paramètre ! |
$> ./check-multiple-args.sh fsdfdf /etc/hosts check-args.sh | $> ./check-multiple-args.sh fsdfdf /etc/hosts check-args.sh |
fsdfdf n'existe pas ou n'est pas un fichier régulier | fsdfdf n\'existe pas ou n\'est pas un fichier régulier |
/etc/hosts existe, c'est un fichier régulier | /etc/hosts existe, c\'est un fichier régulier |
check-args.sh existe, c'est un fichier régulier | check-args.sh existe, c\'est un fichier régulier |
$> </code> | $> </code> |
| |
* Créez un dossier ''test''. Dans ''test'', créez des fichiers textes (vides ou non) nommés ''file1.txt'', ''file deux.txt'' et ''fichier numero 3.txt''. Testez (et debuggez le cas échéant) votre script ''check-multiple-args.sh'' avec ces fichiers en arguments. | * Créez un dossier ''test''. Dans ''test'', créez des fichiers textes (vides ou non) nommés ''file1.txt'', ''file deux.txt'' et ''fichier numero 3.txt''. Testez (et debuggez le cas échéant) votre script ''check-multiple-args.sh'' avec ces fichiers en arguments. |
* **Keys** : ''touch'', ''...'' | * **Keys** : ''touch'', ''...'' |
| |
---- | ---- |
| |
| ===== Q.4 - Manipulation des paramètres ayant une nature numérique ===== |
| |
* Ecrire un shell-script admettant un nombre variable de nombres en paramètre et affichant le plus petit d’entre eux | * Ecrire un shell-script admettant un nombre variable de nombres en paramètre et affichant le plus petit d’entre eux |
| * **Keys** : ''test'', ''expr'', ''if ... then ... else ... fi'', ''...'' |
| |
---- | ---- |
| |
| ===== Q.5 - Instructions répétitives ===== |
| |
* Ecrire un shell-script, créant dans le dossier courant s’il n’existe pas déjà, un répertoire dont le nom est passé en premier argument. Il créera dans ce dossier 10 fichiers nommés « ''Un'' » à « ''Dix'' » contenant respectivement « ''file Un'' » à « ''file Dix'' » | * Ecrire un shell-script, créant dans le dossier courant s’il n’existe pas déjà, un répertoire dont le nom est passé en premier argument. Il créera dans ce dossier 10 fichiers nommés « ''Un'' » à « ''Dix'' » contenant respectivement « ''file Un'' » à « ''file Dix'' » |
---- | ---- |
| |
* Ecrire un script nommé ''table.sh'' permettant l’affichage des 15 premières lignes de la table de multiplication d’un nombre ''n'' passé en paramètre. | |
| |
---- | ===== Q.6 - Récapitulatif des bases ===== |
| |
* Complétez et exécutez le script suivant (que vous nommerez ''get-line.sh'') | * Complétez et exécutez le script suivant (que vous nommerez ''get-line.sh'') |
| |
## --- a compléter : réaliser l'affectation de la variable 'l' a la valeur | ## --- a compléter : réaliser l'affectation de la variable 'l' a la valeur |
## --- correspondant au nombre de lignes contenues dans le fichier passé en parametre | ## --- correspondant au nombre de lignes contenues dans le fichier passé en paramètre |
| |
echo "nombre de ligne dans $1 : $l" | echo "nombre de ligne dans $1 : $l" |
</code> | </code> |
| |
| |
---- | ---- |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
===== construction d'un splitter de fichiers ===== | |
| |
| |
---- | |
| |
* A l'aide de la commande ''wc'' et des commandes ''head'' et ''tail'', proposez un script ''split-2.sh'' qui permet la division d'un fichier texte passé en paramètre en deux parties de taille égales (le plus possible au moins). Le nom du fichier texte a diviser sera passé en paramètre (y compris avec une arborescence). Le préfixe des fichiers issus de la division sera le nom du fichier source. Les extensions des deux fichiers seront respectivement ''.sp1'' et ''.sp2'' | |
* **Keys** : ''head'', ''tail'', ''cat'', ''wc'', ''dirname'', ''basename'' | |
| |
---- | |
| |
* Construisez la commande ''group-2.sh'' permettant la reconstruction à partir des fichiers issus de ''split-2.sh''. Le script ''group-2.sh'' admet un seul paramètre : le préfixe des fichiers constituant la source. | |
* **Keys** : ''head'', ''cat'', redirection de ''stdout'' | |
| |
---- | |
| |
* ''uuencode/uudecode'' | |
* ''uuencode [fichier] nom'' : est utilisé pour encoder un fichier en n’utilisant que des caractères ''ASCII'' 7 bits (codes entre 0 et 127), par exemple pour le transmettre sur un réseau ne transmettant que les 7 bits de poids faible. ''uuencode'' lit le fichier (ou ''stdin'' si l’on ne précise pas de nom) et écrit la version encodée sur la sortie standard ''stdout''. Le paramètre ''nom'' précise le nom du fichier pour le décodage par ''uudecode''. | |
* ''uudecode [fichier]'' : Décode un fichier encodé par ''uuencode''. Si l’argument fichier n’est pas spécifié, ''uudecode'' lit ''stdin''. Le nom du fichier résultat est précisé dans le codage (paramètre ''nom'' de ''uuencode''). | |
* Afin de vous exercer, réalisez un uuencodage d'un fichier de votre choix. Choisissez par exemple le fichier ''vi-ref.pdf'' disponible en annexe de la page du module de système d'exploitation. | |
* On souhaite maintenant traiter les fichiers de nature binaire en plus des fichiers ''ASCII''. Utilisez ''uuencode'' et ''uudecode'' pour adapter ''split-2.sh'' dans ce but. Modifiez ''group-2.sh'' en conséquence. | |
* **Keys** : ''uuencode'', ''uudecode'', ''head'', ''tail'', ''cat'', ''wc'' | |
- A partir de ''split-2.sh'' et ''group-2.sh'', construisez ''splitter.sh''. ''splitter.sh'' admettra un paramètre supplémentaire indiquant un nombre variable de parties issues de la division. La division devra se faire à part égales. Lorsque ce paramètre ne sera pas un nombre mais l'option ''-d'' ou ''-g'', ''splitter.sh'' procède à la reconstruction du fichier qui lui est passé en paramètre (qui est un préfixe dans ce cas). | |
* **Keys** : ''uuencode'', ''uudecode'', ''wc'', ''cat'', ''let'', redirection de ''stdout'' | |
| |
| |
---- | |
| |