Exercices script UNIX : commandes, fonctions et structures de contrôle
Rédigé par GC Team, Publié le 28 Février 2010, Mise à jour le Mardi, 10 Août 2021 21:541- Exercices script unix - fonctions - structures de contrôle (if, for...)
Exercice 1 : fonctions
- Ecrire une fonction nbArg qui affiche son nombre d'arguments et "pas d'arguments" si elle a été appelé sans paramètre
- Ecrire une fonction existeFichier qui indique si le fichier qui lui est passé en argument existe. Le code de retour de la fonction vaudra 0 si c'est le cas.
- écrire une fonction estFichierOrdinaire ayant un nom de fichier en argument et qui indique si ce fichier est un fichier ordinaire : le code de retour de la fonction vaudra 0 si c'est le cas, 1 si le fichier existe mais n'est pas un fichier ordinaire et 2 sinon.
Exercice 2 : structures de contrôle (if, for, ...)
- écrire un script shell qui indique pour chaque fichier du dossier courant si c'est un dossier, un fichier ordinaire ou autre chose.
- écrire un script qui crée une copie de sauvegarde de chaque fichier ordinaire : la copie de sauvegarde sera dans le dossier courant et son nom sera le nom du fichier auquel on aura ajouté ".bak". Ainsi, la copie de sauvegarde du fichier toto.txt sera toto.txt.bak
- modifier votre script de façon à 1) ce qu'on puisse lui passer en argument le dossier sur lequel agir et 2) ce qu'il agisse récursivement sur les dossier présents dans ce dossier
- écrire un script sommeTaille1.sh qui affiche la taille des fichiers ordinaires dont les noms lui sont passés en paramètre puis la somme des tailles des fichiers. Exemple: "sommeTaille1.sh f1 f2 test" retourne des tailles des fichiers ordinaires f1, f2 et test puis leur somme.
2- Exercice TP script unix gestion d'un répertoire téléphonique
Un répertoire est un fichier contenant des lignes de la forme: nom,prénom,num tel, ville
Notre but est d'écrire un programme ( script ) de gestion de répertoire permettant de consulter le répertoire ou d'y ajouter des entrées.
- écrire une fonction qui affiche les lignes reçues sur son entrée standard sous la forme: nom: le nom, prénom: le prénom, ... avec une information par ligne.
- utilisez là dans un script qui affiche l'intégralité du fichier
- ajouter à votre fonction les paramètres -aff-nom, -aff-prenom, -aff-tel et -aff-ville qui indiquent quelle information afficher.
- utilisez là dans un script réalisant le même travail et qui admettra les options suivantes :
- -aff-nom
- -aff-prénom
- -aff-tel
- -aff-ville
- on souhaite pouvoir sauvegarder l'affichage dans un fichier. Ajouter une option -o ayant un nom de fichier f comme argument qui provoque la sauvegarde de ce qui est affiché dans le fichier f
- ajouter à votre programme une gestion des signaux de façon à permettre un effacement des éventuels fichier temporaire ou de fichier de sortie incomplets avant la mort du script
- On souhaite ajouter des fonctionnalités de recherche à notre script :
- recherche par nom, prénom, num tel, ville sélectionnées par les options --nom, --prenom, --tel, --ville. Toute combinaison de ces options doit pouvoir être utilisée.
Exemple : repertoire.sh -aff-nom -aff-prenom -aff-tel -ch-nom PETIT -ch-prenom Pascal
3- Exercices Unix sur les filtres
Exercice 1
Copiez le fichier /etc/passwd dans votre home directory. Editez uniquement les champs contenant le login et la home directory.
Exercice 2
Triez passwd sur le nom
Exercice 3
Extraire les nom de login et UID puis triez suivant les UID, le tout en une seule commande, vous redirigerez le tout vers un fichier
Exercice 4
Dans le fichier de résultat précédent remplacer les ":" par des " " (espace).
Exercice 5
Editez les cinq dernières lignes du fichier.
Exercice 6
Editez les cinq premiers caractères du fichier.
Correction : Exercices Unix sur les filtres
Exercice 1
cd | |
cp /etc/passwd ~ | |
cut -d: -f1,6 passwd |
Exercice 2
sort -t: +0 -1 passwd
Exercice 3
cut -d: -f1,3 passwd | sort -t: -n +1 -2 > lefichier
Exercice 4
cat lefichier | tr ":" " " > lefichier
Nota:
On aurait pu avoir le même résultat en une seule commande:
cut -d: -f1,3 | sort -t: -n +1 -2 | tr ":" " " > lefichier
Exercice 5
tail -5 lefichier
Exercice 6
head -5c lefichier
4- Exercices sur les critères des noms de fichiers UNIX
Exercice 1 :
Dans votre répertoire courant, créez en une commande les fichiers suivants:
annee1 Annee2 annee4 annee45 annee41 annee510 annee_saucisse banane
Exercice 2 :
Créer le répertoire Year dans votre répertoire courant, en une commande déplacez les fichiers précédemment créés dans le répertoire Year.
Exercice 3 :
Lister tous les fichiers | se terminant par 5 | |
commençant par annee4 | ||
commençant par annee4 et de 7 lettres maximum | ||
commençant par annee avec aucun chiffre numérique | ||
contenant la chaîne ana | ||
commençant par a ou A |
Exercice 4 :
Copier les fichiers dont l'avant dernier caractère est un 4 ou 1 dans le répertoire /tmp en une seule commande.
Correction : Exercices sur les critères des noms de fichiers UNIX
Exercice 1 :
touch annee1 Annee2 annee4 annee45 annee41 annee415 annee_saucisse annee_banane
Exercice 2 :
mv [aA]nnee* ./Year
Exercice 3 :
ls *5 |
ls annee4* |
ls annee4? |
ls annee[!0-9]* |
ls *ana* |
ls [aA]* |
Exercice 4 :
cp *[41]? /tmp
5- Exercices unix scripts shells - inititiation aux variables d'environnement.-
Premiers scripts shells
2. On considère le script test.sh suivant :
1 |
#! /bin/sh |
testez le :
test.sh salut les tepos
remplacez $2 par $* puis par $#
Expliquez.
3. On travaille avec le fichier adresses.txt. Ecrire un script noTel.sh ayant comme argument un nom et un prénom qui retourne le numéro de téléphone de la première personne. du fichier ayant ce nom et ce prénom.
4. modifiez votre script de façon à ce qu'il indique "non trouvé" s'il n'y a personne ayant ce nom et prénom dans le fichier adresses.txt (remarque: consultez la page de manuel de la commande grep et regardez les codes de retour).
5. Ecrire un script coordonnees.sh ayant un nom et un prénom comme argument qui indique les coordonnées de la première personne ayant ce nom et ce prénom . L'affichage se fera sous la forme : "prenom NOM habite nomVille (codePostal) et a comme No de tel: numeroTel". Le nom de la personne sera en majuscule.
6- Exercice sur la commande chmod ( les droits Unix )
- Changez les droits d'un fichier fic1 pour que tous ceux de votre groupe puissent écrire dedans.
- Donnez en une seule ligne le droit d'exécution à tous les utilisateurs d'un fichier script qui n'a jusqu'alors que des droits standards (-rw-r--r--).
- Le fichier toto a les droits suivants : -rwxr--r--. Modifiez-en les droits en une ligne de commande de sorte que le propriétaire n'ait plus que le droit de lecture.
- Modifier les droits du fichier toto (-rwxr--r--) de sorte que le groupe et les autres utilisateurs aient les mêmes droits que le propriétaire.
- Quelle option permet de modifier récursivement les droits d'un répertoire et des fichiers qu'il contient ?
- Quelle option de mkdir permet de créer un répertoire en spécifiant les droits sur ce répertoire ?
- Affichez et interprétez les droits de /usr/sbin/mount.
Correction : Exercice sur la commande chmod ( les droits Unix )
-
chmod g+w fic1
-
chmod uog+x script
-
chmod u-wx toto
-
chmod og+wx toto
-
C'est l'option
-R
. Par exemple, pour interdire tous les droits aux fichiers présents dans une branche du répertoireconfidentiel
, on peut faire :chmod -R og-rwx confidentiel
-
C'est l'option
-m
qui permet de le faire. Par exemple, pour créer un répertoire en lecture interdite aux autres :mkdir -m og-r repertoire
-
bireme ~ $ ll /usr/sbin/mount -r-xr-xr-x 1 root bin 27208 Jan 9 2000 /usr/sbin/mount*
Il s'agit d'un fichier éxécutable par tout utilisateur.
Auteur : Joël Riou.
7- Exercice de jointure sous UNIX la commande join
Soient tele un fichier qui contient le répertoire téléphonique suivant :
Boileau 024867-6235
Derrick 024867-1842
Ernest 024867-1234
Grand 024867-2240
Herbrant 024867-0256
Jonathan 024867-7358
Louis 024867-3237
Tardif 024867-5341
Wagner 024867-1234
Et noms la liste suivante des noms et départements correspondants :
Ernest Dept. 389
Frolo Dept. 217
Grand Dept. 311
Tardif Dept. 454
Wagner Dept. 520
Construire un fichier NTD (nom, téléphone, département) où chaque ligne est un nom suivi du numéro de téléphone puis du numéro de département. Comment faire pour avoir tous les noms dans le fichier NTD ? Comment obtenir un fichier DNT où chaque ligne est composée (dans cet ordre) du numéro de département, du nom et du numéro de téléphone ? Soit numeros le fichier des numéros de téléphones :
024867-0256
024867-1234
024867-5555
024867-7358
Sélectionner du fichier tele les lignes où figurent les numéros du fichier ci-dessus.
Correction : Exercice de jointure sous UNIX la commande join
join tele noms > NDT
Pour avoir toutes les lignes des deux fichiers en sorties (même celles qui ne font pas partie de la jointure) :
join -a1 -a2 tele noms > NDT
join -a1 -a2 -o 2.3,0,1.2 tele noms > DNT
-o 2.3,0,1.2 pour avoir en sortie le champ 3 du deuxième fichier (2.3), le champ jointure en ne prenant que l'union (0) et le champ 2 du premier fichier.
Enfin, pour joindre le fichier tele et le fichiers numeros, il faut d'abord trier tele selon le champ de jointure (ici les numéros de tétéphone) :
sort -k 2 tele | join -1 2 -2 1 - numeros
La jointure est faite sur le champ 2 du premier fichier (-1 2) et le champ 1 du deuxième fichier (-2 1). Le symbole - représente la sortie du sort.
8- Exercice linux - informations système - commande man
Informations système
- Quel est le système installé?
- Quelle est la distribution installée?
- Quels sont les utilisateurs en cours du système?
- Ouvrir un nouveau terminal en utilisant un autre compte.
- Fermer ce terminal.
La commande man
- Tester la commande man pour obtenir de l'aide sur man.
Quelles sont les commandes susceptibles d'être documentées dans man?
Correction : Exercice linux - informations système - commande man
Infos système
Quel est le système installé? |
uname -a |
Quelle est la distribution installée? |
cat /etc/issue |
Quels sont les utilisateurs en cours du système? |
who |
Ouvrir un nouveau terminal en utilisant un autre compte. |
su user |
Fermer ce terminal. |
exit |
La commande man
Tester la commande man pour obtenir de l'aide sur man. |
man man |
9- Exercices unix - Filtres usuels - utilisation avancés des pipes
Exercice 1 : Filtres usuels et pipes
On a la possibilité de rediriger l'entrée et la sortie standard, non plus vers un fichier, mais vers un autre programme. Les programmes conçus pour être utilisés de cette manière sont appelés filtres. Nous en avons vu quelques-uns (cat, grep qui peut être utilisé comme un filtre). Pour effectuer la redirection, on utilisera un pipe noté |. Par exemple, la ligne cat /etc/services | grep 25 | more permet d'afficher toutes les lignes de /etc/services contenant le mot 25.
Lisez les pages de man des commandes wc, sort, cat, uniq et répondez aux questions suivantes :
- A quoi servent ces fonctions ?
- Que doit on faire avant d'utiliser uniq ?
Quelles sont les enchaînements de commandes (une seule ligne) nécessaires pour effectuer les opérations suivantes :
- Compter le total des lignes des fichiers dans /etc
- Compter le nombre de lignes contenant 25 dans /etc/services
- Trier le fichier /etc/hosts
- Afficher le nombre de fichiers n'appartenant pas à root dans /etc.
Exercice 2 : Utilisation avancés des pipes
On utilisera la commande cut -f champs -d séparateur pour découper un fichier en colonne selon des séparateurs. Par exemple cut -f 1-3,5 -d : /etc/passwd donne les commandes 1 à 3, puis 5 du fichier passwd où le séparateur est :
Pour les questions suivantes, trouvez la ligne de commande permettant de faire l'opération voulue. Pour afficher les informations sur les utilisateurs (fichier passwd réseau), il faut faire ypcat passwd.
- Affichez uniquement la ligne vous concernant.
- Affichez uniquement les login de tous les utilisateurs triés.
- Affichez les correspondances login, numéro d'utilisateur (UID), nom réel.
- Affichez les utilisateurs, leur groupe et leur nom complet.
- Sachant que le groupe enseignement est le numéro 30, en utilisant le résultat de la commande précédente, affichez le nom des utilisateurs du groupe 30 et leur groupe.
- Puis n'affichez plus que le nom complet des utilisateurs du groupe 30.
- Combien y'en a-t-il ?
- Triez le résultat.
- Est-ce qu'il y a des doublons ? Indice : utilisez uniq -c puis un grep -v.
10- Exercice sur la commande cd
But de l'exercice : apprendre à se servir de .
et ..
(«point» et «point point»). Supposons que vous avez l'arborescence suivante chez vous :
Correction : Exercice sur la commande cd
-
Vous vous trouvez dans votre répertoire personnel, dans
~
(tilde). -
Taper
cd Rapport/docs/afaire
-
cd ../fait
-
Taper
cd ../..
ou
cd ~/Rapport
-
Il faut taper
less ~/www/index.html
ou
less ../www/index.html
-
cd docs/
-
Il y a un petit piège dans cette question. En effet, si vous tapez
ls -l Mail/
vous allez obtenir le contenu du répertoire
Mail/
, mais pas le statut du répertoire lui-même. Il faut donc utiliser l'option-d
dels
:bireme ~ $ ls -ld Mail drwx------ 2 toto litt98 512 Apr 2 19:02 /users/98/litt/toto/Mail/
-
Taper
cd
, sans arguments. -
Strictement rien ! Ça n'a aucune importance.
Auteur : Émilia Robin, Joël Riou. Dernière modification : Sat Sep 20 11:11:58 2003 +0000 par Joël Riou.