Académique Documents
Professionnel Documents
Culture Documents
Jean-Marc LACOSTE
Ambre Systems
3 chemin des Friches
Hameau de La Brosse
91 640 JANVRY
http://www.ambre-systems.com
Juillet 2005. Jean-Marc LACOSTE - Ambre-Systems
Ce document est protégé par un copyright. Aucune partie de ce document ne peut être reproduite sans
l’autorisation préalable et écrite de Ambre-Systems et de Jean-Marc LACOSTE (loi du 11 mars 1957,
article 40, alinéa 1). Une reproduction sans l’accord de l’auteur par quelque procédé que ce soit constituerait
une contrefa¸con sanctionnée par les articles 425 et suivants du Code Pénal.
1 Introduction 1
1.1 Principes fondamentaux de la programmation shell . . . . . . 2
1.2 Documentation disponible . . . . . . . . . . . . . . . . . . . . 3
1.2.1 Site Internet . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.2 Livres . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Programmation shell 17
3.1 Instructions conditionnelles et tests . . . . . . . . . . . . . . . 18
3.1.1 L’instruction if . . . . . . . . . . . . . . . . . . . . . . 18
3.1.2 Instructions conditionnelles composées : if imbriqués . . 18
3.1.3 Instructions conditionnelles compactes : opérateurs && et || 19
3.1.4 La commande test . . . . . . . . . . . . . . . . . . . . 19
3.1.5 Enrichissement de la commande test du Korn-Shell . . 20
3.2 Traitement sur flux : les boucles . . . . . . . . . . . . . . . . . 21
3.2.1 La boucle for . . . . . . . . . . . . . . . . . . . . . . . 21
3.2.2 Les boucles while et until . . . . . . . . . . . . . . . . 21
3.3 Lectures au clavier : read . . . . . . . . . . . . . . . . . . . . . 22
juillet 2005 - Ambre systems - Programmation Shell sous UNIX- SHL - JML/07-2005
TABLE DES MATIÈRES
juillet 2005 - Ambre systems - Programmation Shell sous UNIX- SHL - JML/07-2005
1
Chapitre 1
Introduction
Objectifs
Rappels sur les principes d’un système d’exploitation
Rappels sur certaines commandes de base
Rappel sur l’utilisation du manuel
Complexe et puissant
On souhaite prsenter l’essentiel des syntaxes du shell telles qu’on les utilise
classiquement dans des scripts ”professionnels”. En ce sens, on ne prtend
pas tre exhaustif et couvrir l’intgralit de certaines tournures syntaxiques.
Ce document comporte, en tant que tel, relativement peu d’exemples car il
sera accompagn, par ailleurs, d’un nombre important d’exercices de mise en
uvre.
On ne fera plus forcment la distinction entre le traditionnel ”Bourne-shell”
et les extensions apportes par le ”Korn-shell” car on suppose que celui-ci
est largement standardis aujourd’hui et que son utilisation, dans le cadre de
scripts d’entreprise, est tout fait ”dans les murs”.
Enfin, la version ”ksh93” ( dernire volution du langage ) n’est pas prsente
car elle n’est pas souvent disponible dans les implmentations commerciales
d UNIX.. Le site Internet ”www.kornshell.com” donne des prcisions sur ce
point et permet de rcuprer ventuellement des versions binaires du ”ksh93”
qui tarde s’imposer comme standard officiel.
Complexe et puissant
1.2.2 Livres
The New KornShell Command and Programming Language
( Morris Bolksy & David Korn , Prentice Hall, 1995 )
Learning the KornShell
( Bill Rosenblatt , O’Reilly & Associates, 1993 )
Korn Shell Programming Tutorial ( Barry Rosenberg ,
Addison-Wesley, 1991 )
Langages de scripts sous Linux ( Blaess, Eyrolles, 12/2001 )
Unix nieme ed JM Rifflet
Chapitre 2
Objectifs
Rappels sur l’entrée en session
Fichiers de démarrage
Mode commande
Entrée en session
Fin de session
Bourne-shell
C-shell
Korn-shell
Posix Shell ( version normalisée du Korn-Shell retenue par
l’organisme X/Open )
Bash ( pour Bourne Again Shell : le shell de Linux )
tcsh
Z-shell
$ set |more
LANG=C
PATH=/usr/bin :/usr/bin/X11
EDITOR=/usr/bin/vi
...
$ env |more
LANG=C
PATH=/usr/bin :/usr/bin/X11
EDITOR=/usr/bin/vi LOGNAME=stage1
MAIL=/var/mail/stage1
SHELL=/usr/bin/ksh
TIMEOUT=0
HOME=/home/stage1
...
TERM=vt100
PWD=/home/stage1
TZ= :CEST
...
$ variable=valeur
$ export variable
$ env
...
$ variable=valeur
Variable Description
PATH Liste des noms de répertoires dans lesquels le système cherche
les commandes
PS1 Prompt principal ( par défaut )
PS2 Prompt secondaire ( >par défaut )
Le prompt secondaire apparaı̂t si la commande doit se
continuer sur la ligne suivante
TERM Type du terminal ( émulation )
Une bonne valeur est nécessaire notamment au bon
fonctionnement de vi
EDITOR Editeur indirect utilisé par certains utilitaires nécessitant une
édition
HOME Nom complet du répertoire de connexion
LOGNAME Nom de connexion
PWD† Nom du répertoire courant
Cette variable est tenue à jour par la commande cd
OLDPWD† Nom du répertoire courant précédent
( On peut utiliser la commande cd - pour y retourner )
PPID† Valeur du PID du processus père
TMOUT † Nombre de secondes d’inactivité, sous le prompt du shell,
avant déconnexion
( TMOUT=0 - pas de déconnexion )
( : Variables spécifiques au Korn-shell )
Autres variables utiles gérées par le shell
Variable Description
$ PID du shell interpréteur
! PID du dernier fils lancé en arrière-plan
? Code de retour de la dernière commande appelée
$ PS1=’$PWD $ ’
/home/stage1 $ cd ..
/home $ cd
$ PS2=’suite : ’
echo "bonjour cher
suite : ami"
bonjour cher
ami
$
$ .[ !.]*
.profile
.sh history
$ rep=‘pwd‘
$ echo "Repertoire courant : $rep"
Repertoire courant : /home/stage1
Possibilité de
banaliser et ‘
Chapitre 3
Programmation shell
Objectifs
xxx
/etc/security/passhistory
3.1.1 L’instruction if
Syntaxe if commande then liste de commandes fi
ou if commande ; then liste de commandes fi
ou
if commande then liste de commandes else liste de commandes fi
Note : Il est possible de placer plusieurs commandes après le ”if” . Dans ce
cas, le test prend en compte le code retour de la dernière de ces commandes.
if test -f $1
then
echo "$1 est un fichier ordinaire"
elif [ -d $1 ]
then
echo "$1 est un repertoire"
elif [ -L $1 ]
then
echo "$1 est un lien symbolique"
else
echo "Ni fichier ordinaire, ni repertoire, ni lien symbolique"
fi
if test -f $1 -a -x $1
then
echo "$1 est un fichier ordinaire et executable"
fi
midi=12
heure=‘date ’+%H’‘
if [ ! -d $1 -a ! -L $1 ] ; then
echo "$1 ressemble a un fichier ordinaire"
fi
#! /usr/bin/ksh
subsectionInstructions de branchement
Il est possible d’utiliser des instructions de branchement pour sortir
brutalement des boucles ou pour sauter les instructions restantes du corps
de boucle :
break [ n ] Quitter brutalement une boucle. L’éventuel paramètre n permet
de quitter n niveaux de boucles imbriquées.
continue [ n ] Retourner au test ( while et until ) , passer à la valeur
suivante ( for ). ( éventuellement pour n niveaux )
Exemples :
Ne pas faire la deuxième partie du traitement pour la 5ème itération de la
boucle :
#!/usr/bin/ksh
echo "Entrez la valeur : \c"
read var
#!/usr/bin/ksh
echo "Entrez les valeurs : \c"
read i j k
echo "valeur de i : $i"
echo "valeur de j : $j"
echo "valeur de k : $k"
Exécution :
$ prog.ksh
Entrez les valeurs : 12 4 143 (saisie clavier)
valeur de i : 12
valeur de j : 4
valeur de k : 143
a=5 ; b=11
mult=‘expr $a \* $b‘
div=‘expr $a / $b‘
integer peut être utilisée pour déclarer des variables comme des entiers ;
cela permet de btir une expression ”entière” directement :
integer i=0 i=i+1
Note : integer est un alias de la commande typeset i revue plus tard dans
le support.
3.5 Branchements
3.5.1 Instruction case
case valeur in
motif1) liste_de_commandes
;;
motif2) liste_de_commandes
;;
.......
esac
case $# in
1|2) echo "On a recu 1 ou 2 arguments"
echo "on enchaine apres l’aiguillage"
;;
3) echo "On a recu 3 arguments"
echo "on enchaine apres l’aiguillage"
;;
*) echo "Mauvais appel, il faut 1 ou 2 ou 3 arguments"
exit 1
;;
esac
particulier le seul moyen propre de lire un fichier texte ligne à ligne dans un
script.
On dispose également des notations <&- et >&- pour fermer les
descripteurs :
exec <&- Fermeture du descripteur de fichier n exec >&- Fermeture du
descripteur de fichier n
Exemple de syntaxe
#! /usr/bin/sh
#Ouverture du 1er fichier en lecture
exec 3< fic1
#Ouverture du 2eme fichier en ecriture
exec 4> fic2
#Lecture ligne par ligne depuis le 1er fichier
while read <&3 ligne
do
#Ecriture sur la sortie standard
echo $ligne
echo "Copier(o/n - lecture vide pour sortir)? \c"
#Lecture depuis lent\’ee standard
read rep
if test -z "$rep
then
break
fi
if test "$rep" = o
then
#Ecriture dans le 2eme fichier
echo $ligne >&4
fi
done
#!/usr/bin/ksh
#Ouverture du 1er fichier en lecture
exec 3< fic1
#Ouverture du 2eme fichier en ecriture
exec 4> fic2
#Lecture ligne par ligne depuis le 1er fichier
while read -u3 ligne
do
#Ecriture sur la sortie standard
print $ligne
print "Copier(o/n - lecture vide pour sortir)? \c"
#Lecture depuis lent\’ee standard
read rep
if test -z "$rep"
then
break
fi
if test "$rep" = o
then
#Ecriture dans le 2eme fichier
print -u4 $ligne
fi
done
Exemple :
#!/usr/bin/sh
# Exemples d’utilisation de shift pour afficher le premier
# argument et le dernier
e-center> who -r
. run-level 2 Jun 21 14:10 2 0 S
e-center> set ‘who -r‘
e-center> echo $5 $4 $6
21 Jun 14:10
Note : Avec deux signes –, lopérateur set permet, en une seule commande,
de libérer tous les paramètres de position
e-center> set --
e-center> echo $*
ksh: *: parameter not set
e-center>
trap 2 3
trap - 2 3
print et printf La commande ”print” veut mettre fin aux diverses variantes
de la commande echo Elle accepte les caractères conventionnels suivants :
\a Signal sonore \n Saut de ligne \b Retour arrière \r Retour chariot \c
Pas de saut de ligne \t Tabulation \f Effacement d’écran ou saut de page
\v Tabulation verticale
print intégrée au Korn-Shell possède une option u permettant de préciser le
descripteur à traiter. L’option -u2 permet d’écrire sur l’erreur standard :
e-center> print -u2 "Ceci est un message d’erreur"
Ceci est un message d’erreur
e-center>
eval Le shell étend les arguments de ”eval” en les séparant par un espace
puis traite la chaı̂ne résultat comme une commande. Cette double
évaluation est utile lorsque les arguments de ”eval” contiennent des
symboles de redirection ou des substitutions de variables
Quelques exemples
e-center> var=toto ; toto=100
e-center> print \$$var
$toto
e-center> eval print \$$var
100
e-center> whence l
/usr/bin/ls -al
e-center> whence -v l
l is an alias for /usr/bin/ls -al
e-center>
Exemple
{\scriptsize{\begin{verbatim}
e-center> sleep 20 &
[1] 11902
e-center> wait 11902
e-center>
3.7 Fonctions
3.7.1 Principe et propriétés
Une fonction est un sous-programme qui peut être appelé de la même
manière quun commande depuis le programme principal.
Syntaxe function nom { ......... }
NB : L ”ancienne syntaxe” compatible Bourne-shell est aussi disponible :
nom ( ) { .......... }
Pour pouvoir être appelée par un script, une fonction doit être disponible
dans le shell interpréteur du script. Pour cela, le moyen le plus simple
consiste à écrire la fonction dans le même fichier que le programme
appelant. Nous verrons par la suite des solutions permettant de partager
des fonctions entre programmes.
Les fonctions peuvent :
- Recevoir des arguments ( qui seront traités comme des paramètres de
position ) , - Modifier un argument re¸cu, - Retourner une valeur via
linstruction ”return n” ( qui positionnera ? à la valeur de n ) , - Utiliser
des variables locales définies via linstruction ”typeset” .
Transmission d’arguments
Le programme appelant la fonction peut lui fournir des arguments. Ils
seront récupérés par les variables 1, 2, 3 qui deviennent donc locales à la
fonction rendant les arguments passés au programme inaccessibles.
Exemple :
#!/usr/bin/ksh
function f
{
echo $1 $2
}
echo bonjour
f marseille paris
Execution :
e-center> prog.ksh
bonjour
marseille paris
Exécution :
e-center> prog.ksh
bonjour
debut de l’execution de la fonction
saisir la valeur de var : 1250
fin de l’execution de la fonction
valeur de var dans le programme principal : 1250
Exécution :
e-center> proc.ksh
bonjour
pas darguments pour f
code retour de f : 1
fin
Exemple :
#!/usr/bin/ksh
function f
{
typeset var=marseille
echo "valeur de var dans f : $var"
}
echo bonjour
var=paris
f
echo "valeur de var dans proc : $var"
echo fin
Exécution :
e-center> proc.ksh
bonjour
valeur de var dans f : marseille
valeur de var dans proc : paris
fin
Partage de fonctions
Il est possible de partager des fonctions entre différents programmes shell,
suivant 2 modes : statique ou dynamique
Partage statique
Le principe est de rendre la fonction disponible dans le shell interpréteur du
nouveau programme, en for¸cant son chargement. Cette opération est réalisée
à l’aide de l’opérateur . (point) L’inconvénient principal de cette méthode
est le possible chargement dans le shell interpréteur de fonctions inutiles.
Exemple :
Utilisation :
Exécution :
e-center> prog.ksh
Appel de f :
Bienvenu dans f !
fin
Utilisation :
e-center> cat prog.ksh
#!/usr/bin/ksh
. $ENV
echo "appel de f : "
f
echo fin
Exécution :
e-center> prog.ksh
appel de f :
Bienvenu dans f !
fin
e-center>
Chapitre 4
Objectifs
xxx
/etc/security/passhistory
Les filtres sont des utilitaires standards, présents sur tous les systèmes Unix.
Ils permettent de multiples traitements sur les fichiers de texte ( organisés
en lignes ) et constituent des outils très intéressants, aussi bien pour le
développeur que pour l’utilisateur.
Leur appellation provient du fait quils apparaissent assez souvent dans des
”pipelines” pour mettre en forme des résultats de commandes.
Ces résultats sont écrits sur la sortie standard. On utilise des redirections
pour les archiver dans des fichiers.
Fin de ligne
. Présence dun caractère quelconque
[caractères] Un caractère parmi un ensemble donné
[ caractères] Un caractère ne figurant pas dans l’ensemble
* Un nombre quelconque d’apparitions d’un caractère ( éventuellement
aucune apparition )
\Annuler la sémantique dun caractère dans lexpression
Les expressions régulières enrichies introduisent des caractères
supplémentaires :
+ Un nombre quelconque d’apparitions d’un caractère ( au moins une
apparition )
? Aucune ou une seule apparition d’un caractère
( ) Regroupement de composants
|Ou
NB : Certaines expressions régulières enrichies ne sont pas utilisables avec
sed et awk. Elles sont accessible avec le grep conforme à la norme XPG4.
Quelques exemples à déchiffrer
[abc]
a b ou c en début de chaı̂ne
[ abc] tout caractère sauf a b et c en début de chaı̂ne
[ ] tout caractère autre que en début de chaı̂ne
ab ?c ac ou abc
(ab)+c abc ou ababc ou abababc etc
ab—cde * ab en début de chaı̂ne ou cde suivi d’espaces éventuels en fin
de chaı̂ne
[0-9]+ chaı̂ne constituée uniquement de chiffres
-f fichier Les expressions cherchées sont décrites dans un fichier ( une par
ligne )
Notations fréquentes et utiles
Ligne vide ( un début et une fin )
. Ligne non vide
.* ”Reste de la ligne” ou ”ligne complète” suivant le contexte
Quelques exemples
$ grep ’`abc’ fichier Lignes commenant par la chaı̂ne ”abc”
$ grep E ’`abc’ fichier Idem
$ grep F ’`abc’ fichier Lignes contenant la chaı̂ne ” abc”
$ grep ’`[abc]’ fichier Lignes commenant par a ou b ou c
$ grep ’`[`0-9]’ fichier Lignes ne commenant pas par un chiffre
$ grep ’abc.$’ fichier Lignes se terminant par la chaı̂ne ”abc” suivie
dun caractère quelconque
$ grep E ’`[0-9]+$’ fichier Lignes constituées d au moins un et
uniquement de chiffres.
$ grep -n ’`’ fichier Numéroter toutes les lignes ( toutes les lignes
ont un début )
$ grep -f motifs fichier Recherche des expressions régulières
indiquées dans le fichier ”motifs”
$ grep -i ’expr *$’ fichier Lignes se terminant par la chaı̂ne ”expr”
( minuscules ou majuscules ) suivie dun nombre quelconque despaces
$ grep -e ’`abc’ e ’ef *$’ fichier Lignes commenant par la
chaı̂ne ”abc” ou bien se terminant par la chaı̂ne ”ef” suivie dun nombre
quelconque despaces
$ grep -E ’`abc|ef *$’ fichier Idem
Chapitre 5
Objectifs
xxx
/etc/security/passhistory
Ce filtre est un diteur non interactif qui copie les fichiers d’entre sur la
sortie standard aprs leur avoir appliqu un certain nombre de commandes.
sed [-n] ’commandes sed’ fichiers... ou sed [-n] -f fichier commandes fichiers...
Syntaxe des commandes sed et principe de fonctionnement
[ adresse1[,adresse2] ]action[arguments]
Les crochets indiquent un aspect facultatif et napparaissent pas dans les
commandes. Tous ces lments ne sont spars par aucun espace. En labsence
dadresses de slection, laction a lieu sur toutes les lignes des fichiers dentre.
Laction par dfaut est dafficher la ligne sur la sortie standard. L’option -n
permet de supprimer cette sortie systmatique des lignes.
Une adresse peut tre :
- Un numro de ligne - Le caractre dsignant la dernire ligne - Une
expression littrale ou rgulire entre deux caractres /
Quelques actions usuelles
d Ne pas afficher la ligne p Afficher la ligne ( sutilise souvent avec l’option
-n ) q Abandonner le traitement s/expr1/expr2/ Remplacer la premire
expression par la seconde, une seule fois par ligne s/expr1/expr2/g
Remplacer la premire expression par la seconde, plusieurs fois par ligne si
ncessaire s/expr1// Supprimer l’expression s/expr1/...&.../ Expanser la
premire expression ( elle-mme + ”quelque chose” ) ( La notation & signifie
”reprendre la premire expression” ) = Afficher le numro de ligne
Quelques exemples
sed ’s/monsieur/madame/g’ fichier Remplacer une chane par une autre
plusieurs fois par ligne
sed ’s/ / /’ fichier Dcaler le dbut de chaque ligne par des espaces
sed ’/./s/ / /’ fichier Idem uniquement sur les lignes non vides
sed -n ’/expression/ !p’ fichier Afficher les lignes ne contenant pas
lexpression ( Le ! indique la ngation de lexpression )
sed -n ’20,30p’ fichier Afficher les lignes de numro 20 30
sed ’1,10d’ fichier Ne pas afficher les 10 premires lignes
sed -n ’/./p’ fichier Afficher uniquement les lignes non vides
sed ’/ /d’ fichier Mme traitement
sed ’/expression/q’ fichier Afficher jusqu trouver une expression donne
sed -n ’/expression/=’ fichier Afficher les numros des lignes contenant une
expression donne
sed ’s/[0-9][0-9]*/(&)/g’ fichier Mettre entre parenthses les nombres entiers
plusieurs fois par ligne si ncessaire
14560 cd5 Rene Pervenche 5400 cd3 Paul martinez 5600 cd2 Andre dupond
650 cd5
Soit le fichier prog contenant les instructions suivantes :
= += -= *= /= %= ˆ= Affectation
? : Si Alors Sinon
| | Ou logique
&& ET logique
˜ !˜ Concordance ( ou non ) avec une expression rgulire
< <= > >= != = = Oprateurs de comparaison
+ -Addition, soustraction
* / % Multiplication, division, modulo
+ - ! Plus unaire, moins unaire, NON logique
ˆ ( ou ** ) Puissance
++ --Incrmentation et dcrmentation
Annexe A
Objectifs
Rappels sur les principes d’un système d’exploitation
Rappels sur certaines commandes de base
Rappel sur l’utilisation du manuel
Index-51
Annexe A
Complexe et puissant
Index-52
Annexe A
Appel : tp3.ksh
Index-53
Annexe A
Index-54
Annexe A
Index-55
Annexe A
Index-56
Annexe A
Index-57
Annexe A
Les critères suivants sont proposés : nom Le script appelle loption -name de
find
proprietaire Le script appelle loption -user de find Le script vérifie qu’on
donne un ”login” existant
dates Le script propose dans un sous-menu lune des options de find
suivantes : -mtime , -atime ou -newer
Pour chaque critère, le script fait la saisie au clavier de l’argument
correspondant à loption choisie Le script affiche la commande
correspondant aux choix de l’utilisateur Celle-ci est lancée après
confirmation de lutilisateur
Le script permet dinterrompre lexécution de la commande find sans quitter
le programme complet
Appel : atelier7.ksh
Index-58