1 Système d’exploitation Les scripts csh 1 ère Année Année Tienté HSU
2 Système d’exploitation Matériel et logiciels informatiques Généralités d’un système Unix Les processus Le système de fichiers (SGF) Les commandes unix Les scripts C-shell
3 Il existe 2 types de programmes exécutables : Les programmes obtenus par compilation : cc, c++, javac, …etc Les programmes scripts contenant des commandes directement exécutable par un interpréteur de commandes (csh, sh, perl, …etc). Les programmes exécutables
4 Un shell est un interpréteur de langage de commandes. Il a 2 rôles : Un rôle interactif : l’utilisateur peut exécuter directement des commandes Un rôle de langage de programmation : le shell exécute les commandes contenues dans un fichier Sous unix, il existe plusieurs shells : Le C-shell (csh) ou turbo C-shell (tcsh) Le Korn-shell (ksh) Le Bourne-shell (sh) ou le Bourne-Again-Shell (bash) La liste des shells disponibles se trouve dans /etc/shells Interpréteur de commandes : shell
5 Exécution d’un programme shell (1) CommandeConditions sur le fichier Effet csh nom_fichierFichier lisibleInterprétation par un sous processus shell nom_fichierFichier exécutable dont la première ligne commence par #! ref_shell Interprétation par un sous processus ref_shell source nom_fichierFichier lisibleInterprétation dans le shell courant exec nom_fichierFichier lisible et exécutable Recouvrement du csh courant par un csh interprétant le fichier
6 Un programme shell est un fichier contenant un ensemble de commandes unix. Cet ensemble est interprétable par le shell. Exemple : script #! /bin/csh interpréteur de commandes echo "ceci est un script" instruction à exécuter Exemples d’exécution : csh script argument1 argument2 …. source script argument1 argument2 … script argument1 argument2 …. Dans le dernier cas le programme devra : commencer par #! Référence d’un shell (ex. #! /bin/csh) posséder l’attribut d’exécution (x) Exécution d’un programme shell (2)
7 Le C-shell distingue 2 types de variables : les variables locales : visibles uniquement par le processus qui les a créées. Les variables locales du processus père ne sont pas accessibles par le fils. les variables globales : les variables du père sont accessibles et modifiables par le processus fils L’ensemble des variables globales est appelé environnement du processus Par convention : Les variables locales sont en minuscules Les variables globales sont en majuscules csh : les variables (1)
8 Nom de variable : chaîne de caractères Accès au contenu d’une variable ($) Exemple : echo $path Affectation d’une variable : set nomvar = valeur initialisation d’une variable locale setenv NOMVAR valeur initialisation d’une variable globale Listage les variables déclarées : set liste des variables locales setenv liste des variables globales les variables (2) : utilisation (1)
9 Désallocation d’une variable : unset nomvar désallocation d’une variable locale unsetenv NOMVAR désallocation d’une variable globale Existence d’une variable : $?nomvar 1 si la variable est définie, 0 sinon les variables (3) : utilisation (2)
10 Par défaut tous les variables sont du type caractère. Exemple : set a = echo $a On obtient comme résultat et non 27 Affectation d’une variable nomvar = valeur initialisation d’une variable numérique Opérateurs +, -, *, /, %, ++, --, +=, -=, *=, /=, %= Exemples a = 1 a contient a ++ a contient b = 3*$a b contient c = $a - $b c contient -4 les variables (4) : variables numériques
11 Le shell permet de définir les variables de type tableau Affectation d’une variable tableau: set vartab = (v1 v2 …) initialisation d’une variable tableau Les éléments du tableau sont indicés de 1 à $#vartab Accès au contenu des éléments $vartab la totalité du tableau $vartab[1] le 1er élément du tableau $vartab[2] le 2ème élément du tableau $vartab[$#vartab] le dernier élément du tableau $vartab[3-5] l’élément 3 à l’élément 5 $vartab[-7] du 1er élément au 7ème élément $vartab[5-] du 5ème élément au dernier élément La dimension d’un tableau : $#vartab La dimension d’une variable de type tableau peut être modifiée set vartab = ($vartab[2-$#vartab]) le 1er élément est supprimé set vartab = ($vartab valeur) ajout d’une valeur en fin set vartab = (valeur $vartab) ajout d’une valeur au début les variables (5) : les tableaux
12 Saisi des éléments à partir du clavier : set nomvar = $< initialisation à partir du clavier, le résultat est une chaîne set nomvar = ($<) initialisation à partir du clavier, le résultat est un tableau les variables (6) : suite
13 Variables globales HOME : répertoire de connexion de l’utilisateur PATH : liste des répertoires de recherche des commandes PWD : répertoire courant TERM : type de terminal utilisé SHELL : nom du shell utilisé USER : nom de l’utilisateur DISPLAY : localisation de l’affichage Variables locales : argv : liste des arguments du shell $#argv le nombre d’arguments $argv la liste des arguments $argv[1] le 1er argument cwd : référence absolue du répertoire de travail les variables prédéfinies (1)
14 Variables locales homonymes status : code de retour de la dernière commande prompt : chaîne de caractères utilisée comme invite home : répertoire de connexion de l’utilisateur path : liste des répertoires de recherche des commandes term : type de terminal utilisé shell : nom du shell utilisé user : nom de l’utilisateur Toute modification d’une de ces variables entraîne la modification de la variable globale correspondante. Par contre l’inverse n’est pas vrai. les variables prédéfinies (2)
15 Toute chaîne précédée du caractère # est un commentaire. Exemple : #Ceci est un commentaire Les instructions (1) : commentaire
16 ’ : une chaîne de caractères mise entre simple quotes ne sera pas interprétée par le shell " : seuls les métacaractères ($, ` et \) sont interprétés, les autres seront pas interprétés. ` : un texte entre quotes inversés est considéré comme une commande à exécuter. Exemples : echo ’ ceci est une chaine de caractères non interprétée’ echo `pwd` echo " Le répertoire courant de l’utilisateur $user est `pwd` " Utilisation des divers guillemets
17 Les opérateurs utilisables dans une expression logique sont ==test si égalité !=test si différent <test si inférieur >test si supérieur <=test si inférieur ou égal >=test si supérieur ou égal &&opérateur ET logique ||opérateur OU logique !opérateur NOT Exemples : if ($val =0) la variable val est comprise entre 0 et 20 if ("$chaine" != "") la variable chaine est différente vide Remarque : le caractère espace est nécessaire avant et après un des opérateurs ci-dessus Les instructions (2) : expression logique
18 Les opérateurs de test sur les fichiers sont : -e fichiervrai si fichier existe -f fichiervrai si fichier est un fichier -r fichiervrai si l’utilisateur a le droit de lecture sur fichier -w fichiervrai si l’utilisateur a le droit d’écriture sur fichier -x fichiervrai si l’utilisateur a le droit d’exécution sur fichier -o fichiervrai si l’utilisateur est propriétaire du fichier -z fichiervrai si fichier existe et est de taille nulle -d fichiervrai si fichier est un répertoire Exemples : if (-d ~user) vrai si le répertoire utilisateur user existe if (-f $argv[1]) vrai si l’argument 1 est un fichier Les instructions (3) : opérateur de test sur les fichiers
19 Il existe 3 formes possibles : La plus simple : (pas du mot clef then) if (expression) instruction ou if (expression) \ instruction La plus traditionnelle : if (expression) thenou if (expression) then {instructions} {expressions} elseendif {instructions} endif L’instruction conditionnelle (1) : IF
20 If en cascade : un seul endif sur la totalité de la structure. if (expression) then {instructions} else if (expression) then {instructions} else if (expression) then {instructions} … else {instructions} endif Remarque : le shell est un langage interprété, il est nécessaire de respecter scrupuleusement la syntaxe (par exemple le mot then doit être sur la même ligne que if) L’instruction conditionnelle (2) : IF
21 Syntaxe : foreach var (liste) {instructions} end liste : une liste de valeurs ou une variable de type tableau Les instructions entre foreach et end sont exécutées avec var prenant successivement les valeurs des éléments de liste. Exemples : foreach i ( ) echo $i end foreach fic (`ls`) echo $fic end Les instructions itératives (1) : FOREACH
22 Syntaxe : while (expression) {instructions} end Les instructions sont exécutées tant que l’expression est vraie. Remarque : une expression de valeur nulle est considérée comme fausse, tout autre valeur est considérée comme vraie Exemple n = 4 while ($n >= 0)ou while ($n) echo n-- end Les instructions itératives (2) : WHILE
23 break : provoque la sortie immédiate de la boucle, le script reprend son cours après le end correspondant Exemple somme = 0 set n = $< while ($n) if ($n >=20 || $n < 0) then set n = $< break somme += $n set n = $< end echo "Le somme totale est $somme" Les instructions de rupture d’itération (1) : break
24 continue : provoque le passage immédiat à l’itération suivante de la boucle Exemple somme = 0 set n = $< while reste = $n % 2 if ($reste) n -- continue somme += n -- end echo "Le somme totale est $somme" Les instructions de rupture d’itération (2) : continue
25 switch ($var)default : case valeur1 : {instructions} {instructions}breaksw breakswendsw case valeur2 : {instructions} breaksw endsw …… La commande switch teste si le contenu de var est égal à valeur1 : si oui, les instructions jusqu’au breaksw sont exécutées sinon, la commande teste var par rapport à valeur2 et ainsi de suite Si aucune clause n’est vérifiée, la clause default sera exécutée La clause default et l’instruction breaksw sont facultatives L’instruction de choix multiple : switch (1)
26 echo "entrer une note : " set note = $< switch ($note) case 10 : case 9 : case 8 : case 7: case 6: echo " Vous êtes bon … " breaksw case 5 : echo " Vous êtes moyen … " breaksw default : echo " Vous n’êtes pas très fort … " breaksw endsw L’instructions de choix multiple : switch (2)
27 etiquette :une étiquette est une chaîne de caractères suivie du caractère : goto etiquettebranchement inconditionnel sur l’etiquette L’instructions goto
28 Un script c-shell peut contenir n’importe quelle commande exécutable sous unix. On appelle un script récursif un script qui fait appel à lui même. Exemple : nb_fichiers est un script permettant de déterminer le nombre de fichiers contenus dans un répertoire rep passé en paramètre. #! /bin/csh # nom du programme : nb_fichiers if ($#argv == 1) nbfic = 0 foreach fic (`\ls $argv`) if (-f $argv/$fic) nbfic ++ endif end echo "le nombre de fichiers est $nbfic" endif Les scripts récursifs
29 Exemple 2 : nb_fichiers2 est un script permettant de déterminer le nombre de fichiers contenus dans le sous arbre ayant pour racine rep passé en paramètre. #! /bin/csh # nom du programme : nb_fichier2 if ($#argv == 1) nbfic = 0 foreach fic (`\ls $argv`) if (-f $argv/$fic) nbfic ++ else if (-d $argv/$fic) then set res = `nb_fichiers2 nbfic += $res[6] endif end echo "le nombre de fichiers est $nbfic" endif Les scripts récursifs (2)