100% ont trouvé ce document utile (1 vote)
5K vues14 pages

Exercices + Correction - Script Shell

Le document contient plusieurs exercices et leurs solutions sur l'utilisation de scripts shell. Il présente des commandes et fonctions shell utiles pour la manipulation de fichiers, la gestion des paramètres et des menus interactifs.

Transféré par

yahyaz.bn01
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
100% ont trouvé ce document utile (1 vote)
5K vues14 pages

Exercices + Correction - Script Shell

Le document contient plusieurs exercices et leurs solutions sur l'utilisation de scripts shell. Il présente des commandes et fonctions shell utiles pour la manipulation de fichiers, la gestion des paramètres et des menus interactifs.

Transféré par

yahyaz.bn01
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Exercices Script

Shell
Correction

Techniques des Réseaux Informatiques

KATKOUT KHALID
2013/2014
Techniques des Réseaux Informatiques

Exercices Script Shell – Corrigés

Exercice 1 :
Écrire un script qui affiche le nombre de paramètres passé sur la ligne de commande, si aucun paramètre,
alors afficher « Aucun paramètres sur la ligne de commande » sinon afficher « Il y a X sur la ligne de
commande » et affiche la liste des paramètres les un a coté des autres, puis les uns en dessous des autres.

Solution :
#!/bin/sh
if [ $# -eq 0 ]
then
echo "Aucun parametre sur la ligne de commande..."
else
echo "Il y a $# parametre(s) sur la ligne de commande"
echo "liste des parametres :"
echo $*
for i in $*
do
echo $i
done
fi

Exercice 2 :
Écrire un script qui dit si le premier paramètre passé en ligne de commande est un nom de fichier ou un
nom de répertoire, ou de type inconnu.

Solution :
#!/bin/sh
if [ $# -eq 0 ]
then
echo "Aucun paramètre sur la ligne de commande..."
else
if [ -f $1 ] then
echo « Le paramètre passé en ligne de commande est un fichier... »
else
echo « Le paramètre passé en ligne de commande n'est un fichier... »
fi
fi

Exercice 3 :
Écrire un script qui n'affiche que les fichiers du répertoire courant.
Écrire un script qui affiche la liste des fichiers d'un répertoire passé en paramètre.

Solution 1 :
#!/bin/sh
a=$('ls')
for i in $a
do

Khalid KATKOUT [Link] Page 2


Techniques des Réseaux Informatiques

if [ -f $i ]
then
echo "fichier : " $i
fi
done

Solution 2 :
#!/bin/sh
if [ $# -eq 0 ]
then
echo "Aucun paramètre sur la ligne de commande..."
else
cd $1
a=$("ls")
for i in $a
do
if [ -f $i ]
then
echo "fichier : " $i
fi
done
cd ..
fi

Exercice 4 :
Écrire un script qui n'affiche que les répertoires du répertoire courant.
Écrire un script qui affiche la liste des répertoires d'un répertoire passé en paramètre.

Solution 1:
#!/bin/sh
a=$('ls')
for i in $a
do
if [ -d $i ]
then
echo "Répertoire : " $i
fi
done

Solution 2:
#!/bin/sh
if [ $# -eq 0 ]
then
echo "Aucun paramètre sur la ligne de commande..."
else
cd $1
a=$("ls")
for i in $a
do

Khalid KATKOUT [Link] Page 3


Techniques des Réseaux Informatiques

if [ -d $i ]
then
echo "fichier : " $i
fi
done
cd ..
fi

Exercice 5 :
Écrire un script qui compte le nombre de fichiers et de répertoires dans le répertoire courant et
affiche le résultat sous forme :
Fichiers : 12
Répertoires : 9

Solution :
#!/bin/sh
a=$('ls')
nbd=0
nbf=0
for i in $a
do
if [ -f $i ]
then
nbf=$(($nbf+1))
fi
if [ -d $i ]
then
binbd=$(($nbd+1))
fi
done
echo "nb fichiers : " $nbf
echo "nb répertoires : " $nbd

Exercice 6 :
Écrire un script qui affiche la taille d'un fichier passé en paramètre sous la forme :
Nom du fichier : [Link] ------- Taille 1562 octets

Solution :
#!/bin/sh
if [ $# -eq 0 ]
then
echo "Aucun paramètre sur la ligne de commande..."
else
wc -c $1>tmp
read a b <tmp
echo "Nom du fichier : $1 ------ Taille " $a " octets."
rm tmp
fi

Khalid KATKOUT [Link] Page 4


Techniques des Réseaux Informatiques

Exercice 7 :
Écrire un script qui affiche l'arborescence d'un répertoire sous forme « graphique »
+---Trash
| +---Bin
| | +---Bash

Solution :
#!/bin/sh
search () {
for dir in `echo *`
do
if [ -d "$dir" ] ; then
zz=0
while [ $zz != $1 ]
do
echo -n "| "
zz=`expr $zz + 1`
done

if [ -L "$dir" ] ; then
echo "+---$dir" `ls -l $dir | sed 's/^.*'$dir' //'`
else
echo "+---$dir"
numdirs=`expr $numdirs + 1`
if cd "$dir" ; then
search `expr $1 + 1`
cd ..
fi
fi
fi
done
{
if [ $# != 0 ] ; then
cd $1
fi
echo "Répertoire initial = `pwd`"
numdirs=0
search 0
echo "Nombre total de répertoires = $numdirs"
exit 0

Exercice 8 :
Question Unix :
Écrire un script qui affiche le menu suivant :
1 – Windows?
2 – BeOs?
3 – Linux?
4 – Unix?
Réponse :
Si vous répondez 1 alors le programme affiche « Dommage! », 2 il affiche « Peut mieux faire! », 3
Khalid KATKOUT [Link] Page 5
Techniques des Réseaux Informatiques

« Pas mal! », 4 « Super! ».


Solution :
#!/bin/sh
echo "1 – Windows?"
echo "2 – BeOs?"
echo "3 – Linux?"
echo "4 – Unix?"
echo "Réponse ?"
read rep
case $rep in
1) echo "Dommage!";;
2) echo "Peut mieux faire!";;
3) echo "Pas mal!";;
4) echo "Super!";;
*) echo "Sans opinion apparemment!!!";;
esac

Exercice 9 :
Soit un fichier contenant les valeurs suivantes dans cet ordre :
9 10
20 30
10 20
Écrire un script qui permet de faire la somme des 2 valeurs figurant sur une ligne.

Solution :
#!/bin/sh
a=$(cat [Link])
nb=0
for i in $a
do
if [ $nb -eq 1 ]
then
v2=$i
somme=$(($v1+$v2))
echo $v1 '+' $v2 ' = '$somme
let nb=2
fi
if [ $nb -eq 0 ]
then
v1=$i
let nb++
fi
if [ $nb -eq 2 ]
then
let nb=0
fi
done

Exercice 10 :

Khalid KATKOUT [Link] Page 6


Techniques des Réseaux Informatiques

Écrire un script qui affiche le menu suivant, demande de faire un choix et affiche ce choix ou quitte
si on choisit l'option 9
<1> Comptabilité
<2> Gestion commerciale
<3> paie
<9>Quitter

Solution :
#!/bin/sh
while :
do
echo " "
echo "<1> Comptabilité"
echo "<2> Gestion commerciale"
echo "<3> paie"
echo "<9>Quitter"
echo "Réponse ?"
read rep
case $rep in
1) echo "Vous avez choisi la Comptabilité";;
2) echo "Vous avez choisi la Gestion Commerciale";;
3) echo "Vous avez choisi la paie";;
9) echo "Bye BYe";exit 0;;
*) echo "Mauvaise réponse!!!";;
esac
done

Exercice 11 :
Écrire un script qui demande interactivement le nom d'un fichier source C, vérifie que celui ci
existe , et le compile dans ce cas.

Solution :
#!/bin/sh
if [ $# -eq 0 ]
then
echo "Aucun paramètre sur la ligne de commande..."
else
if [ -f $1 ]
then
cpp
fi

Exercice 12 :
Réalisez un script qui en fonction de l'heure courante affiche « Bonjour » entre 0h et 12h, « Bon après midi
» entre 12h et 17h et « Bonne soirée » entre 17h et 0h.

Solution :
#!/bin/sh
heure=`date | awk '{print $4}' | awk -F: '{print $1}'`

Khalid KATKOUT [Link] Page 7


Techniques des Réseaux Informatiques

if [ $heure -lt 12 ]
then
echo « Bonjour! »
elif [ $heure -lt 17 ]
then
echo « Bon aprés midi! »
else
echo « Bonsoir! »
fi
Correction 2 :
#!/bin/sh
date>tmp
read a b c d e<tmp
rm tmp
deb=`expr index "$d" :`
let deb=deb-1
heure=${[Link]$deb}
if [ $heure -lt 12 ]
then
echo "Bonjour!"
elif [ $heure -lt 17 ]
then
echo "Bon apres midi!"
else
echo "Bonsoir!"
fi

Exercice 13 :
Écrire un script qui génère un mot de passe dont on passera la longueur en paramètre.

Solution :
#!/bin/sh
if [ $# -ge 1 ]
then
tab="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
nbparam=0
while [ $nbparam -lt $1 ]
do
valeur=$(($RANDOM % 62))
mdp=$mdp${tab:$valeur:1}
let nbparam=nbparam+1
done
echo "Mot de passe : " $mdp
else
echo "Syntaxe : ./[Link] [nbLettres]"
fi

Exercice 14 :
Écrire un script qui génère un mot de passe dont on passera la longueur en paramètre, ainsi que le nombre
de caractères alphanumérique et numérique.
Khalid KATKOUT [Link] Page 8
Techniques des Réseaux Informatiques

Solution :
#!/bin/sh
if [ $# -eq 2 ]
then
alpha="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
nbparam=0
let nbNum=$1-$2
nbAlpha=$2
echo $1 $2 $nbNum $nbAlpha
while [ $nbparam -lt $nbNum ]
do
valeur=$(($RANDOM % 10))
mdp=$mdp$valeur
let nbparam=nbparam+1
done
nbparam=0
while [ $nbparam -lt $nbAlpha ]
do
valeur=$(($RANDOM % 52))
mdp=$mdp${alpha:$valeur:1}
let nbparam=nbparam+1
done
echo "Mot de passe : " $mdp
exit 0
else
echo "Syntaxe : ./[Link] [nb Lettres] [nb alpha]"
fi

Exercice 15 :
Écrire un script qui donne les valeurs de Y=10X+3X² pour de valeurs allant de x à x' avec un
Incrément de z.
Les valeurs x, x' et z seront passé en paramètres sur la ligne de commande.

Solution :
#!/bin/sh
if [ $# -eq 3 ]
then
x=$1
xp=$2
z=$3
inc=$1
while [ $inc -le $xp ]
do
let b2=3*inc*inc
let resultat=10*inc+b2
echo "10X+3X² avec X=$inc donne $resultat"
let inc=inc+z
done
else
echo "Syntaxe : $0 [x] [x'] [pas]"
Khalid KATKOUT [Link] Page 9
Techniques des Réseaux Informatiques

fi

Exercice 16 :
Écrire un script qui déclenche une alarme à une heure choisi, ce script sera lancé en Background.
Lors du déclenchement de l'alarme, il efface l'écran et affiche « Il est l'heure 12h31! », puis stoppe
le script.
[Link] 12 31 &

Solution :
#!/bin/sh
h="00:00"
if [ $# -eq 1 ]
then
while [ "$h" != "$1" ]
do
d=$(date)
h=${[Link]}
done
clear
echo "Il est $h, c'est l'heure!"
else
echo "syntaxe : $0 [hh:mm] [message]"
fi

Exercice 17 :
Ecrire un script shell qui permet d'obtenir des informations sur un fichier rpm (fichier d'archive redhat).
Le fichier rpm s'analysera avec la commande « rpm »
on utilisera les options -gpi pour obtenir la description de l'archive
on utilisera les options -gpl pour obtenir la description de l'archive

Solution :
#!/bin/bash
# [Link]
# Recherche une description à partir d'un fichier rpm, et s'il peut être
#+ installé.
# Sauvegarde la sortie dans un fichier.
#
# Ce script illustre l'utilisation d'un bloc de code.
SUCCES=0
E_SANSARGS=65
if [ -z "$1" ]
then
echo "Usage: `basename $0` fichier-rpm"
exit $E_SANSARGS
fi
}
echo
echo "Description de l'archive :"
rpm -qpi $1 # Requête pour la description.

Khalid KATKOUT [Link] Page 10


Techniques des Réseaux Informatiques

echo
echo "Contenu de l'archive :"
rpm -qpl $1 # Requête pour la liste.
echo
rpm -i --test $1 # Requête pour savoir si le fichier rpm est installable.
if [ "$?" -eq $SUCCES ]
then
echo "$1 est installable."
else
echo "$1 n'est pas installable."
fi
echo
} > "$[Link]" # Redirige la sortie de tout le bloc vers un fichier.
echo "Les résultats du test rpm sont dans le fichier $[Link]"
# Voir la page de manuel de rpm pour des explications sur les options.
exit 0

Exercice 18 :
Chercher une valeur entre 0 et 1000 en 10 coups maximum

Solution :
#!/bin/sh
clear
echo "Cherche la valeur Version 0.1"
echo
achercher=0
Bornesup=1000
nbcp=10
num=1
ok=0
valeur=0
nombre(){
achercher=$(($RANDOM % $Bornesup))
{
demande_valeur(){
valeur=1001
while [ $valeur -lt 0 ] || [ $valeur -gt 1000 ]
do
printf "Cp-$num : Indiquez une valeur entre 0 et 1000 : "
read valeur
done
{
verifier_valeur(){
if [ $valeur -lt $achercher ]
then
ok=0
echo "La valeur recherché est plus grande..."
echo
fi
if [ $valeur -gt $achercher ]
Khalid KATKOUT [Link] Page 11
Techniques des Réseaux Informatiques

then
ok=0
echo "La valeur recherché est plus petite..."
echo
fi
if [ $valeur -eq $achercher ]
then
ok=1
echo "Vous avez trouvé la valeur correcte..."
fi
{
nombre
while [ $num -le $nbcp ] && [ $ok -ne 1 ]
do
demande_valeur
verifier_valeur
let num=num+1
done
if [ $num -gt $nbcp ]
then
echo "Vous avez perdu la partie, la valeur a trouver était $achercher, désolé!"
fi
exit 0

Exercice 19 :
Donner le jour de votre naissance !
Ecrire un script Shell qui permet en donnant votre date de naissance de donner le jour de votre naissance.
Soit l’algorithme suivant :
D= Jour de naissance (01-31)
M=Mois de naissance (01-12)
A=Année de naissance (>=1900)
S=(A \ 100) mod 4
B=A mod 100
Valeur1=B + B \ 4 + D - 2 * S
Si M=1 alors MR=5
Si M=2 alors MR=1
Si M=3 alors MR=2
Si M=4 alors MR=5
Si M=5 alors MR=0
Si M=6 alors MR=3
Si M=7 alors MR=5
Si M=8 alors MR=1
Si M=9 alors MR=4
Si M=10 alors MR=6
Si M=11 alors MR=2
Si M=12 alors MR=4
Si M<3 alors MB=-1 sinon MB=0
Valeur2=B mod 4
Si valeur2<>0 alors Valeur3=-1 sinon Valeur3=0
Si B=0 alors Valeur4=-1 sinon Valeur4=0

Khalid KATKOUT [Link] Page 12


Techniques des Réseaux Informatiques

Si S<>0 alors Valeur5=-1 sinon Valeur5=0


J1=Valeur1+MR+MB
J2=Valeur3+Valeur4
J3=J2*Valeur5
J=J1+J3
Si J=0 alors Jour= Dimanche
Si J=1 alors Jour= Lundi
Si J=2 alors Jour= Mardi
Si J=3 alors Jour= Mercredi
Si J=4 alors Jour= Jeudi
Si J=5 alors Jour= Vendredi
Si J=6 alors Jour= Samedi
Exemple d’affichage du script Date_naissance.sh :
Date de naissance :
Jour : ? 12
Mois : ? 01
Année : ? 1971
Vous êtes née le Mardi 12 / 01 / 1971

Solution :
#!/bin/sh
#introduire la date de naissance
printf "Date de naissance :\n"
printf "jour de naissance JJ"
read J
printf "jour de naissance MM"
read M
printf "jour de naissance AA"
read A
S=`expr $A / 100 % 4`
printf "S=$S\n"
B=`expr $A % 100`
printf "B=$B\n"
Valeur1=`expr $B + $B / 4 + $J - 2 '*' $S`
printf "valeur1=$Valeur1\n"
case $M in
01)MR=5;;
02)MR=1;;
03)MR=2;;
04)MR=5;;
05)MR=0;;
06)MR=3;;
07)MR=5;;
08)MR=1;;
09)MR=4;;
10)MR=6;;
11)MR=2;;
12)MR=4;;
esac
printf "MR=$MR\n"

Khalid KATKOUT [Link] Page 13


Techniques des Réseaux Informatiques

if [ $M -lt 03 ]
then
MB=-1
else
MB=0
fi
printf "MB=$MB\n"
Valeur2=`expr $B % 4`
printf "Valeur2=$Valeur2\n"
if [ $Valeur2 -ne 0 ]
then
Valeur3=-1
else
Valeur3=0
fi
printf "Valeur3=$Valeur3\n"
if [ $B -eq 0 ]
then
Valeur4=-1
else
Valeur4=0
fi
printf "Valeur4=$Valeur4\n"
if [ $S -ne 0 ]
then
Valeur5=-1
else
Valeur5=0
fi
printf "Valeur5=$Valeur5\n"
J3=`expr $Valeur3 + $Valeur4`
J1=`expr $J3 '*' $Valeur5`
J2=`expr $Valeur1 + $MR + $MB`
printf "J1=$J1\n"
printf "J2=$J2\n"
J4=`expr $J2 '*' $J1`
J=`expr $J4 % 7`
printf "Jour numero : $J\n"

Khalid KATKOUT [Link] Page 14

Vous aimerez peut-être aussi