Exercices programmation shell

1 - Faites deux scripts qui vous disent bonjour en affichant votre login («Bonjour, toto») :
            - Quand vous tapez saluer [votre-login]
            - Quand vous tapez juste saluer
Il faut éditer un fichier saluer et le rendre ensuite éxécutable :
123#!/bin/shif [ -n "$1" ]; then LOGIN=$1; else LOGIN=`whoami`; fiecho "Bonjour, $LOGIN"
2 - Faire un script qui affiche la phrase : Le script [params] a [n] paramètre(s), que voici : [paramètres], en remplaçant les mots entre crochets par leur valeur; par exemple :
                chaland ~ $ params bla ble bli blo blu
La commande params a 5 paramètre(s), que voici : bla ble bli blo blu
12#!/bin/shecho "La commande $0 a $# paramètre(s), que voici| : $@"
3 - Créez une commande qui, lorsqu'elle est appelée, renvoie le nombre d'arguments qui lui ont été fournis, ainsi que le premier de ces arguments.
123#!/bin/shecho "J'ai reçu $# arguments"echo "Le premier d'iceux est $1"
4 - Vous voulez écrire un script qui vous dit combien de personnes sont loguées sur une machine donnée; par exemple :
                 drakkar ~ $ combien galion
Il y a 5 personne(s) loguées sur galion en ce moment.
                 drakkar ~ $
1234#!/bin/shN=`who | wc -l | sed -e "s/ *//"`MACHINE=`whoami`echo "Il y a $N personne(s) logués sur $MACHINE en ce moment"
5 - On veut remplacer le suffixe .htm d'un ensemble de fichiers en .html.
Le script suivant lancé avec "**/*.htm" comme paramètre devrait fonctionner :
12345#!/bin/shfor i in $@;domv $i `echo $i | sed -e "s/htm$/html/"`done;
6 - Un ensemble de noms de fichiers sont en majuscules. On veut tout basculer en minuscules.
12345#!/bin/shfor i in $@;domv $i `echo $i | tr '[:upper:]' '[:lower:]'`done;
7 - Créez un script indice qui affiche l'indice de son premier argument dans la liste des arguments suivants. Par exemple,
indice toto tata titi toto tutu
renvoie l'indice de toto dans la liste tata titi toto tutu, c'est-à-dire 3.
123456789#!/bin/shARG=$1shiftN=0for i in $@;doN=`expr $N + 1`[ x$ARG = x$i ] && echo $Ndone;
8 - On ne s'intéresse ici qu'à des fichiers contenant un mot par ligne. Ecrire un script qui compte le nombre de mots contenant une des lettres «r», «s» ou «t», et parmi eux, ceux qui ont au moins deux telles lettres. On donnera aussi le nombre de mots ne contenant aucune voyelle. Cela donnera par exemple :
Dans ce fichier,  vous avez :
45 mots contenant «r», «s» ou «t», et parmi eux,
12 contiennent deux de ces lettres au moins.
Il y a aussi 10 mots ne contenant aucune voyelle.
12345678910#!/bin/shRST=`grep "[rst]" $1 | wc -l`DEUX=`grep "[rst].*[rst]" $1 | wc -l`CONS=`grep -v "[aeiou]" $1 | wc -l`(echo "Dans ce fichier, vous avez| :";echo "$RST mots contenant «r», «s» ou «t» et parmi eux,";echo "$DEUX contiennent deux de ces lettres au moins.";echo "Il y a aussi $CONS mots ne contenant aucune voyelle.") |sed -e "2,3s/^ *//\$s/i */i /"
9 - On veut chercher toutes les occurences des quatre éléments (terre, air, eau, feu) dans la première partie de Germinal.
On veut aussi que le résultat soit placé dans un fichier, et que le résultat soit classé : toutes les lignes qui contiennent «air», puis toutes celles qui contiennent «eau», etc.
#!/bin/shFICHIER=resultatMOTS="terre air eau feu"[ -w $FICHIER ] && echo "Le fichier $FICHIER existe déjà" && exit 1for i in $MOTS;doecho "Lignes contenant $i" >> $FICHIERgrep $i zola*.txt >> $FICHIERecho >> $FICHIERdone;
10 - Chercher le mot «mine» dans les chapitres 3, 4 et 5 de la première partie de Germinal, et obtenir un fichier dans lequel figure le nombre d'occurences du mot dans les fichiers, avec le numéro des lignes.
123456789#!/bin/shFICHIER=resultat[ -w $FICHIER ] && echo "Le fichier $FICHIER existe déjà" && exit 1for i in zola[345].txt;doecho "Dans le fichier $i, voici les lignes contenant «mine»" >> $FICHIERNB=`grep -n mine $i | tee -a $FICHIER | wc -l`(echo "$NB lignes";echo ) >> $FICHIERdone;
11 - Créez un script coupe qui prend trois arguments, le premier étant un nom de fichier et les deux autres des entiers l et l', et qui affiche les lignes comprises entre l et l' dans le fichier. Par exemple,
coupe fic 4 8
affichera les lignes 4 à 8 du fichier fic. Affichez des messages en cas d'erreur (nombre de paramètres incorrect, fichier inexistant, etc).
1234#!/bin/sh[ $# != "3" ] && echo "Nombre de paramètres incorrects" && exit 1[ ! -r $1 ] && echo "Fichier $1 inexistant" && exit 1cat $1 | sed -n -e "$2,$3p"
12 - Pour transformer une arborescence en un seul fichier compressé, on utilise l'instruction
             tar zcvf nouveaunom fichiersaregrouper
Avant d'envoyer des fichiers tar, on utilise uuencode.
Ecrivez une commande tarmail qui prend deux arguments, une adresse et un nom de répertoire, et qui envoie par mail le contenu de l'arborescence du répertoire précédée d'un message expliquant comment la récupérer.
Note : pour récupérer un fichier uuencodé, on tape uudecode et pour reconstruire l'arborescence, on utilise tar zxvf fichier.
1234567(echo "To: $1";echo "Subject: $2";echo " Pour lire ce document, sauvegardez ce mail (par exemple sous le "echo "nom bidule) et faites ";echo "uudecode bidule | tar tvzf -";echo "pour récupérer les fichiers du répertoire $2";tar cvf - $2 | gzip | uuencode /dev/stdout) | mail $1
13 - La commande suivante affiche le path complet de tous les fichiers finissant par ~ (tilde) dans la sous-arborescence du répertoire courant.
find . -name '*~'
   Ecrivez un script qui prend en argument un nom de répertoire et qui détruit tous les fichiers :
                 a- Finissant par ~;
                 b- Commençant et finissant par un dièse;
                 c- S'appelant core;
                 d- S'appelant a.out.
12345#!/bin/shfor i in `find . \( -name '*~' -o -name 'core' -o -name 'a.out' -o -name '#*#' \) -type f` ;dorm -f $idone;
14 - Ecrire un script permettant d'appliquer divers filtres sur un fichier. Ce script est lancé avec un argument, qui doit être un nom de fichier appelé fichier de travail; dans le cas contraire, on affiche un message d'erreur. On attend ensuite une commande en mode interactif, qui peut être :
   - end : le programme s'arrête;
   - cherche : le programme lit alors une ligne au clavier contenant un motif et une autre contenant un nom de fichier, puis écrit dans ce fichier les lignes du fichier de travail contenant le motif;
   - tete oufin : le programme lit une ligne au clavier contenant un entier n puis une ligne contenant un nom de fichier. Il écrit ensuite les n premières (resp. dernières) lignes du fichier de travail dans le fichier précisé;
   - autre chose : message d'erreur.
123456789101112131415161718192021222324252627282930313233#!/bin/shif [ $# != "1" ]; then echo "Indiquez un nom de fichier";exit 1; fiif [ ! -r $1 ]; then echo "Fichier $1 inexistant";exit 1; fiTRAVAIL=$1while true;doread CMDcase $CMD inend) exit 0;;cherche) echo -n "Motif ? ";read MOTIF;echo -n "Fichier ? ";read FICHIER;if [ -w $FICHIER ]; thenecho "Le fichier $FICHIER existe déjà";elsegrep $MOTIF $TRAVAIL > $FICHIERfi;;tete|fin)echo -n "Lignes ? ";read LGN;echo -n "Fichier ? ";read FICHIER;if [ -w $FICHIER ]; thenecho "Le fichier $FICHIER existe déjà";elsecase $CMD intete) head -n $LGN $TRAVAIL > $FICHIER;;fin) tail -n $LGN $TRAVAIL > $FICHIER;;esacfi;;*) echo "Commande inexistante";;esacdone; 
Article publié le 29 Août 2010par Salim KHALIL