EMSE CMP ISMEA Utilisation d`Unix Correction d`Exercices

Transcription

EMSE CMP ISMEA Utilisation d`Unix Correction d`Exercices
EMSE CMP
ISMEA
Utilisation d’Unix
Correction d’Exercices
Exercice 01
La commande cp est dangereuse, par exemple cp fic1 fic2, détruit le contenu de fic2 si
celui ci existe. Ecrire une procÉdure shell qui réalise la même fonction que cp et ne dÉtruit
aucun fichier seulement après confirmation.
#/bin/tcsh
if ( ! -e $2) then
cp $1 $2
else echo "$2 existe voulez vous le detruire o/n"
set r = ($<)
if ($r == o) then
cp $1 $2
else echo la copie n\'est pas faite
endif
endif
H. ETTALEB
1
Utilisation Unix
Exercice 02
Ecrire une commande appelable soit avec 0, 1, 2 ou 3 arguments. Appelée avec:
0 paramètre, elle donnera le calendrier de l'année en cours (et non l’année 2002),
1 paramètre, elle donnera le calendrier de l'année indiquée,
2 paramètres, elle donnera le mois de l'année indiquée,
3 paramètres, elle donnera deux mois de l'année indiquée,
plus de trois paramètres message d'erreurs
Exemple d'utilisation:
calendrier
calendrier 2002
calendrier 4 2002
calendrier 3 9 2002
#/bin/tcsh
switch ($#argv)
case 0 :
set d = `date`
cal $d[6]
breaksw
case 1 :
cal $1
breaksw
case 2 :
cal $1 $2
breaksw
case 3 :
cal $1 $3
cal $2 $3
breaksw
default
echo trop de parametres
endsw
H. ETTALEB
2
Utilisation Unix
Exercice 03
Ecrire une commande capable de donner un intervalle de mois d'une année.
Exemple d’exécution :
Inter 3 6 2008
doit afficher les mois :
mars avril mai et juin de l’année 2008
#!/bin/tcsh
if ($#argv == 3) then
set a = $1
while ($a <= $2)
cal $a $3
@ a++
end
else echo " nombre de parametre <> 3"
endif
H.E.
3
Utilisation Unix
Exercice 04
Ecrire un script équivalent à la commande ‘rm’ qui ne détruit pas les fichiers mais les
envoie dans un répertoire appelé ‘poubelle’. La poubelle ne peut contenir qu’un nombre limité
de fichiers ( c à d le script doit faire le ménage dans la poubelle en détruisant les fichiers les
plus anciens)
#!/bin/tcsh
if (! -d ~/poubelle) mkdir ~/poubelle
touch $argv
mv $argv ~/poubelle
set fic = `ls -t ~/poubelle`
@ nb = $#fic
while ($nb > 5)
rm ~/poubelle/$fic[$nb]
@ nb = $nb - 1
end
H.E.
4
Utilisation Unix
Exercice 05
Ecrire une procédure commande qui permet d’afficher le contenu du répertoire
courant. Cette procédure peut être appelée avec trois options:
-c affiche seulement les fichiers cachés,
-f affiche seulement les fichiers ordinaires,
-d affiche seulement les fichiers répertoires,
sans option affiche tous les fichiers (les trois types).
#/bin/tcsh
if ( $argv == 0 ) then
ls –la
else
if ( $argv == 1 ) then
switch ($1)
case ‘-c’ :
set fic = `ls .[a-z]*`
foreach f ($fic)
if ( -f $f ) ls –l $f
end
breaksw
case ‘-f’ :
set fic = `ls`
foreach f ($fic)
if ( -f $f ) ls –l $f
end
breaksw
case ‘-d’ :
set fic = `ls -a`
foreach f ($fic)
if ( -f $f ) ls –l $f
end
breaksw
endsw
endif
endif
H.E.
5
Utilisation Unix
Exercice 06
Ecrire une commande utilisant la commande vi, joe ou autre éditeur de texte, de façon à avoir
trois versions d'un même fichier. Chaque fichier a une extension:
fic.1
dernière version
fic.2
avant dernière version
fic.3
avant dernière version
L’ouverture ou la création des fichiers se fait sans extension
#/bin/tcsh
if (! -f $argv[1].1) then
vi $1.1
else
cp $argv[1].1 temp
vi $argv[1].1
cmp -s $argv[1].1 temp
switch ($status)
case 0 :
rm temp
breaksw
case 1 :
if (-f $argv[1].2) then
cp $argv[1].2 $argv[1].3
endif
mv temp $argv[1].2
breaksw
endsw
endif
H.E.
6
Utilisation Unix
Exercice 07
Ecrire une commande permettant de donner l'indice d'une variable dans une liste.
L'indice doit être positionné comme code de retour.
set element = $argv[1]
shift
@i=1
while ($i <= $#argv)
if ($argv[$i] == $element) then
exit($i)
else @ i++
endif
end
H.E.
7
Utilisation Unix
Exercice 08
Ecrire une procédure permettant de donner la date en français qui utilise la commande
de l’exercice 07. La date en français doit être sous la forme:
Mardi 4 juin 2004 10:33:19
set ja = (Mon Tue Wed Thu Fri Sat Sun)
set jf = (Lundi Mardi Mercredi Jeudi Vendredi samdi dimanche)
set ma = (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
set mf = (Jan Fev Mar Avr Mai Jui Juil Aou Sep Oct Nov Dec)
set d = `date`
indice $d[1] $ja
set j = $jf[$status]
indice $d[2] $ma
set m = $mf[$status]
echo $j $d[3] $m $d[6] $d[4]
H.E.
8
Utilisation Unix
Exercice 09
Ecrire un script qui permet d’afficher un message sur l’écran, vous indiquant que vous
avez dépassé le quota, si la taille du répertoire du login (et non le répertoire courant) est
supérieure à 2 Mo
#/bin/tcsh
while( 1 != 0 )
set hm = `du –sk $HOME`
if ($home[1] > 2000) echo attention vous depasser le quota autorise > `tty`
sleep 5
end
H.E.
9
Utilisation Unix
Exercice 10
Ecrire une procédure shell capable de donner la taille de tous les fichiers ordinaires contenus
dans le répertoire courant sous la forme
fichier1
2 ko 123
fichier 2
0 ko 203
…………
………
set a = `ls -l`
@i=6
@ j = 10
while ($#a > $j)
if (-f $a[$j]) then
@ x = $a[$i] / 1000
@ y = $a[$i] % 1000
echo $a[$j] $x k $y
@ i += 8
@ j += 8
endif
end
H.E.
10
Utilisation Unix
Exercice 11
Ecrire une commande capable d'insérer un fichier au milieu du contenu d'un autre (en
précisant le numéro de la ligne)
H.E.
11
Utilisation Unix
Exercice 12
Ecrire une commande qui simule une calculatrice réalisant les opérations suivantes:
addition, soustraction, multiplication, modulo, division, entière et division réelle.
if ($#argv == 3) then
switch ($argv[2])
case +:
@ e = $argv[1] + $argv[3]
breaksw
case -:
@ e = $1 - $3
breksw
case x:
@ e = $1 * $3
breaksw
case /:
@ e = $1 / $3
breaksw
case %:
@ e = $1 % $3
breaksw
case ::
@ a = $1 / $3
@ b = $1 % $3
@ c = $b * 1000
@ d = $c / $3
if ($d < 0) @ d = $d * -1
set e = ${a},${d}
breaksw
endsw
echo $e
endif
H.E.
12
Utilisation Unix