EXERCICES CORRIGES LINUX: LA PROGRAMMATION EN SHELL

Exercice 1 :

Écrire un shell script qui écrit sur sa sortie standard les messages suivants :
mon nom est xxx
je suis appele avec yyy arguments
qui sont: 111 222 333 444
(xxx sera remplacé par le nom sous lequel ce shell script aura été invoqué, yyy par le
nombre d’arguments et 111, 222, etc. par les arguments en question). Quand ce
script fonctionnera correctement, invoquez le avec les cinq arguments :
Bienvenue dans le monde Linux
puis avec un seul argument contenant la chaîne de caractères : Bienvenue dans le
monde Linux


Correction exercice 1:

Le fichier monscript contient :
#!/bin/bash


echo mon nom est $0
echo je suis appele avec $# arguments
echo qui sont : $*

Et voilà comment on l’invoque :
kyle>./monscript Bienvenue dans le monde Linux
mon nom est ./monscript
je suis appele avec 5 arguments
qui sont : Bienvenue dans le monde Linux
kyle>./monscript 'Bienvenue dans le monde Linux'
mon nom est ./monscript
je suis appele avec 1 arguments
qui sont : Bienvenue dans le monde Linux


Exercice 2 :

Écrire un shell script démontrant que le shell fils hérite de son père, mais que le père
n’hérite pas de son fils.

Correction exercice 2 :


Le fichier papa contient :
#!/bin/bash
echo avant appel du fils
echo TERM = $TERM
echo PWD = $PWD
./fiston
echo apres appel du fils
echo TERM = $TERM
echo PWD = $PWD
Le fichier fiston contient :
#!/bin/bash

echo je suis le fils
echo mon heritage est:
echo TERM = $TERM
echo PWD = $PWD
echo je change
TERM='riendutout'
cd /tmp
 echo TERM = $TERM
echo PWD = $PWD
echo je me termine
L’exécution donne les résultats suivants :
kyle> ./papa
avant appel du fils
TERM vt100
PWD /home/moi/testunix

je suis le fils
mon heritage est:
TERM vt100
PWD /home/moi/testunix
je change
TERM riendutout
PWD /tmp
je me termine
apres appel du fils
TERM vt100
PWD /home/moi/testunix
Kyle>


Exercice 3 :


En utilisant exclusivement les commandes cd et echo, écrire le shell script
"recurls" réalisant la même fonction que la commande ls R. C’est à dire que
la commande recurls rep1 devra lister les noms de tous les fichiers et répertoires
situés sous le répertoire rep1, y compris les sous-répertoires et les fichiers
qu’ils contiennent. Une solution très simple consiste à rendre le script recurls
récursif. (un shell script est récursif s’il s’invoque lui-même).

Correction exercice 3 :
#!/bin/bash
exec 2>/dev/null # redirige stderr pour toute la suite
# au cas ou le script est invoque sans argument $1
# n'existe pas, la commande suivante devient cd .
# voir paragraphe 8.2.6b
cd ${1: .}
for i in * ; do
if [ d $i ] ; then
echo "$PWD/$i/ < repertoire"
$0 $i # le script s'invoque lui meme
else

echo $PWD/$i
fi
done


Exercice 4 :

Écrivez le script "rename" permettant de renommer un ensemble de fichiers. Par
exemple rename ’.c’ ’.bak’ aura pour effet de renommer tous les fichiers
d’extension .c en .bak. les fichiers f1.c et f2.c deviennent f1.bak et f2.bak.
Utilisez la commande basename.

Correction exercice 4 :

#!/bin/bash
# Si ce script a pour nom : rename
# rename .c .bak
# fait ce que DOS fait en : rename *.c *.bak
#
if [ $# ne 2 ] ;then
echo "invoque par rename '.c' '.bak'"
exit 0
fi
for i in *$1 ; do
mv $i $(basename $i $1)$2
done


Exercice 5 :

Et si vi gardait une copie de secours ?
vi est un peu délicat à maîtriser au début, et si on sort par :wq après avoir fait une
gaffe, tout est perdu. Ecrivez donc un petit script en Bash qui crée une copie de
secours. Appelons le svi, pour Safe VI. La commande svi fich1 devra invoquer
vi fich1, mais laisser derrière elle un fichier fich1.bak contenant la version
d’origine de fich1.
Pensez aux deux cas suivants :
Si je dis : svi tralala et que tralala n’existe pas?
Si je dis : svi fich1.bak, que se passe-t-il?

Correction exercice 5:

#!/bin/bash
# ce script doit etre invoque avec un seul argument
# svi fich
case $# in # Doit etre invoque avec un seul argument.
1) if [[ $1 != *.bak ]] ; then # vix fich1.bak ouvre
# fich1.bak en lecture seule
if [ ! s $1 ] ; then # si fich1 n'existe pas,
vi $1 # on le cree
exit
fi
if [ f $1 ] ; then # si fich1 est un nom
cp $1 $1.bak # de fichier on sauvegarde
if [ $? != 0 ] ; then # et on verifie
echo "Erreur : impossible de creer $1.bak" >2
exit 1
else
vi $1
exit
fi
else
echo "Erreur : $1 n\'est pas un fichier" >2
exit 1
fi

else
echo "ATTENTION : $1 est ouvert en lecture seule"
sleep 3
vi R $1
exit
fi;;
*) echo "Erreur : svi fichier" >2
exit 2;;
esac


Exercice 6 :

L’espace disque est précieux ! Une idée pour économiser : Ecrire un script qui
recherche dans toute mon arborescence tous les fichiers qui n’ont pas été accédés
depuis un temps T et dont la taille est supérieure a MIN, et les comprimer par l’utilitaire
gzip. T et MIN sont des constantes définies au début du script par des valeurs
judicieusement choisies. Au fait, a quoi sert MIN ?
Un tel script pourrait être lancé une fois par semaine.

Correction exercice 6 :

#!/bin/bash
# Pour lancer ce script une fois par semaine, (cron)
# voir corrige de l'exercice 12.6.1
# Les constantes T et MIN sont definies par des variables
typeset T=15 # Plus de 16 jours.
typeset i MIN=4096 # 4096 octets = 1 bloc pour AIX
# Il est inutile de comprimer un fichier dont la taille
# est inferieure a un bloc : il occupera toujours un
# bloc sur le disque (voir chapitre 10)
cd
for i in $(find . type f atime +$T size +$MINc print)
do
gzip $i
done

Exercice 7 :

Écrire un script dont le nom est process permettant de copier dans un tableau la liste
des processus de l’utilisateur exécutant ce script, puis afficher le nom de chaque
processus.

Correction exercice 7 :
#!/bin/bash
# ce script a pour nom process.
# Il montre l'utilisation de la substitution de commande
# et des tableaux.
# Ce script affiche les noms de vos processus.
# exemple: xstra> process
#
declare i i=7
declare i fin
declare a PROCESSTAB
PROCESSTAB=($(ps u $(id u)))
FIN=${#PROCESSTAB[*]}
until [ $i gt $FIN ] ;do

echo "programme=${PROCESSTAB[$i]}"
i=$i+4
done

Enregistrer un commentaire

Plus récente Plus ancienne