Je ne sais pas si vous l'avez remarqué, mais il y a une grosse différence entre ce script et tous ceux que je vous ai montrés jusqu'à maintenant. Pour l'exécuter, vous n'ecrivez pas seulement son nom. Vous indiquez aussi le nom du fichier que vous voulez analyser :
Code : Console
On dit que vous donnez un
argument au script au moment où vous l'appelez. Ici, c'est le nom du fichier à analyser qui sert d'
argument. De la même manière, quand vous tapez
cd /usr/local pour vous rendre dans ce dossier, vous fournissez à la commande
cd l'argument
/usr/local, qui correspond à votre destination.
L'argument fourni au script est automatiquement enregistré dans une variable, qu'on n'a pas besoin de définir manuellement, et qui s'appelle toujours
argv.
Si vous lancez le script
rapport en lui donnant l'argument
heure, alors la variable
argv prend la valeur
heure. La fois suivante, pour pourrez lancer le même script en lui donnant l'argument
change. On aura alors
$argv = change.
Revenons à nos moutons. Nous avons donc demandé :
Code : Console
Rien ne s'affiche, naturellement. Mais deux tableaux ont été créés :
tabls (9 cases) et
tabwc (4 cases) :
Code : Console | -rwxr-x--x 1 brice brice 1859 Jun 17 11:47 change
61 236 1859 change |
L'étape suivante est assez simple, et n'est d'ailleurs pas forcément indispensable. On lit dans les deux tableaux chacune des informations dont nous avons besoin :
Code : Bash | set user = $tabls[3]
set groupe = $tabls[4]
set jour = $tabls[7]
set heure = $tabls[8]
set taille = $tabls[5]
set lignes = $tabwc[1]
set mots = $tabwc[2]
|
Pour le mois,
ls -l nous donne
Jun. On ne peut pas le laisser sous cette forme-la. Il faut le traduire en
juin. Comme nous l'avons déjà fait dans le script
heure, il suffit de reprendre le même code :
Code : Bash | #mois
set court = (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
set long = (janvier fevrier mars avril mai juin juillet aout\
septembre octobre novembre decembre)
foreach i (1 2 3 4 5 6 7 8 9 10 11 12)
if ($tabls[6] == $court[$i]) set mois = $long[$i]
end
|
OK, ce n'est pas
exactement le même code. Dans le if, nous avons remplacé
$complet[2], c'est à dire le nom du mois à traduire, par
$tabls[6].
Mais c'est la seule différence. Ce bloc de quelques lignes, chargé de traduire l'abréviation d'un mois anglais en nom complet d'un mois français nous a servi dans deux scripts différents. Et il est susceptible de resservir dans d'autres scripts encore. Il peut donc être intéressant d'en faire un script à part entière, que nous appellerons
tradMois :
Code : Bash | #!/bin/csh
set court = (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
set long = (janvier fevrier mars avril mai juin juillet aout\
septembre octobre novembre decembre)
foreach i (1 2 3 4 5 6 7 8 9 10 11 12)
if ($argv == $court[$i]) echo $long[$i]
end
|
Après avoir activé ce script avec
chmod, on lui donne l'abréviation à traduire comme argument. Il affiche la traduction :
Code : Console
On peut maintenant appeler le script
tradMois à l'intérieur du script
rapport :
Code : Bash | set mois = `tradMois $tabls[6]`
|
Vous reconnaissez les apostrophes "spéciales" de la touche
7, pour demander l'exécution de
tradMois.
Il ne reste plus qu'à afficher le rapport. Pour changer un peu, je n'utilise pas la commande
echo mais l'une de ses cousines :
printf.
Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | #!/bin/csh
set tabls = (`ls -l $argv`)
set tabwc = (`wc $argv`)
set user = $tabls[3]
set groupe = $tabls[4]
set jour = $tabls[7]
set heure = $tabls[8]
set taille = $tabls[5]
set lignes = $tabwc[1]
set mots = $tabwc[2]
set mois = `tradMois $tabls[6]`
printf "Le fichier $argv appartient a l'utilisateur $user et au groupe $groupe.\
Sa derniere modification date du $jour $mois a $heure.\
Il pese $taille Ko et comporte $mots mots repartis en $lignes lignes.\n"
|
Dans le
printf, les
\ en fin de ligne signifient que l'instruction continue à la ligne suivante. Le
\n final, quant à lui, indique qu'il faut aller à la ligne avant de rendre la main à l'utilisateur.
Un petit coup de
chmod et on essaie :
Code : Console | % rapport rapport
Le fichier rapport appartient a l'utilisateur brice et au groupe brice.
Sa derniere modification date du 18 juin a 21:25.
Il pese 467 Ko et comporte 78 mots repartis en 21 lignes. |
Pour finir, sachez qu'un script peut parfaitement recevoir plusieurs arguments. Dans ce cas,
argv n'est plus une simple variable mais un tableau. Imaginons, par exemple, que vous vouliez analyser plusieurs fichiers. Le script
rapports, ci-dessous, vous donnera entière satisfaction. Avec une boucle
while, il appelle à plusieurs reprises le programme
rapport (au singulier) ci-dessus :
Code : Bash | #!/bin/csh
echo "Vous avez demande l'analyse des fichiers suivants : $argv[*]"
set i=1
while ($i <= $#argv)
printf "\n" #On saute une ligne
rapport $argv[$i]
@ i++
end
|
$argv[*] représente l'ensemble des valeurs du tableau (donc l'ensemble des fichiers à analyser). Il existe deux notations quasiment équivalentes :
$argv ou, tout simplement
$*. Je dis
quasiment car, pour certaines opérations particulières sur les tableaux (copier un tableau dans un autre, par exemple), la notation
$argv[*] est indispensable.
Un peu plus bas, vous rencontrez
$#argv. C'est le nombre d'arguments que le script à reçu. Dans notre cas, c'est donc le nombre de fichiers à analyser.
La variable
i va prendre successivement les valeurs 1, 2, 3, ... jusqu'à
$#argv.
$argv[i] sera donc d'abord
$argv[1] puis
$argv[2], etc. Il adoptera tour à tour le contenu de chacune des cases du tableau
argv. On peut aussi les appeler
$1,
$2, etc.
Il faut que je vous explique l'avant-dernière ligne :
@ i++. Le symbole
@ signifie qu'on fait un calcul. Et
i++, c'est une astuce bien connue pour augmenter de 1 la valeur de la variable
i. C'est la même chose que
i = i + 1. C'est tellement courant qu'il y a un mot spécial pour cette augmentation de 1 : une
incrémentation. Ici, l'incrémentation permet de passer à la case suivante du tableau pour le prochain tour de la boucle
while.
Voyons si ça fonctionne :
Code : Console | % rapports heure change rapport
Vous avez demande l'analyse des fichiers suivants : heure change rapport
Le fichier heure appartient a l'utilisateur brice et au groupe brice.
Sa derniere modification date du 18 juin a 11:35.
Il pese 1057 Ko et comporte 183 mots repartis en 56 lignes.
Le fichier change appartient a l'utilisateur brice et au groupe brice.
Sa derniere modification date du 17 juin a 11:47.
Il pese 1859 Ko et comporte 236 mots repartis en 61 lignes.
Le fichier rapport appartient a l'utilisateur brice et au groupe brice.
Sa derniere modification date du 18 juin a 21:25.
Il pese 467 Ko et comporte 78 mots repartis en 21 lignes. |