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