Vous êtes sur la page 1sur 72

A.

ED-DBALI

Universit d'Orlans

Programmation Shell
Lexemple du ksh

A. Ed-Dbali Ed-

AbdelAli.Ed-Dbali@lifo.univ-orleans.fr

Scripts Shell
Dfinition : suite de commandes UNIX runies dans un fichier
Exemple: script qui-est-la :
echo Liste des connections par ordre alphabtique who | sort

$ qui-est-la
Liste des connections par ordre alphabtique dupont /dev/pts/23 09:01 durand /dev/pts/36 15:32 leger /dev/pts/24 10:14

UNIX : La programmation Korn Shell

A. Ed-Dbali Ed-

Excution d'un script


Il existe trois manires d'excuter un script :
$ shell script
Excution par le sous shell cit (script fichier texte non ncessairement excutable : droits x positionns ou non)

$ script
Excution par un sous shell (script est un fichier excutable : droits x positionns). L'environnement du shell courant non affect.

$ . script
La commande '.' (point) est une commande interne la famille Bourne-shell (quivalent dans la famille C-shell : source) Excution par le shell courant (environnement du shell courant affect)
UNIX : La programmation Korn Shell 3 A. Ed-Dbali Ed-

Fichiers dinitialisation la connexion


A la connexion, les fichiers suivants sexcutent dans cet ordre :
/etc/environment /etc/profile $HOME/.profile pour personnaliser l'environnement de lutilisateur le fichier $ENV (si ENV a une valeur, en gnrale : $HOME/.kshrc) Ce fichier est excut chaque ouverture de session Korn-Shell (pour, entre autres, dfinir des alias) Excution de commandes possible l'abandon du shell
UNIX : La programmation Korn Shell 4 A. Ed-Dbali Ed-

Variables prdfinies
Variable HOME PATH CDPATH FPATH IFS PWD RANDOM REPLAY SECONDS LINENO PPID EDITOR
UNIX : La programmation Korn Shell

Valeur rpertoire de connexion liste des rpertoires de recherche des commandes liste des rpertoires pour la commande cd liste des rpertoires de recherche des fonctions chane des sparateurs de champs (espace, tab, fin de ligne) rpertoire courant (OLDPWD : ancien rpertoire) nombre alatoire paramtre par dfaut de read et select temps coul depuis l'invocation du shell ou depuis le dernier appel numro de ligne dans le script numro du processus pre diteur par dfaut
5 A. Ed-Dbali Ed-

Variables prdfinies - suite


Variable ENV HISTFILE HISTSIZE LOGNAME PS1 PS2 PS3 PS4 TERM TMOUT MAIL MAILCHECK MAILMSG
UNIX : La programmation Korn Shell

Valeur nom du fichier excut l'invocation du shell (ex: $HOME/.kshrc) nom du fichier historique des commandes ($HOME/.sh_history) nombre de commandes stockes dans $HISTFILE (128) nom de connexion invite primaire du shell ($) invite secondaire du shell pour les commandes incompltes (>) invite de l'instruction select (#?) invite de la trace d'un script (+) type du terminal nombre de secondes avant le compte rebours de dconnexion nom du fichier de messagerie (ex: /var/mail/$LOGNAME) frquence de consultation du courrier (600 secondes) message d'alerte l'arrive d'un courrier
6 A. Ed-Dbali Ed-

Variables de position
Permettent l'accs aux paramtres de la ligne de commande :
0 : non du script (valeur $0) 1 : 1er paramtre, 2 : 2me paramtre, etc. (valeur $1, $2, ) * ou @ : liste des tous les paramtres (valeur $* ou $@) # : nombre des paramtres (valeur $#)

Exemples
$ cmd a 1 fich -2 t3 (cmd un script Shell quelconque) $# = 5 $0 = cmd $1 = a, $2 = 1, $3 = fich, $4 = -2, $5 = t3 $* = a 1 fich -2 t3 script Shell : bout head -$3 $1 | tail +$2 $ bout fich 5 9 extrait de fich toutes les lignes entre la 5me et la 9me
UNIX : La programmation Korn Shell 7 A. Ed-Dbali Ed-

Autres variables
?
Code de retour de la dernire commande ou du groupe de commande
Permet de tester la valeur de vrit d'une commande : $? = 0 commande vraie, $? 0 commande fausse

$
Numro du processus du script
Permet de manipuler le processus Utilis souvent pour crer des noms de fichiers temporaires : FICH_TEMP=/tmp/$0-$$

!
Numro du processus de la dernire tche lance en arrire plan
UNIX : La programmation Korn Shell 8 A. Ed-Dbali Ed-

Variables de l'utilisateur
Tout identificateur
Suite de lettres, de chiffres et du caractre '_' qui ne commence pas par un chiffre Dfinition par
l'affectation : NomVar=ValeurVar la commande interne read ou readonly (pour ne plus la modifier) la commande interne set (pour, entre autres, positionner dynamiquement les variables de position)

Type par dfaut : chane de caractres Typer une variable : typeset -[option] [variable[=valeur]]
option : iN (entier base N), u (chane majuscule), l (chane minuscule), LN (justifi gauche), RN (justifi droite), ZN (justifi droite compltion ventuelle avec des zros), r (variable en lecture seule), x (variable exporte : export)

typeset +option variable invalide l'attribut


UNIX : La programmation Korn Shell 9 A. Ed-Dbali Ed-

Manipulation des variables


Accs la valeur : $NomVar
Si ambigut utiliser {} Exemples : $ X=Script $ echo $X Script $ echo $XShell variable XShell non dfinie $ echo ${X}Shell ScriptShell $ echo $X-Shell Script-Shell

UNIX : La programmation Korn Shell

10

A. Ed-Dbali Ed-

Manipulation des variables


Terme
${#var} ${var:-valeur} ${var:=valeur} ${var:?message} ${var:+valeur} ${var#motif} ${var##motif} ${var%motif} ${var%%motif}

Signification
longueur de la valeur de var valeur si var nulle ou non initialise affecte valeur var si var nulle ou non initialise affiche message et termine le script si var non initialise valeur (resp. chane vide) si var initialise (resp. non initialise) valeur de var sans la plus petite partie de son dbut si elle correspond motif valeur de var sans la plus grande partie de son dbut si elle correspond motif valeur de var sans la plus petite partie de sa fin si elle correspond motif valeur de var sans la plus grande partie de sa fin si elle correspond motif
11 A. Ed-Dbali Ed-

UNIX : La programmation Korn Shell

Expressions arithmtiques
Expressions arithmtiques habituelles values l'aide de expr (rvolue), let (moderne et fait pour plusieurs expressions) ou (()) pour une seule expression
$ expr $a + 1
Affiche la valeur de a incrment de 1

$ let a=a+1 b=2*a/3


Incrmente a de 1 et affecte b la valeur 2a/3 Pas d'espace dans les expressions

$ ((y = 2 * x +3))
Affecte y la valeur de l'expression 2x+3 Texte de l'expression libre

(()) a une valeur, y accder par $(())


UNIX : La programmation Korn Shell 12 A. Ed-Dbali Ed-

Expressions arithmtiques
Oprateurs identiques ceux du langage C :
Arithmtiques :
() pour fixer l'ordre d'valuation, - unaire, ! Ngation, ~ complment bit bit, * multiplication, / quotient, % modulo, + addition, - soustraction, < < dcalage bits gauche, > > dcalage bits droite

Boolens :
<=, >=, <, >, == (galit), != (diffrent), & (et bit bit), ^(ou exclusif bit bit), (ou bit bit), && (et logique), (ou logique)

Affectation :
= (affectation simple), op= (v Op= exp v = v Op (exp))
UNIX : La programmation Korn Shell 13 A. Ed-Dbali Ed-

Expressions boolennes
Expressions valeur boolenne value l'aide de test ou [] (anciens) ou [[]] (nouveau)
$ test f fich [ -f fich ] [[ -f fich ]] Diffrence entre [] et [[]] :
dans [], les caractres spciaux dans les noms gnriques sont interprts dans [[]] ils ne le sont pas : permet des comparaisons riches

Oprateurs boolens :
! && ou -a || ou o
UNIX : La programmation Korn Shell

(ngation) (conjonction) (disjonction)


14 A. Ed-Dbali Ed-

Expressions de tests sur les fichiers


Test
-a fich -b fich -c fich -d fich -e fich -f fich -G fich -g fich -k fich

Signification
existe fichier spcial bloc fichier spcial caractre rpertoire existe fichier ordinaire appartient au groupe du processus set-gid positionn sticky-bit positionn

Test
-L fich -O fich -p fich -r fich -S fich -s fich -u fich -w fich -x fich

Signification
lien symbolique appartient au propritaire du processus tube nomm lisible fichier socket de taille non nulle set-uid positionn modifiable excutable

Test
fich1 nt fich2 fich1 ot fich2 fich1 et fich2
UNIX : La programmation Korn Shell

Signification
fich1 plus rcent que fich2 fich1 plus vieux que fich2 fich1 est un lien vers fich2
15 A. Ed-Dbali Ed-

Comparaisons de chanes
Test -z chane -n chane chane = motif chane != motif chane1 < chane2 chane1 > chane2 Signification chane de longueur nulle chane de longueur non nulle chane est de la forme motif chane n'est pas de la forme motif chane1 infrieur (ordre lexical) chane2 chane1 suprieure (ordre lexical) chane2

UNIX : La programmation Korn Shell

16

A. Ed-Dbali Ed-

Comparaisons d'expressions arithmtiques


Test expr1 -eq expr2 expr1 -ne expr2 expr1 lt expr2 expr1 le expr2 expr1 -gt expr2 expr1 -ge expr2 Signification expr1 = expr2 expr1 expr2 expr1 < expr2 expr1 expr2 expr1 > expr2 expr1 expr2

UNIX : La programmation Korn Shell

17

A. Ed-Dbali Ed-

Structures de contrle - conditionnelle


Conditionnelle classique
if liste_commandes1; then liste_commandes2 else liste_commandes3; fi Mots cls then, else et fi prcds d'un ';' ou d'un retour la ligne Exemple : Procdure copy1 : copier le premier paramtre dans le deuxime if [[ -f "$2" ]] then echo fichier $2 existe dj 1>&2 elif [[ -f "$1" ]] then cp $1 $2 else echo fichier $1 inexistant 1>&2 fi
UNIX : La programmation Korn Shell 18 A. Ed-Dbali Ed-

Expressions conditionnelles
Expression de conjonction : cmd1 && cmd2
cmd2 excute uniquement si cmd1 est vraie quivalent : if cmd1 then; cmd2; fi Exemple : $ [[ -f fich ]] && mail durand < fich

Expression de disjonction : cmd1 || cmd2


cmd2 excute uniquement si cmd1 fausse Exemple : $ [[ -d rep ]] || mkdir rep

UNIX : La programmation Korn Shell

19

A. Ed-Dbali Ed-

Structures de contrle - aiguillage


case ... in ... esac
case valeur in val11|val12||val1x) liste_commandes1;; val21|val22||val1y) liste_commandes2;; ... valn1|valn2||val1z) liste_commandesn;; esac liste_commandesi excute si valeur est de la forme de l'une des valij Le caractre * couvre toute valeur

UNIX : La programmation Korn Shell

20

A. Ed-Dbali Ed-

Structures de contrle - aiguillage


Exemple : Procdure copy2 : si aucun paramtre donner le rpertoire courant si 1 paramtre fichier afficher son contenu si 1 paramtre rpertoire lister son contenu si 2 paramtres copy1
case $# in 0) pwd;; 1) if [[ -f "$1" ]]; then cat $1 elif [[ -d "$1" ]]; then ls -l $1 else echo erreur 1>&2; fi;; 2) copy1 $1 $2;; *) echo trop de paramtres 1>&2;; esac

UNIX : La programmation Korn Shell

21

A. Ed-Dbali Ed-

Structures de contrle - itrations


for variable in liste_valeurs do liste_commandes done
Excuter liste_commandes pour chaque valeur de variable dans liste_valeurs "in liste_valeurs" absent "in $*" (variable prend tour tour les valeurs des variables de position) Mots cls do et done prcds d'un ';' ou d'un retour la ligne
UNIX : La programmation Korn Shell 22 A. Ed-Dbali Ed-

Itrations
Exemple creer_rep : Cre une liste de rpertoires. Si un rpertoire existe, il est propos de le dtruire. for Rep in $* do if [[ -d "$Rep" ]] then echo "Dtruire $Rep (O/N) : \c" read D if [[ "$D" = [Oo]* ]] then rm -r $Rep; mkdir $Rep fi else mkdir $Rep fi done
UNIX : La programmation Korn Shell 23 A. Ed-Dbali Ed-

Itrations
while liste_commandes1 do liste_commandes2 done
Tant que liste_commandes1 est vraie (code de retour de la dernire commande est 0) excuter liste_commandes2

until liste_commandes1 do liste_commandes2; done


Excuter liste_commandes2 jusqu' ce que liste_commandes1 soit vraie
UNIX : La programmation Korn Shell 24 A. Ed-Dbali Ed-

Slection (menu)
select variable in liste_valeurs do liste_commandes done
Affiche est aligne en colonnes la liste_valeurs Utilise PS3 comme invite pour demander un choix parmi liste_valeurs (RETURN raffiche le menu) Excuter liste_commandes avec la valeur choisie mise dans variable (son rang tant dans REPLY) Fin de select par ctrl-d PS3 peut tre modifi pour la circonstance
UNIX : La programmation Korn Shell 25 A. Ed-Dbali Ed-

Chanes entre apostrophes '


''
Chane o tous les caractres spciaux sont dsactivs (le caractre ' ne peut pas y apparatre) $ echo '$PWD' $PWD $ echo $PWD /home/staff/adam $ ls 'f*.c g.sql' f*.c g.sql : No such file or directory $ ls f*.c g.sql f.c f1.c g.sql

UNIX : La programmation Korn Shell

26

A. Ed-Dbali Ed-

Chanes entre anti-apostrophes ` ou $()


`cmd` ou $(cmd)
Chane rsultat de la commande cmd $ ls f.c f1.c g.sql $ X=`date +%H`; echo $(ls) $(echo '$X') $X f.c f1.c g.sql $X 17:05:00 $ Y=$(ls *.o); echo =$Y= *.o : not found == $ Y=$(ls *.o 2>&1); echo =$Y= =*.o : not found=
UNIX : La programmation Korn Shell 27 A. Ed-Dbali Ed-

Chanes entre guillemets "


""
Chane o tous les caractres spciaux sont dsactivs sauf le dollar ($), l'anti-slash (\) et l'anti-apostrophe (`) $ echo "\"$PWD\" ou `pwd` ou '$PWD'" "/usr/bin" ou /usr/bin ou '/usr/bin' $ ls "f*.c" f*.c f*.c : No such file or directory f.c f1.c

UNIX : La programmation Korn Shell

28

A. Ed-Dbali Ed-

Caractres spciaux dans la dfinition de chanes


Dans une ligne de commande, un certain nombre de caractres sont utiliss pour, entre autres, construire des noms de fichiers : Caractre Interprtation ? caractre quelconque * chane de caractres quelconque (ventuellement vide) [ dbut de dfinition d'un ensemble [! dbut de dfinition du complment d'un ensemble ] fin de dfinition d'un ensemble ou de son complment marque d'intervalle dans un ensemble Exemples : [a-z]*.c dsigne toutes les rfrences commenant par une lettre minuscule et se terminant par .c ?[A-Z0-9]? dsigne tous les fichiers de 3 caractres dont le second est soit une lettre majuscule soit un chiffre Restrictions : Le caractre . en dbut de mot ou aprs un / ou le caractre / ne sont pas couverts par ces abrviations
UNIX : La programmation Korn Shell 29 A. Ed-Dbali Ed-

Caractres spciaux dans la dfinition de chanes


Les motifs construits par les caractres prcdents peuvent intervenir pour fournir des chanes plus sophistiques :
chane
?(motif[|motif]) *(motif[|motif]) +(motif[|motif]) @(motif[|motif]) !(motif[|motif])

signification
0 ou une occurrence de l'un des motifs 0 ou plusieurs occurrence de l'un des motifs 1 ou plusieurs occurrence de l'un des motifs 1 occurrence exactement de l'un des motif Tout motif sauf ceux donns

UNIX : La programmation Korn Shell

30

A. Ed-Dbali Ed-

Fonctions
Objectifs
Structurent les scripts Rsident en mmoire (accs plus rapide qu'un script sur disque) Dfinition :
nom_fonction () groupement_de_commandes ou function nom_fonction groupement _de_commandes Groupement_de_commandes :
{ liste_commandes; } ou ( liste_commandes )

return [n] : arrt de la fonction et retour au script appelant. n code de retour (si absent : code de la dernire commande excute dans la fonction)
UNIX : La programmation Korn Shell 31 A. Ed-Dbali Ed-

Fonctions
Appel
fct [param1 paramn] parami rfrencs par $1, , $n dans la dfinition de fct ($0 = nom de la fonction)

Autres manipulations
$ typeset f (ou $ functions) Fonctions disponibles $ typeset xf fct1 fctn Exporter des fonctions $ typeset fu fct (dans $ENV par exemple) fct n'est charge qu' l'utilisation (fct mise dans un fichier de mme nom qui appartient un des rpertoires de FPATH) $ unset -f fct1 fctn Retrait de fonctions
UNIX : La programmation Korn Shell 32 A. Ed-Dbali Ed-

Fonctions
Exemples :
psgrep () { ps -ef | grep $1 | grep -v grep; }
$ psgrep ksh (ou psgrep `whoami`) affiche toutes les lignes de processus contenant le mot ksh (ou mon nom de connexion)

modif () { [[ -w "$1" ]] && vi $1; }


Lance vi sur un fichier modifiable sinon ne fait rien

UNIX : La programmation Korn Shell

33

A. Ed-Dbali Ed-

Tableaux
Dclaration (optionnelle)
$ typeset nom_tab[taille] (taille limite 1024)

Dfinition ou rinitialisation
$ set A nom_tab champ0 champn ou $ nom_tab[0]=champ0; ; nom_tab[n]=champn

Manipulations
$ echo $T ${T[0]} ${#T[*]} ${T[*]} Affiche deux fois le premier champ ($T et ${T[0]}), le nombre d'lments (${#T[*]}) et tous les lments (${T[*]}) du tableau T $ set A Fichier $(ls) Cre le tableau Fichier avec comme contenu tous les noms des fichiers du rpertoire courant (rsultat de ls)
UNIX : La programmation Korn Shell 34 A. Ed-Dbali Ed-

Commandes internes - ., :, break, continue, cd


. (point)
Permet l'excution d'un script dans le shell courant

: (deux points)
Commande qui ne fait rien (utilise comme la valeur vraie)

break [nbr]
Sortir de la structure de contrle englobante (while, for, until et select) Si nbr est donn, sortir de nbr niveaux

continue [nbr]
Passer la prochaine itration (while, for, until et select) Si nbr est donn, passer nbr itrations plus haut

cd
Changement de rpertoire
UNIX : La programmation Korn Shell 35 A. Ed-Dbali Ed-

Commandes internes - eval


eval
Interprtation d'une ligne de commande :
Sparer les champs (interprtation des sparateurs) Isoler les chanes entre ' Substituer les variables et excuter les commandes entre ` et $() Isoler les chanes entre " Gnrer les noms de fichiers Rediriger les entres-sorties Localiser les commandes (alias, fonction, PATH)

$ eval cmd : permet de raliser la srie prcdente deux fois Exemple :


$ X='essai eval'; Y='$X'; echo $Y; eval echo $Y $X excution de echo '$X' essai eval excution de echo 'essai eval'
UNIX : La programmation Korn Shell 36 A. Ed-Dbali Ed-

Commandes internes exit, export


exit [numro]
Provoque l'arrt d'un script numro est le code de retour du script si numro absent, le code de retour est celui de la dernire commande excute

export variable[=valeur]
Permet de mettre des variables dans la liste des variables d'environnement du shell (liste des variables exportes). Cette liste est transmise aux scripts et sous shells Mme effet avec : typeset x variable[=valeur] export p : indique les variables exportes
UNIX : La programmation Korn Shell 37 A. Ed-Dbali Ed-

Commandes internes - exec


exec (deux utilisations diffrentes)
$ exec cmd
cmd remplace le shell courant. Pas de cration de sous processus

$ exec redirection
Rend effectif la redirection pour le reste des commandes Exemples :
$ exec d<fich (avec d = 0 ou d 3) Ouvre fich en entre sous le numro descripteur d Si d absent, 0 (entre standard) est prise par dfaut $ exec d>fich (avec d 1) Ouvre fich en sortie sous le numro descripteur d Si d absent, 1 (sortie standard) est prise par dfaut $ exec d<&(avec d 0) Ferme le fichier associ au numro descripteur d

10 descripteurs au maximum par processus (de 0 9)

UNIX : La programmation Korn Shell

38

A. Ed-Dbali Ed-

Commandes internes - print


print [options] [arg ]
Mme effet que la commande externe echo en paramtre. Si aucune variable n'est donne, REPLY est prise par dfaut Dans sa forme interactive, var?prompt, prompt est imprim avant la lecture Options :
-n : empche le retour la ligne aprs affichage -p : criture sur l'entre d'un co-processus lanc l'aide de |& -r ou -R : les caractres (\c, \t, etc.) sont ignors -s : crit dans le fichier historique des commandes (les arg sont supposs tre des commandes -un : crit dans le fichier de descripteur n (1 par dfaut)

UNIX : La programmation Korn Shell

39

A. Ed-Dbali Ed-

Commandes internes - read


read [options] [var?prompt] [var ]
Lire une ligne est affecter ses champs aux diffrentes variables donne en paramtre. Si aucune variable n'est donne, REPLY est prise par dfaut Dans sa forme interactive, var?prompt, prompt est imprim avant la lecture Options :
-p : lecture depuis la sortie d'un co-processus lanc l'aide de |& -s : si ce qui est lu est une commande, la mettre aussi dans l'historique -un : lire depuis le fichier de descripteur n (0 par dfaut)
UNIX : La programmation Korn Shell 40 A. Ed-Dbali Ed-

Commandes internes - read


Exemples read Var?"Invite de saisie" Lecture d'un flot de donnes ligne ligne :
Le flot provient d'un commande : cmd | { while read ligne; do TRAITER $ligne; done; } Le flot provient d'un fichier fich : exec d<fich (choisir d 3) while read u3 ligne; do TRAITER $ligne; done Si les lignes sont structures en champs, remplacer read ligne par read ch1 chn (en changeant ventuellement au pralable la variable IFS). Dans ce cas ch1 = 1er champ, , chn-1 = (n-1)me champ et chn = reste de la ligne
UNIX : La programmation Korn Shell 41 A. Ed-Dbali Ed-

Commandes internes - readonly


readonly [var[=val] ...] ou readonly p
Les variables donnes sont dornavant interdits la modification -p affiche les variables en lecture seule (une variable par ligne) selon le format : readonly var=val

return [n]
arrt de la fonction et retour au script appelant. n code de retour (si absent : code de la dernire commande excute dans la fonction) Si non invoque l'intrieur d'une fonction, comportement quivalent exit
UNIX : La programmation Korn Shell 42 A. Ed-Dbali Ed-

Commandes internes - set


set [+|- options] [+|-o paramtre ] ou set [+|-A tab] [argument ] (voir tableaux)
Positionne certains paramtres de fonctionnement du shell. Dans la plupart des cas, valide la caractristique, + la supprime

Exemple d'options :
set a : dornavant, toutes les variables affectes sont exportes set n : vrifier simplement la syntaxe des commandes set s : trie les variables de position $0, $1, etc. set u : la lecture d'une variable non initialise provoque une erreur (avec +u, la valeur d'une telle variable est la chane vide) set v : afficher, avant transformation, la commande qui va s'excuter (+v revient au mode normal) set x : (excution avec trace) afficher, aprs transformation, la commande qui va s'excuter (+x revient au mode normal). La commande affiche est prcde de l'invite PS4 set - : permet d'affecter les variables de position mme si $1 commence par un
UNIX : La programmation Korn Shell 43 A. Ed-Dbali Ed-

Commandes internes - set


L'option o :
Positionne (-) ou dsactive (+) une caractristique Quelques caractristiques :
allexport ( l'option a), noexec ( l'option n) bgnice : toutes les commandes en arrire-plan excutes avec une priorit faible emacs (ou vi) : utiliser les commandes de emacs (ou de vi) pour diter la ligne de commande ou naviguer dans l'historique ignoreeof : Ctrl-d n'arrte pas le shell (utiliser exit) noclobber : interdire les redirections > (en sortie avec cration) sur des fichiers existants (>| permet d'ignorer cette interdiction) trackall : ( l'option h) gnrer un alias interne chaque nouvelle commande lance et cherche dans PATH (au lancement suivant, la localisation n'est plus ralise
UNIX : La programmation Korn Shell 44 A. Ed-Dbali Ed-

Commandes internes shift, times


shift [n]
Dcale de n rangs gauche les paramtres de position $0, $1, etc. Si n absent dcaler d'un rang. Utile quand on a trait n premiers paramtres (en gnrale des options) pour commencer le traitement sur les restants.

times
Affiche le temps systme et utilisateur couls

UNIX : La programmation Korn Shell

45

A. Ed-Dbali Ed-

Commandes internes trap


trap commande signal
Capture de signaux pour des traitements spcifiques ( mettre au dbut du script avant toute mission de signaux) A la rception de l'un des signaux en paramtre :
Un droutement du script est effectu commande est excute Si commande ne contient pas exit, retour au script au point o le signal a eu lieu

commande peut tre la chane vide


trap "" INT TERM le programme qui contient cette ligne devient insensible aux signaux INT et TERM

Permet aussi d'intercepter des signaux de fin prcoce de shell (ex: ^c : rception de INT) pour fermer ou dtruire proprement des fichiers "cmd" value la lecture de trap ('cmd' l'excution)
UNIX : La programmation Korn Shell 46 A. Ed-Dbali Ed-

Commandes internes trap


Exemple :
nettoyage () { # fermer fichiers 3 et 4 et craser $TMP exec 3<&-; exec 4<&-; rm f $TMP } #A la rception de ces signaux, nettoyer et quitter trap 'nettoyage; exit 1' INT HUP TERM TMP=/tmp/`basename $0`_$$ exec 3<$1 # ouvrir $1 en entre exec 4>$2 # ouvrir $2 en sortie la suite du script $ trap (sans argument) Affiche les commandes et les signaux auxquels elles correspondent $ trap sig1 sig2 restaurer l'action par dfaut des signaux cits
UNIX : La programmation Korn Shell 47 A. Ed-Dbali Ed-

Commandes internes wait, whence


wait [job]
Bloque l'excution jusqu' ce que job soit termin Permet de synchroniser le programme avec un processus lanc en arrire plan Sans paramtre, attendre la fin de tous les processus fils lancs en arrire plan job de la forme %n (n numro du job) ou un PID

whence v nom
Indique comment le shell interprterait nom si c'tait le nom d'une commande : alias, fonction, commande interne ou fichier excutable
UNIX : La programmation Korn Shell 48 A. Ed-Dbali Ed-

Conseils de bon usage


Commencer un script shell par la chane #!chemin absolu du shell utilis (#!/bin/ksh) Mettre des commentaires pertinents (un commentaire commence par # et se termine par la fin de ligne :
Exemples de commentaires introductifs : # nom_prog : une description dtaille # usage : nom_prog options arguments # @(#) nom_prog : une brve description (version) # Auteur : liste des auteurs # Historique : dates de mise jour, La chane bizarre @(#) est fournie pour que la commande what puisse extraire une description succincte lors de l'appel de what sur nom_prog (valable pour tous les langages de dveloppement sous UNIX)

UNIX : La programmation Korn Shell

49

A. Ed-Dbali Ed-

Conseils de bon usage


Structurer le script avec des fonctions
Mettre les plus utilises par de nombreux scripts dans le fichier de dmarrage $ENV (.kshrc par exemple)

Paramtrer le script en prvoyant options et arguments Dcouper le script en 2 parties au minimum


Partie analyse des arguments du script
Reprer les options est les arguments Tester la validit des arguments spcifiques (existence, lisibilit de fichiers, bornes des entiers, etc.). Produire des messages d'erreurs standardiss : nom_prog: message court mais pertinent Utiliser des variables pour accrotre la lisibilit du script

Partie traitement
UNIX : La programmation Korn Shell 50 A. Ed-Dbali Ed-

Conseils de bon usage


Code de retour
Renvoyer toujours explicitement un code de retour document. Sa valeur est : 0 si tout s'est bien pass, 0 sinon Trs utile si le script est appel dans un autre

O installer le script
Dans un rpertoire ddi (ex : $HOME/bin) Mettre ce rpertoire dans PATH (au niveau du .profile) : export PATH=$PATH:$HOME/bin Remarque : viter de mettre le rpertoire courant '.' en dbut de PATH (problme de scurit)

En cas de manipulation de fichiers temporaires :


Penser les dtruire aprs usage (fonction mnage) Les nommer de faon unique (utiliser les valeurs $0, $$, etc.) Pour plus de clart, les manipuler travers des variables
51 A. Ed-Dbali Ed-

UNIX : La programmation Korn Shell

Mise au point d'un script shell


Options de mise au point
Verbose (set v) afficher, avant transformation, la commande qui va s'excuter Xtrace (set x) excution avec trace : afficher, aprs transformation, la commande qui va s'excuter. La commande affiche est prcde de l'invite PS4 (par dfaut "+") Noexec (set n) script lu et non excut : vrification de la syntaxe Excution en mode mise au point : $ ksh x script
UNIX : La programmation Korn Shell 52 A. Ed-Dbali Ed-

Mise au point d'un script shell


Exemple de script collectant les erreurs : $ cat collecte : export PS4='+ $LINENO + ' ksh x "$*" 2> script.err.$1.$$ $ collecte mon_script arg1 arg2 Excute mon_script et gnre un fichier d'erreurs script.err.mon_script.3245

UNIX : La programmation Korn Shell

53

A. Ed-Dbali Ed-

Diffrences entre Korn et Bourne shells


Les fonctionnalits suivantes du Korn shell ne sont pas dans Bourne shell
typeset et les attributs des variables Tableaux Tilde ~ Historique et dition des commandes Gestion des processus en arrire plan (jobs) Oprateurs (()), >|, |& Mot-cls : time, function, select, et [[]] Variables de position au del de 9 Substitution des commandes l'aide de $() Variables : ENV, FPATH, HISTFILE, HISTSIZE, LINENO, OLDPWD, PPID, PS3, PS4, PWD, RANDOM, REPLY, SECONDS, TMOUT Oprateurs : -nt, -ot, -ef, -G, -O, -S Variables en readonly et export Noms mnmoniques des signaux (INT, TERM, etc.)
54 A. Ed-Dbali Ed-

UNIX : La programmation Korn Shell

Diffrences gnrales entre tous les shells


Liste des concepts et leur prsence dans les shells existants
sh csh ksh Mcanisme de Job N O O Alliasses N O O Fonctions Shell O(1) N O Redirections E/S raisonnables O N O Pile de rpertoires N O O Historique des commandes N O O dition de la ligne de commande N N O dition VI de la ligne de commande N N O dition EMACS de la ligne de commande N N O Mcanisme ~ N O O Complte les noms des fichiers N O(1) O Complte les noms des utilisateurs N O O Complte les noms des machines N O O Complte les commandes de l'historique N N N Compltion entirement programmable N N N Co-Processus N N O
UNIX : La programmation Korn Shell 55

bash tcsh zsh O O O O O O O N O O N O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O N O O N N O


A. Ed-Dbali Ed-

Diffrences entre shells


sh Arithmtique prdfinie N Invites modifiables (facilement) N Correction de l'orthographe des commandes N Syntaxe sous-jacente sh Disponible gratuitement N Peut traiter un grand nombre d'arguments O Peut viter des fichiers de dmarrage N Peut spcifier des fichiers de dmarrage N Tableaux N "trap" complet des signaux O "no clobber" possible (redirections) N Variables locales dans les fonctions N
(1) (2) (3)

csh ksh bash tcsh zsh O O O O O N O O O O N N N O O csh sh sh csh sh N N(2) O O O N O O O O O N O N O N O(3) O N N O O N O O N O O N O O O O O O N O O N O

N'existait pas dans les premires versions Produit pdksh mais incomplet, pour le moment, par rapport la version de AT&T En dfinissant la variable ENV qui contient le nom du fichier excuter
56 A. Ed-Dbali Ed-

UNIX : La programmation Korn Shell

Entres/sorties standards
3 fichiers ouverts par le Shell:
entre standard : clavier, entre des commandes (stdin)
descripteur du fichier stdin : 0

sortie standard : cran, sortie des rsultats (stdout)


descripteur du fichier stdout : 1 descripteur du fichier stderr : 2

sortie d'erreurs : cran, affichage des erreurs ventuelles (stderr) Possible d'en ouvrir d'autres en affectant des descripteurs > 2 (exec)

En temps normal :

cran

clavier stdin Commande lit ses donnes dans l'entre standard (clavier) et affiche ses rsultats et ses erreurs sur l'cran
UNIX : La programmation Korn Shell 57

stderr Commande stdout


A. Ed-Dbali Ed-

Rediriger les entres/sorties la famille Bourne-Shells


symbole < > >> 2> 2>> << n>&m signification redirige l'entre standard redirige la sortie standard (cration) redirige la sortie standard (ajout) redirige la sortie d'erreurs (cration) redirige la sortie d'erreurs (ajout) redirige de manire spciale l'entre standard associer le fichier de descripteur n, au fichier de descripteur m

Exemples : $ cat fich1 fich2 ... fichn > fich_res concatner les fichi dans un nouveau fichier fich_res $ mail Michel.Durand@univ-orleans.fr < lettre envoyer un courrier, Michel Durand, dont le texte est le contenu de lettre $ ls -l *.tex *cal*.c 1> ls_res 2>&1 rediriger la sorite standard et la sortie des erreurs vers ls_res
UNIX : La programmation Korn Shell 58 A. Ed-Dbali Ed-

Redirection spciale de l'entre standard


Dfinition
cmd << [-]mot_cl texte en entre saisit directement mot_cl
Tout ce qui se trouve entre les 2 mot_cl (dit here document) ou entre mot_cl et la fin du fichier est l'entre standard de cmd Le 2me mot_cl doit dbuter la ligne et y tre seul mot_cl est une chane arbitraire Aucune substitution n'est opre sur mot_cl Les caractres spciaux ont une signification dans le here document sauf si mot_cl contient un caractre 'quott' Si prcde mot_cl les tabulations du here document sont supprimes
UNIX : La programmation Korn Shell 59 A. Ed-Dbali Ed-

Redirection spciale de l'entre standard


Exemple : menu_du_jour
cat << %FIN% Voici le menu du : $(date "+%d/%m/%y") Entre -> $1 Plat -> $2 Dessert -> $3 %FIN%

UNIX : La programmation Korn Shell

60

A. Ed-Dbali Ed-

Informations gnrales sur le systme - w


w [-l|-s] [-u] [user]
Donne un rsum sur l'activit du systme
Premire ligne : l'heure, depuis quand le systme a dmarr, le nombre d'utilisateurs, la charge moyenne (nombre de processus dans la file d'attente Prt) en trois intervalles de temps. En suite : informations sur les utilisateurs connects et ce qu'il font. Options :
-s : peu d'information sur les utilisateurs (dfaut -l: dtail) -u : n'afficher que la premire ligne (w -u uptime)

Si user est donn, limiter les infos cet utilisateur

who donne des informations de mme type


UNIX : La programmation Korn Shell 61 A. Ed-Dbali Ed-

Informations gnrales sur le systme statistiques d'utilisation des ressources iostat [disque ...] [sec [nbr]]
Donne nbr fois tous les sec secondes des informations relatives aux E/S sur disque et l'utilisation de la cpu. Exemple :
# iostat 5 tty ds1 ds2 ds3 ds4 cpu tin tout kps tps kps tps kps tps kps tps us ni sy id 1 52 2 0 1 0 13 1 4 1 8 0 9 83 1 16 7 1 2 0 5 2 2 0 3 0 10 87 0 0 0 0 0 0 0 0 0 0 0 0 1 98 2 2 2 1 0 0 50 6 0 0 9 0 9 82 1 191 2 1 0 0 47 6 0 0 8 0 9 83 tin et tout resp. nombre de caractres lus et crits sur les terminaux par seconde kps et tps (pour les disques) resp. le nombre de Ko transfrs par seconde et le nombre de transferts par seconde us et ni pourcentage d'utilisation cpu par l'utilisateur (ni si chagement de priorit (ni par nice) nice) sy et id pourcentage en mode systme (sy) et inactivit (id) (sy) (id)
UNIX : La programmation Korn Shell 62 A. Ed-Dbali Ed-

Informations gnrales sur le systme statistiques d'utilisation des ressources vmstat [options] [sec [nbr]]
Donne nbr fois tous les sec secondes des informations sur l'utilisation de la mmoire virtuelle (mais aussi: processus, pagination, E/S disques, interruptions et cpu) -s affiche plus d'information sur la mmoire
$ vmstat 5 procs memory page disk faults cpu r b w swap free re mf pi po fr de sr s0 s1 s2 s3 in sy cs us sy id 0 0 0 11456 4120 1 41 19 1 3 0 2 0 4 0 0 48 112 130 4 14 82 0 0 1 10132 4280 0 4 44 0 0 0 0 0 23 0 0 211 230 144 3 35 62 0 0 1 10132 4616 0 0 20 0 0 0 0 0 19 0 0 150 172 146 3 33 64 0 0 1 10132 5292 0 0 9 0 0 0 0 0 21 0 0 165 105 130 1 21 78 1 1 1 10132 5496 0 0 5 0 0 0 0 0 23 0 0 183 92 134 1 20 79 1 0 1 10132 5564 0 0 25 0 0 0 0 0 18 0 0 131 231 116 4 34 62 1 0 1 10124 5412 0 0 37 0 0 0 0 0 22 0 0 166 179 118 1 33 67 1 0 1 10124 5236 0 0 24 0 0 0 0 0 14 0 0 109 243 113 4 56 39
^C
UNIX : La programmation Korn Shell 63 A. Ed-Dbali Ed-

L'diteur vi
$ vi fichier
insertion : i niveau curseur, a aprs, I dbut ligne, A fin ligne, o ligne aprs, O ligne avant Effacement : x : caractre dw : fin mot dd : ligne d0 : dbut ligne d$ : fin ligne p : rtablir aprs
curseur

Commandes : :f : infos sur fichier en cours ^g : idem :w fich : sauvegarde dans


fich :q : quitter :wq : sauver et quitter ZZ : idem :q! : quitter mme non sauv :e fich : charger fich :r fich : inclure fich aprs ligne courante :! cmd_shell : excuter cmd_shell :r! cmd_shell : excuter et insrer rsultat de cmd_shell /motif : recherche de motif ^l : rafrachit l'cran

ESC : revenir en mode commande

Dplacement : caractres : h (gauche), l (droite), j (bas), k (haut) mots : b (gauche), w (droite) lignes : 0 (dbut), $ (fin) pages : ^d (bas), ^u (haut)

Exemple : $ vi -c ":r fich2" fich1 ( charge le fichier fich1 en incluant sa fin le contenu de fich2 )
UNIX : La programmation Korn Shell 64 A. Ed-Dbali Ed-

Excution diffre ou priodique


daemon cron
Processus horloge (clock daemon) Gre l'excution de requtes lances l'aide des commandes :
at : Excution un moment donn batch : Excution selon charge crontab : Excution priodique

UNIX : La programmation Korn Shell

65

A. Ed-Dbali Ed-

Excution diffre : at
at [-m] temps [date] [+incrment] [fich]
Excute la procdure Shell fich au moment donn par temps et la date donne par date, ventuellement avec un dcalage dans le temps donn par incrment (nombre suivi par une unit) -m : un courrier (mail) est adress l'utilisateur la fin de l'excution diffre Formats :
temps : h, hh, hhmm, h:m, h:mm, hh:m, hh:mm ou : now, noon, midnight unit de l'incrment : minutes, hours, days, weeks, months

Exemples : $ at now + 5 minutes paye o paye est un programme qlq ou une procdure Shell $ at 16:45 lpr fichier; mail adam < message (puis ^d) o message est un fichier qui contient un message destination de l'utilisateur adam
UNIX : La programmation Korn Shell 66 A. Ed-Dbali Ed-

Excution diffre : at
at -l [N job]
La liste des commandes enregistres est affiche Exemple : $ at -l 714328506.a Fri Dec 1 14:31:00 1995 714328507.a Mon Dec 4 18:20:00 1995

at -r N job ...
Annuler les demandes enregistres donnes par leurs N job Exemple : $ at -r 714328507.a $ at -l 714328506.a Fri Dec 1 14:31:00 1995

UNIX : La programmation Korn Shell

67

A. Ed-Dbali Ed-

Excution diffre - batch


batch [-m] [fich]
Excuter en diffr les commandes de la procdure Shell fich. L'heure de l'excution sera fixe par le systme en fonction de la charge. -m : comme pour la commande at Le processus est stock sur une file d'attente diffrente des tches lances par at (queue : b) batch at now

UNIX : La programmation Korn Shell

68

A. Ed-Dbali Ed-

Excution diffre - les droits


at.allow
fichier /var/spool/cron/at.allow contient les noms des utilisateurs autoriss excuter at et batch. Si at.allow n'existe pas at.deny

at.deny
fichier /var/spool/cron/at.deny contient les noms des utilisateurs interdits excuter at et batch. Si at.deny vide tout le monde est autoris. Si at.allow et at.deny inexistants seul root est autoris

qui peut donner ou retirer les ces droits ?


root un seul utilisateur par ligne dans at.allow et at.deny

UNIX : La programmation Korn Shell

69

A. Ed-Dbali Ed-

Excution priodique - crontab


crontab [ fich ]
copier fich (fichiers des jobs priodiques) dans /var/spool/cron/crontabs sous le nom de l'utilisateur /var/spool/cron/crontabs rpertoire des fichiers de travaux priodiques (un fichier par utilisateur autoris)

crontab -e
diter (pour modification) le fichier des jobs.

crontab -l
Lister (sur l'cran) le contenu du fichier des jobs.

crontab -r
Retirer (du rpertoire des travaux priodiques) le fichier des jobs.

cron.allow et cron.deny
Fichiers d'autorisation et d'interdiction du service cron.

UNIX : La programmation Korn Shell

70

A. Ed-Dbali Ed-

Excution priodique fichier des jobs priodiques


Structure des lignes
minutes heures jour_du_mois mois jour_de_semaine commande
minutes : 0 59 ; heures : 0 23 ; jour_du_mois : 1 31 ; mois : 1 12 ; jour_de_semaine : 0 6 (0 = dimanche) ; commande : commande excuter au moment voulu

Exemple
Soit le fichier des jobs suivant : 0 0 1 3 5 cmd1 30 0 15 2 1 cmd2 Excuter cmd1 minuit (0 0) tous les vendredis (5) et tous les premiers (1) du mois de mars (3) Excuter cmd2 minuit trente (30 0) tous les lundis (1) et tous les quinze (15) du mois de fvrier (2)
UNIX : La programmation Korn Shell 71 A. Ed-Dbali Ed-

Excution priodique fichier des jobs priodiques


Groupement de critres
Les champs dfinissant le temps peuvent tre :
une liste de valeurs spares par des virgules (n1, n2, ...) un intervalle de valeurs (n1-n2) une toile (* = toutes les valeurs sont possibles)

Exemple 0 0 * * * find /home -name core -exec rm -f {} \; 30 0 * * 1-5 tar cvf /dev/rst0 /home 0 1 * * 0,6 tar cvf /dev/rst0 / 1 : dtruire tous les jours minuit les fichiers core sous l'arborescence /home ; 2 : faire une sauvegarde du rpertoire /home tous les jours de la semaine de travail (lundi-vendredi) et ce minuit trente ; 3 : faire une sauvegarde de tout le disque les 2 jours du week-end 1h du matin.
UNIX : La programmation Korn Shell 72 A. Ed-Dbali Ed-