Année universitaire 2002-2003 |
Licence d'informatique
|
Cette structure de contrôle permet d'effectuer un aiguillage conditionnel sur une liste de commandes, en fonction de la valeur d'une expression.
case expression in
cas1)
liste_commandes1
;;
cas2|cas3)
liste_commandes2
;;
*)
liste_commandes3
;;
esac
Dans ce modèle :
case $# in 0) variable=`pwd` ;; 1) variable=$1 ;; *) echo "Erreur de syntaxe" ; exit ;; esac |
Dans ce script, la variable variable reçoit comme valeur le nom du répertoire courant (si aucun paramètre positionnel n'a reçu de valeur) ou la valeur du paramètre positionnel $1 (si un seul paramètre positionnel a reçu une valeur). S'il y a au moins deux paramètres positionnels qui ont reçu une valeur, alors un message est affiché.
La commande break (similaire à l'instruction break; du langage C) existe, mais elle n'est pas nécessaire dans la structure de contrôle d'aiguillage à choix multiple, car le double point-virgule ;; est équivalent à cette commande.
date [-u] [+format]
cf. la description de la commande date, en tapant : man date
date
affiche la date, par exemple sous la forme suivante :
Monday December 8 21:05:47 MET 1997
Écrire un script permettant de convertir une date, renvoyée par la commande date, sous le format suivant (en français) :
Lundi 16 Decembre 1996 15:31:37
Cette structure de contrôle permet de lancer une liste de commandes en boucle.
for variable in liste_de_cas
do
liste_commandes
done
Dans ce modèle, liste_de_cas est une liste de chaînes de caractères, utilisant éventuellement les métacaractères du shell.
for fichier in `ls *.c` do chmod go-r $fichier done |
Cette séquence change les droits d'accès de tous les fichiers non cachés du répertoire courant comprenant l'extension .c
for i
do
...
est équivalente à :
for i in $*
do
...
c'est-à-dire que la variable i prend successivement la valeur de chacun des paramètres positionnels ayant reçu une valeur.
Cette structure de contrôle permet d'exécuter une séquence de commandes en boucle, tant qu'une condition est vérifiée.
while condition
do
liste_commandes
done
Cette structure de contrôle permet d'exécuter une séquence de commandes jusqu'à ce qu'une condition devienne vraie.
until condition
do
liste_commandes
done
Une séquence de commandes placée entre parenthèses est exécutée dans un "sous-shell" du shell courant. De la même manière, chaque commande d'un branchement est exécutée dans un sous-shell du shell courant. Dans un sous-shell, on peut accéder aux valeurs des variables et des paramètres du shell courant. On peut également modifier ces valeurs, mais les modifications apportées ne seront pas répercutées à la fin de l'exécution du sous-shell. De manière équivalente, la valeur du répertoire courant du shell courant peut être modifiée, sans que cette modification perdure à la fin de l'exécution du sous-shell.
$ pwd /users/linfg/linfg0 $ a=1 $ ( echo $a ; a=2 ; echo $a ; cd /usr/include ; pwd ) 1 2 /usr/include $ echo $a 1 $ pwd /users/linfg/linfg0 $ |
Lorsqu'on lance l'exécution d'un script ou qu'on tape la commande sh, on lance en fait un nouveau shell qui est appelé un "shell fils" du shell courant, qui de ce fait est appelé "shell père". Un shell fils diffère d'un sous-shell, dans la mesure où on ne peut pas accéder aux valeurs des variables et des paramètres du shell père. Pour une variable x du shell père, il est néanmoins possible de lancer la commande export x préalablement au lancement du shell fils, auquel cas la valeur de x sera connue dans le shell fils. En revanche, comme pour un sous-shell, les modifications éventuelles de la variable x ne seront pas répercutées dans le shell père (pas plus qu'une modification de la valeur du répertoire courant).
$ pwd /users/linfg/linfg0 $ a=1 $ export a $ sh $ echo $a ; a=2 ; echo $a ; cd /usr/include ; pwd 1 2 /usr/include $ exit $ echo $a 1 $ pwd /users/linfg/linfg0 $ |
head [-position|-nposition] [nom_fichier ...]
La commande head -5 fichier.c affiche les 5 premières lignes de fichier.c
tail [+|-position[lbcr]] [nom_fichier]
Cette commande affiche toutes les lignes de fic.txt, sauf la première.
Écrire un script affiche.sh qui lit soit un fichier dont le nom est passé en paramètre, soit le fichier /users/linfg/linfg0/welcome.html si le script est lancé sans paramètre. Le fichier concerné sera lu et affiché ligne par ligne, de deux manières différentes :
Voici un exemple d'exécution de ce script :
$ affiche.sh fich.txt Affichage en partant du début : <première ligne de fich.txt> <deuxième ligne de fich.txt> ... Affichage en partant de la fin : <dernière ligne de fich.txt> <avant-dernière ligne de fich.txt> ... $ |
Écrire un script qui effectue la traduction mot à mot d'un texte anglais en français. Le fichier f_anglais.txt contient le texte écrit en anglais. Le fichier f_français.txt contiendra la traduction. On dispose d'un fichier dico.txt, dont chaque ligne contient un mot en anglais, suivi d'un espace, suivi de la traduction de ce mot en français. On suppose que dico.txt permet la traduction de l'ensemble du vocabulaire utilisé dans f_anglais.txt.
Exemple :
|
my tailor is rich |
|
is est my mon rich riche tailor tailleur |
|
mon tailleur est riche |
Écrire un script interactif, permettant de naviguer dans une arborescence de fichiers et de répertoires, selon les spécifications suivantes :