Exercices script UNIX : commandes, fonctions et structures de contrôle

1- Exercices script unix - fonctions - structures de contrôle (if, for...)

Exercice 1 : fonctions

  1. Ecrire une fonction nbArg qui affiche son nombre d'arguments et "pas d'arguments" si elle a été appelé sans paramètre
  2. 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.
  3. é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, ...)

  1. écrire un script shell qui indique pour chaque fichier du dossier courant si c'est un dossier, un fichier ordinaire ou autre chose.
  2. é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
  3. 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
  4. é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

1. écrire un script dateNom qui retourne la date courante et le login de l'utilisateur: "nous sommes le date et vous êtes login"
2. On considère le script test.sh suivant :
1
2

#! /bin/sh
echo $
testez le :
test.sh
test.sh salut les tepos
remplacez $1 par $2 et recommencez vos tests.
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 )

  1. Changez les droits d'un fichier fic1 pour que tous ceux de votre groupe puissent écrire dedans.
  2. 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--).
  3. 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.
  4. 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.
  5. Quelle option permet de modifier récursivement les droits d'un répertoire et des fichiers qu'il contient ?
  6. Quelle option de mkdir permet de créer un répertoire en spécifiant les droits sur ce répertoire ?
  7. Affichez et interprétez les droits de /usr/sbin/mount.

Correction : Exercice sur la commande chmod ( les droits Unix )

  1. chmod g+w fic1
    
  2. chmod uog+x script
    
  3. chmod u-wx toto
    
  4. chmod og+wx toto
    
  5. C'est l'option -R. Par exemple, pour interdire tous les droits aux fichiers présents dans une branche du répertoire confidentiel, on peut faire :

    chmod -R og-rwx confidentiel
    
  6. 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
    
  7. 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
Linux hector 2.6.15-27-386 #1 PREEMPT Fri Dec 8 17:51:56 UTC 2006 i686 GNU/Linux

Quelle est la distribution installée?

cat /etc/issue
Ubuntu 6.06.1 LTS \n \l

Quels sont les utilisateurs en cours du système?

who
nico :0 2007-01-14 16:25

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.
Quelles sont les commandes susceptibles d'être documentées dans man?

man man
man is the systems manual pager. Each page argument given to man is normally the name of a program, utility or function.

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 :

  1. A quoi servent ces fonctions ?
  2. 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 :

  1. Compter le total des lignes des fichiers dans /etc
  2. Compter le nombre de lignes contenant 25 dans /etc/services
  3. Trier le fichier /etc/hosts
  4. 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.

  1. Affichez uniquement la ligne vous concernant.
  2. Affichez uniquement les login de tous les utilisateurs triés.
  3. Affichez les correspondances login, numéro d'utilisateur (UID), nom réel.
  4. Affichez les utilisateurs, leur groupe et leur nom complet.
  5. 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.
  6. Puis n'affichez plus que le nom complet des utilisateurs du groupe 30.
  7. Combien y'en a-t-il ?
  8. Triez le résultat.
  9. 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 :

id 1118

1 - Dans quel répertoire vous trouvez-vous quand vous vous loguez ?
2 - Allez directement dans ~/Rapport/docs/afaire/.
3 - De là, passez dans ~/Rapport/docs/fait/.
4 - Revenez dans ~/Rapport/.
5 - Sans changer de répertoire, regardez avec less le contenu de ~/www/index.html.
6 - Passez dans ~/Rapport/docs/.
7 - En restant là où vous êtes, affichez les droits de ~/Mail/
8 - Revenez dans votre répertoire principal.
9 - Que se passe-t-il si vous vous déloguez alors que vous n'êtes pas dans votre répertoire principal ?

Correction : Exercice sur la commande cd

  1. Vous vous trouvez dans votre répertoire personnel, dans ~ (tilde).

  2. Taper

    cd Rapport/docs/afaire
    
  3. cd ../fait
    
  4. Taper

    cd ../..
    

    ou

    cd ~/Rapport
    
  5. Il faut taper

    less ~/www/index.html
    

    ou

    less ../www/index.html
    
  6. cd docs/
    
  7. 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 de ls :

    bireme ~ $ ls -ld Mail
    drwx------ 2 toto  litt98 512 Apr  2 19:02 /users/98/litt/toto/Mail/
    
  8. Taper cd, sans arguments.

  9. 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.