Vous êtes sur la page 1sur 10

exrcice

écrire un script qui effectue une permutation circulaire de trois variable


solution
#!/bin/bash
clear
echo permutation circulaire
#initialisation
v1=10; v2=12; v3=14
echo valeur avant v1=$v1 v2=$v2 v3=$v3
aux=$v1
v1=$v3
v3=$v2
v2=$aux
sleep 3
echo valeur apres v1=$v1 v2=$v2 v3=$v3
echo fin de script
case esac
ecrire un script qui execute selon un menu les opérations arithmétiques de base
solution
#!/bin/bash
clear
echo -n entrer operande 1 ; read op1
echo -n entrer operande 2 ; read op2
clear
echo Menu
echo ----
echo 1-somme
echo 2-difference
echo 3-produit
echo 4-division
echo Autres-quitter
echo -n votre choix ? ; read choix
case $choix in
1) echo somme est : `expr $op1 + $op2`;;
2) diff=$(expr $op1 - $op2 )
echo la différence est : $diff;;
3) echo produit est : `expr $op1 \* $op2`;;
4) echo division est $(expr $op1 / $op2 ) le reste est : `expr $op1 % $op2`;;
*)echo choix non conforme
echo recommencer
exit;;
esac
écrire un script qui trie un fichier selon un menu
solution
#!/bin/bash
clear
echo -n entrer le nom du fichier : ; read file
clear
echo Menu
echo ----
echo n- tri normal
echo r- tri inverse
echo q- quitter
echo -n votre choix ?: ; read c
case $c in
n) sort $file;;
r) sort -r $file;;
q) echo fin prématurée
exit;;
*) echo recommencer
exit;;
esac

#!/bin/bash
clear
for x in $@
do
cat $x
echo ----------------------------------------
done
#ce script a pour effet la meme execution que la commande cat avec plusieurs par
amétres
--------------------------------------------------------------------------------
------
écrire un script qui renvois les messages suivants en fonction de l'heure du système
Bonjour si 0<=h<=12
Bon apres midi si 12<h<=17
Bonsoir si 17<h<=23
solution
!/bin/bash
clear
h=$(date +%H)
if [ $h -le 12 ]
then
echo bonjour $USER
elif [ $h -le 17 ]
then
echo bon aprés midi $USER
else
echo bonsoir $USER
fi
écrire un script qui compte séparement le nombre de fichiers ordinaires et
de fichiers répertoires dans une position donnée passée en paramètres
solution simple
#!/bin/bash
clear
#solution simple
echo -n entrer la position ; read position
nbf=0 ; nbr=0
for file in $( ls $position )
do
if [ -f $position/$file ]
then
let nbf=nbf+1
elif [ -d $position/$file ]
then
let nbr=nbr+1
fi
done
echo résultats
echo total fichiers est : $nbf
echo total repertoires est : $nbr
solution élégante
#!/bin/bash
clear
echo -n entrer la position ; read position
nbf=0 ; nbr=0
echo Liste des fichiers
echo ---------------------
for file in $( ls -a $position )
do
if [ -f $position/$file ]
then
echo $file
let nbf=nbf+1
fi
done
echo ----------------------
echo -n total : $nbf
echo
echo---------------------------
echo liste des répertoires
for file in $( ls $position )
do
if [ -d $position/$file ]
then
echo $file
let nbr=nbr+1
fi
done
echo -n total : $nbr

écrire un script qui copie l'ensemble des fichiers résultant d'une recherche (find)
vers une destination lue au clavier.
les options de find sont également lues au clavier
Chemin de recherche
Option du nom
Option de taille
exemple find /usr/share/doc -name *.html -size +70k
solution
#!/bin/bash
clear
echo -n entrer destination ; read dest
echo -n entrer chemin de recherche ; read chem
echo -n entrer nom de fichier ; read nom
echo -n entrer taille de fichier ; read taille
if [ !-e $dest]
then
echo il semble que le répertoire $dest n\'existe pas voulez vous le créer o/
n?
read rep
fi
case $rep in
n) echo chemin de destination non trouvé
echo script ne peut pas aboutir
exit;;
o) mkdir $dest
for i in $( find $chem -name $nom -size +$taille )
do
cp $i $dest
done;;
esac

PartieA:
Ecrire un script "genere" qui crée un fichier "input"contenant un nombre de valeur
s espacées avec un pas.
Le pas et le nombre de valeurs sont lus au clavier
On doit toujours commencer par la valeur 0 dans le fichier input
PartieB:
Ecrire un script calcul qui renvois sur un fichier"output" le résultat de la fonct
ion y=2x+2.
Les valeurs de x sont lues sur le fichier "input" de la partieA
solution partieA sans paramétres
#!/bin/bash
echo donner le nombre de valeurs ; read nbval
echo donner le pas ; read pas
comp=1
i=0
if [ -e input ]
then
rm -f input
# cette derniere ligne supprime le fichier pour une nouvelle excution
fi
while [ $comp -le $nbval ]
do
echo $i >> input
let comp=comp+1
let i=i+$pas
done
fi
solution partieB sans paramétres
#!/bin/bash
clear
if [ -e output ]
then
cat <output >output
# dans cette commande on a vidé le fichier output
fi
for x in $(cat input)
do
let y=$x*2+2
echo $y >> output
done
fi
solution partieA avec paramétres les parametres passés sont dans cet ordre nombreval
eur pas fichiervaleurs
#!/bin/bash
clear
if [ $# -ne 3 ]
then
echo manque de parametres
else
# debut du script
if [ -e $3 ]
then
cat <$3 >$3
# cette derniere ligne vide le fichier de sortie
fi
comp=1
i=0
while [ $comp -le $1 ]
do
echo $i >> $3
let comp=comp+1
let i=i+$2
done
fi
solution partieb avec paramétres les parametres passés sont dans cet ordre fichieren
trée fichiersortie
#!/bin/bash
clear
if [ $# -ne 2 ]
then
echo manque de para
else
if [ -e $2 ]
then
echo <$2 >$2
fi
for x in $(cat $1)
do
let y=$x*2+2
echo $y >> $2
done
fi

exercice :
Le fichier /etc/passwd , contient la liste des comptes utilisateurs Unix
Structure de /etc/passwd : c'est un ensemble de lignes contenant 7 champs
séparés par : telque
login:laisser_x:uid:gid:commentaire:répertoire par défaut:shell
root:x:0:0:root:/root:/bin/bash
abdel:x:500:500:abdel:/home/abdel:/bin/bash
est1:x:509:509::/home/est1:/bin/bash
Un compte est dit systéme si UID < 500
écrire un script qui cherche si un nom de compte lu au clavier est un
compte Unix. Dans le cas ou' le compte existe; le script doit préciser si
ce compte est de type systéme ou utilisateur ordinaire
solution mahmoud ait lahcen
--------------------------------------------------------------------------------
---------
#!/bin/bash
clear
if [ $# -lt 1 ]
then
echo Omission de parametres !!!!!!
echo Fin du programme
exit
fi
existe=0
for i in `cut -d: -f1 /etc/passwd`
do
if [ $1 == $i ]
then
echo Le compte $1 existe
existe=1
fi
done
if [ $existe -eq 0 ]
then
echo Le compte $1 est introuvable
exit
fi
UID=`grep $1 /etc/passwd | cut -d: -f3`
if [ $UID -lt 500 ]
then
echo Le compte $1 est un compte Systeme
else
echo Le compte $1 est un compte Utilisateur Ordinaire
fi
--------------------------------------------------------------------------------
---------
écrire un script qui compte le nombre de fichiers ordinaires dans une position d
onnée passée sous forme de paramètre en affichant juste la taille et le nom du fichier
.
prendre les précautions nécessaires pourque le script tourne

écrire un script "counter" qui compte séparement le nombre de fichiers


ordinaires et de fichiers répertoires dans une position donnée passée en paramètres
et présente les résultats sous cette forme:
contenu du réperoitre xx
-------------------------
Nombre de fichiers ordinaires: nn
Nombre de repertoires : mm
------------------------------------
total : nn+mm

#!/bin/bash
clear
#solution simple
if [ $# -ne 1 ]
then
echo trop ou omission de parametres
else
nbf=0 ; nbr=0
for file in $( ls -a $1 )
do
if [ -f $1/$file ]
then
let nbf=nbf+1
elif [ -d $1/$file ]
then
let nbr=nbr+1
fi
done
echo contenu du repertoire: $1
echo ---------------------------
echo Nombre de fichiers ordinaires : $nbf
echo Nombre de repertoires : $nbr
fi
solution quartet Jean philipe Inouss Arsene Abla
#!/bin/bash
clear
if [ $# -ne 1 ]
then
echo trop ou omission de parametres
else
nbf=`ls -la $1 |cut -c 1 |grep - |wc -l`
nbr=`ls -la $1 |cut -c 1 |grep d |wc -l`
echo contenu du repertoire: $1
echo ---------------------------
echo Nombre de fichiers ordinaires : $nbf
echo Nombre de repertoires : $nbr
fi
################################################################################
""
Ecrire un script qui crée pour chaque compte installé sur le système; un répertoire
portant le même nom que le compte sous ~/tmp/works
faire une copie du fichier /etc/passwd dans chaque reprtoire ainsi crée
changer les droits pourque seul le proprietaire dispose de tous les droits sur
les répertoires avec tout leur contenu
#!/bin/bash
clear
file=/etc/passwd
clear
for login in `cut -d: -f 1 $file`
do
mkdir -p ~/tmp/works/$login
cp $file ~/tmp/works/$login
chmod 700 -R ~/tmp/works/$login
done
--------------------------------------------------------------------------------
--------
scripts Jean luc charles
Script de création/suppression automatique de comptes
Soit le fichier list contenant la liste des noms prénoms d'utilisateurs pour lesqu
els on doit créer des comptes informatiques sur un système Unix.
Le format de la liste est :
#€commentaire
nom1 prénom1
nom2 prénom2
#€commentaire
nom3 prénom3
...
1.Écrire un script-shell qui lit le fichier list ligne par ligne, et qui en fait l
'écho à l'écran sous la forme : <nom> <prénom>
#!/bin/sh
cat list|while read w1 w2
do
echo "<$w1> <$w2>"
done
2.Modifier le script pour éliminer la(les) ligne(s) de commentaires éventuellement p
résente(s) dans list (ligne commençant par un caractère '#' en début de ligne).
#!/bin/sh
cat list|while read w1 w2
do
first_char=`echo $w1|cut -c1`
if [ "$first_char" != "#" ]; then
echo "<$w1> <$w2>"
fi
done
3.Modifier le script pour remplacer les caractères accentués par leur équivalent non a
ccentué : [éèàùç] -> [eeauc]
#!/bin/sh
cat list|while read w1 w2
do
first_char=`echo $w1|cut -c1`
if [ "$first_char" != "#" ]; then
w1=`echo $w1|tr [éèàùç] [eeauc]`
w2=`echo $w2|tr [éèàùç] [eeauc]`
echo "<$w1> <$w2>"
fi
done
4.Faire afficher à l'écran les informations :
<nom> <prénom> <INITIALES>
en tenant compte des points 1. et 2.
#!/bin/sh
cat list|while read w1 w2
do
first_char=`echo $w1|cut -c1`
if [ "$first_char" != "#" ]; then
w1=`echo $w1|tr [éèàùç] [eeauc]`
w2=`echo $w2|tr [éèàùç] [eeauc]`
ini1=`echo $w1|cut -c1|tr [a-z] [A-Z]`
ini2=`echo $w2|cut -c1|tr [a-z] [A-Z]`
ini=$ini1$ini2
echo "<$w1> <$w2> <$ini>"
fi
done
5.Modifier le script pour passer le nom du fichier liste en argument, et contrôler
l'existence du fichier avant de poursuivre le traitement du script.
Utiliser un message de type :
- «€Usage : ...€», si l'argument n'a pas été donné,
- «€Fichier <...> inexistant€», si le fichier passé en argument n'existe pas.
#!/bin/sh
fic=$1
if [ "$fic" == "" ]; then
echo "Usage : compte.sh file"
exit
fi
if [ ! -f "$fic" ]; then
echo "Fichier <$fic> inexistant!"
exit
fi
cat $fic|while read w1 w2
do
first_char=`echo $w1|cut -c1`
if [ "$first_char" != "#" ]; then
w1=`echo $w1|tr [éèàùç] [eeauc]`
w2=`echo $w2|tr [éèàùç] [eeauc]`
ini1=`echo $w1|cut -c1|tr [a-z] [A-Z]`
ini2=`echo $w2|cut -c1|tr [a-z] [A-Z]`
ini=$ini1$ini2
echo "<$w1> <$w2> <$ini>"
fi
done

6. Pour éviter les doublons éventuels au niveau des logins, on prend les 2 premiers
caractères du nom et les 2 premiers caractères du prénom, tout en minuscule, pour form
er le nom de login de l'utilisateur. Faire afficher ce login à la place de <INITIA
LES> du point 4.
#!/bin/sh
fic=$1
if [ "$fic" == "" ]; then
echo "Usage : compte.sh file"
exit
fi
if [ ! -f "$fic" ]; then
echo "Fichier <$fic> inexistant!"
exit
fi
cat $fic|while read w1 w2
do
first_char=`echo $w1|cut -c1`
if [ "$first_char" != "#" ]; then
w1=`echo $w1|tr [éèàùç] [eeauc]`
w2=`echo $w2|tr [éèàùç] [eeauc]`
ini1=`echo $w1|cut -c1,2|tr [A-Z] [a-z]`
ini2=`echo $w2|cut -c1,2|tr [A-Z] [a-z]`
ini=$ini1$ini2
echo "<$w1> <$w2> <$ini>"
fi
done