290 likes | 445 Views
Système d’exploitation Les scripts csh 1 ère Année Année 2001-20002 Tienté HSU. 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. Les programmes exécutables.
E N D
Système d’exploitation Les scripts csh 1ère Année Année 2001-20002 Tienté HSU
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
Les programmes exécutables 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).
Interpréteur de commandes : shell 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
Exécution d’un programme shell (2) 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)
csh : les variables (1) 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
les variables (2) : utilisation (1) • 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 (3) : utilisation (2) • 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 (4) : variables numériques Par défaut tous les variables sont du type caractère. Exemple : set a = 12+15 echo $a On obtient comme résultat 12+15 et non 27 • Affectation d’une variable : @ nomvar = valeur initialisation d’une variable numérique • Opérateurs +, -, *, /, %, ++, --, +=, -=, *=, /=, %= • Exemples : @ a = 1 a contient 1 @ a ++ a contient 2 @ b = 3*$a b contient 6 @ c = $a - $b c contient -4
les variables (5) : les tableaux 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 (6) : suite • 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 prédéfinies (1) • 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 (2) • 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 instructions (1) : commentaire • Toute chaîne précédée du caractère # est un commentaire. Exemple : #Ceci est un commentaire
Utilisation des divers guillemets • ’ : 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` "
Les instructions (2) : expression logique 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 <= 20 && $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 (3) : opérateur de test sur les fichiers Les opérateurs de test sur les fichiers sont : -e fichier vrai si fichier existe -f fichier vrai si fichier est un fichier -r fichier vrai si l’utilisateur a le droit de lecture sur fichier -w fichier vrai si l’utilisateur a le droit d’écriture sur fichier -x fichier vrai si l’utilisateur a le droit d’exécution sur fichier -o fichier vrai si l’utilisateur est propriétaire du fichier -z fichier vrai si fichier existe et est de taille nulle -d fichier vrai 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
L’instruction conditionnelle (1) : IF 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) then ou if (expression) then {instructions} {expressions} else endif {instructions} endif
L’instruction conditionnelle (2) : IF • 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)
Les instructions itératives (1) : FOREACH • 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 (1 2 3 4 5) echo $i end foreach fic (`ls`) echo $fic end
Les instructions itératives (2) : WHILE • 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 @ n-- end
Les instructions de rupture d’itération (1) : break • 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 endif @ somme += $n set n = $< end echo "Le somme totale est $somme"
Les instructions de rupture d’itération (2) : continue • continue : provoque le passage immédiat à l’itération suivante de la boucle Exemple : @ somme = 0 set n = $< while ($n) @ reste = $n % 2 if ($reste) then @ n -- continue endif @ somme += $n @ n -- end echo "Le somme totale est $somme"
L’instruction de choix multiple : switch (1) switch ($var) default : case valeur1 : {instructions} {instructions} breaksw breaksw endsw 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’instructions de choix multiple : switch (2) 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 goto etiquette : une étiquette est une chaîne de caractères suivie du caractère : goto etiquette branchement inconditionnel sur l’etiquette
Les scripts récursifs 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) then @ nbfic = 0 foreach fic (`\ls $argv`) if (-f $argv/$fic) then @ nbfic ++ endif end echo "le nombre de fichiers est $nbfic" endif
Les scripts récursifs (2) 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) then @ nbfic = 0 foreach fic (`\ls $argv`) if (-f $argv/$fic) then @ nbfic ++ else if (-d $argv/$fic) then set res = `nb_fichiers2 $argv/$fic` @ nbfic += $res[6] endif end echo "le nombre de fichiers est $nbfic" endif