Le Shell

Transcription

Le Shell
Travaux Pratiques d'Unix
DESS E&A 2003/2004
Le Shell
• Après une entrée en session (login) sur un système Unix/Linux vous êtes pris en charge par un
interpréteur de commande (shell) (le Bourne-shell (sh), le C-shell (csh), le Korn-shell (ksh),
le Bash (bash),…). L'interpréteur de commande est l'interface entre l'utilisateur et le système
d'exploitation. Il a pour rôle de traduire les commandes saisies par l'utilisateur afin que le
système puisse les exécuter.
• Il est possible de créer des fichiers contenant une suite de commandes. Ces fichiers sont appelés
des scripts et peuvent être exécutés, ce qui évite la réécriture de ces commandes. De surcroît les
interpréteurs de commandes possèdent un véritable langage de programmation interprété
permettant de réaliser des programmes de commandes complexes. Par extension, ce langage est
aussi appelé Shell.
La programmation en Shell
Comme tout langage de programmation conventionnel, le Shell comporte des instructions
et des variables. Les noms de variables sont des chaînes de caractères ; leurs contenus sont
également des chaînes de caractères.
L'assignation d'une valeur à une variable se fait par un nom ; la référence à cette variable
par son nom précédé du caractère $, comme dans :
mavariable=bonjour
echo $mavariable
assignation
référence
Question
Donner la réponse du Shell lorsque vous tapez les commandes suivantes dans une console :
A=numero; echo $A
echo $A1
echo ${A}1
B=`pwd`; echo $B
echo le chemin est `pwd`
echo le chemin est $B
echo le chemin est `hostname`:`pwd`
C=le chemin est `pwd`;echo $C
C='le chemin est `pwd`';echo $C
C="le chemin est `pwd`";echo $C
Le jeu d'instructions lui-même comporte :
• toutes les commandes Unix,
• l'invocation de programmes exécutables (ou de scripts) avec passage de paramètres,
• des instructions d'assignation de variables,
• des instructions conditionnelles et itératives,
• des instructions d'entrée-sortie.
Et bien entendu, les mécanismes de tubes et de redirections sont utilisables dans un script.
DESS Electronique & Automatique
1/8
Travaux Pratiques d'Unix
DESS E&A 2003/2004
Remarque : le Shell est un langage interprété ; en conséquence, il n'y a pas besoin de "recompiler"
les scripts.
Exemple : le premier script ; création avec un éditeur (vi par exemple) du fichier listf contenant la
ligne ls -aCF. Un fichier ordinaire n'a pas le droit x (il n'est pas exécutable à sa création, donc :
user> chmod a+x listf
← ajoute le droit d'accès x pour tout le monde
il peut donc être exécuté comme une commande dans une console :
user> listf
Le passage des paramètres
Premier script avec passage de paramètres : le script lisf ne s'applique qu'au répertoire courant.
On peut le rendre plus général en lui transmettant le nom du répertoire en argument lors de
l'invocation. Pour ce faire, les variables 1, 2,..., 9 permettent de désigner respectivement le
premier, le deuxième,..., le neuvième paramètre associés à l'invocation du script.
Question
Modifier le fichier listf de la façon suivante :
echo "contenu du repertoire $1"
ls -aCF $1
puis l’exécuter :
user> listf /tmp
Les variables spéciales : en plus des variables 1, 2,..., 9 le shell prédéfinit des variables facilitant
la programmation.
0
#
*
?
$
contient le nom sous lequel le script est invoqué,
contient le nombre (décimal) de paramètres passés en argument,
contient le liste des paramètres passés en argument,
contient le code retour de la dernière commande exécutée,
contient le numéro (PID) du Shell (décimal).
Exemple 1 : Le script echopara contient :
echo $1 $2 $3
P1=$1
shift
echo $1 $2 $3
echo $P1
echo $0 a ete appele avec $# parametres
echo qui sont : $*
Question
Ecrire le fichier echopara en lui passant 4 paramètres, puis l'exécuter.
En déduire la fonction de la commande shift.
Exemple 2 : Le script echopara2 contient :
echo $1 $2 $3 $4
DESS Electronique & Automatique
2/8
Travaux Pratiques d'Unix
DESS E&A 2003/2004
set un deux trois quatre
echo $1 $2 $3 $4
set `ls -a`
echo $1 $2 $3 $4
Question
Ecrire le fichier echopara2 en lui passant 4 paramètres, puis l'exécuter.
En déduire la fonction de la commande set.
Question
Ecrire un script Shell affichedate pour afficher la date dans un ordre différent de l'ordre standard.
Par exemple, si la commande date affiche :
Fri May 1 15:46:57 GMT 2003
votre commande devra afficher :
Fri 1 May 2003 15:46:57
Les structures de contrôle
Le Shell possède des structures de contrôle telles qu'il en existe dans les langages de
programmation d'usage général :
•
instructions conditionnelles (if..then else, test, case),
•
itérations bornées,
•
itérations non bornées.
1. LES INSTRUCTIONS CONDITIONNELLES
L'instruction if. Elle présente trois variantes qui correspondent aux structures sélectives à une,
deux ou n alternatives.
a) if commande
then commandes
fi
Les commandes sont exécutées si la commande condition commande renvoie un code
retour nul ($? = 0).
b) if commande
then commandes1
else commandes2
fi
c) if commande1
then commandes1
elif commande2
then commandes2
elif commande3
then commandes3
...
else
commandes0
fi
DESS Electronique & Automatique
3/8
Travaux Pratiques d'Unix
DESS E&A 2003/2004
La commande test. Elle constitue l'indispensable complément de l'instruction if. Elle permet
très simplement :
• de reconnaître les caractéristiques des fichiers et des répertoires,
• de comparer des chaînes de caractères,
• de comparer algébriquement des nombres.
Cette commande existe sous deux syntaxes différentes :
test expression
ou
[ expression ]
La commande tes répond à l'interrogation formulée dans expression, par un code retour nul
en cas de réponse positive et différent de zéro sinon. La deuxième forme est plus fréquemment
rencontrée et donne lieu à des programmes du type :
if [ expression ]
then commandes
fi
Les expressions les plus utilisées sont :
-d
-f
-s
-r
-w
-x
-z
-n
c1
c1
n1
nom
nom
nom
nom
nom
nom
chaîne
chaîne
= c2
!= c2
- eq n2
vrai si le répertoire nom existe,
vrai si le fichier nom existe,
vrai si le fichier nom existe et est non vide,
vrai si le fichier nom existe et est accessible en lecture,
vrai si le fichier nom existe et est accessible en écriture,
vrai si le fichier nom existe et est exécutable,
vrai si la chaîne de caractères chaîne est vide,
vrai si la chaîne de caractères chaîne est non vide,
vrai si les chaînes de caractères c1 et c2 sont identiques,
vrai si les chaînes de caractères c1 et c2 sont différentes,
vrai si les entiers n1 et n2 sont égaux.
Question
Ecrire un script Shell pour afficher le type (fichier ou répertoire) d'un fichier passé en paramètre.
2. L'INSTRUCTION CASE
L'instruction case est une instruction très puissante et très commode pour effectuer un choix
multiple dans un fichier de commande.
case chaîne in
motif1) commandes 1;;
motif2) commandes 2;;
....
....
motifn) commandes n;;
esac
Exemple : le script comptepara contient :
DESS Electronique & Automatique
4/8
Travaux Pratiques d'Unix
case $#
0) echo
1) echo
2) echo
*) echo
esac
in
$0
$0
$0
$0
DESS E&A 2003/2004
sans arguments;;
possede un argument;;
possede deux arguments;;
a plus de deux arguments;;
Question
Modifier le script Shell affichedate pour afficher le jour de la semaine en français (Mon devient
Lun, ou vis et versa).
3. LES ITERATIONS
Itération bornée : la boucle for. Trois formes de syntaxe sont possibles :
1) for variable in chaine1 chaine2 ... chainen
do
commandes
done
2) for variable
do
commandes
done
3) for variable in *
do
commandes
done
Pour chacune des trois formes, les commandes placées entre do et done sont exécutées
pour chaque valeur prise par la variable du Shell variable. Ce qui change c'est l'endroit où
variable prend ses valeurs. Pour la forme 1), les valeurs de variable sont les chaine1 à
chainen. Pour la forme 2) variable prend ses valeurs dans la liste des paramètres du script.
Pour la forme 3), la liste des fichiers du répertoire constitue les valeurs prises par variable.
Exemples :
• le script echofor1 contient :
for i in un deux trois
do
echo $i
done
•
le script echofor2 contient :
for i
do
echo $i
done
•
le script echofor3 contient :
for i in *
do
echo $i
done
DESS Electronique & Automatique
5/8
Travaux Pratiques d'Unix
DESS E&A 2003/2004
Question
Ecrire les fichiers echofor1, echofor2 et echofor3. Quels sont les résultats obtenus ?
Question
Ecrire un script Shell pour afficher les types (fichier ou répertoire) de tous les fichiers du répertoire
courant.
Question subsidiaire
Adapter le script précédent pour explorer toute une arborescence à partir d'un répertoire passé en
paramètre. Ceci nécessite d'utiliser le script récursivement (en faisant appel à lui même via $0).
Itération non bornée : while et until.
1) while commandealpha
do
commandesbeta
done
2) until commandealpha
do
commandesbeta
done
Les commandes commandesbeta sont exécutées tant que (while) ou jusqu'à ce que (until) la
commande commandealpha retourne un code nul (la condition est vraie).
Exemple : le script until_while contient :
while [ $1 != debut ] ; do
shift
done
shift
until [ $ 1= fin ]; do
echo $1
shift
done
Question
Ecrire le script until_while et l’exécuter en l'appelant de la manière suivante :
user> until_while 1 2 3 debut 4 5 6 fin 7 8 9
Arithmétique entière sur des variables
Toutes les variables Shell sont de type chaîne de caractères, mais si le contenu de cette
chaîne représente un nombre entier, les opérateurs -eq (=) -ne (!=) -lt (<) -le (≤) -gt (>) ge (≥) peuvent s'appliquer.
La commande expr permet en outre d'évaluer une expression arithmétique sur des
variables. Le résultat de cette évaluation est une chaîne de caractères dirigée sur la sortie standard.
Le backquoting `expr...` permet d'en récupérer le résultat.
DESS Electronique & Automatique
6/8
Travaux Pratiques d'Unix
DESS E&A 2003/2004
Les opérations permises sont les quatre opérations arithmétiques + - * / et % représentant le
reste de la division entière. Attention : le caractère * génère des noms de fichiers et doit donc être
précédé de \ qui le neutralise.
Exemple : le script arithm contient :
#!/bin/sh
# le caractère diese represente la mise en commentaire
# du reste de la ligne
# Ce script illustre l'arithmétique entiere sur des variables
# Calcul de (a*a)+(b*b)
echo -n a=
# ecriture du message a=
# sans retour chariot (option -n)
read a
# lecture de la valeur de la variable a
echo -n b=
read b
d=`expr $a \* $a`
# le caractere * doit etre precede de \
e=`expr $b \* $b`
# sinon il genere la liste
# de tous les fichiers
c=`expr $d + $e`
echo a\*\*2 + b\*\*2 = $c
if [ $c -ge 100 ]; then
echo "Ca fait beaucoup..."
fi
# Fin du script arithm
Question
Ecrire le script arithm et l’exécuter.
Exercices
Exercice 1 : on désire gérer un petit carnet téléphonique. Après étude, on conclut que le plus
simple est de mémoriser le carnet dans un fichier (nommé carnet par exemple), avec chaque ligne
contenant le nom (sans espace, pour simplifier), un espace et le numéro de téléphone (lui aussi
sans espace). Par exemple le fichier carnet peut contenir :
tata 0918533666
titi 0166745518
toto 0683505075
1. Ecrivez un script ajouter qui prend en argument un nom, un numéro de téléphone et qui
l'ajoute au carnet si le nom n'existe pas déjà.
2. Ecrivez un script chercher qui prends en argument un nom pour afficher la ligne
correspondante dans le carnet
3. Ecrivez un script effacer qui prend en argument un nom, et qui l'efface du carnet.
4. Ecrivez un script modifier qui prend en argument un nom, un nouveau numéro de téléphone, et
qui remplace l'ancien numéro de téléphone par le nouveau dans le carnet.
NB Utiliser la commande grep
Exercice 2 : Ecrivez un programme Shell permettant de renommer une liste de paramètres de la
commande (à partir du deuxième). Les nouvelles références seront obtenues à partir d’un préfixe
DESS Electronique & Automatique
7/8
Travaux Pratiques d'Unix
DESS E&A 2003/2004
commun donné en premier paramètre, et d’un suffixe qui est un entier (numéro d’ordre du
paramètre correspondant à ce fichier +1).
Exemple : la commande renomme fic toto tata titi aura pour effet d’avoir les
nouveaux noms fic1, fic2 et fic3.
Notes :
• votre commande ne doit renommer que les fichiers ordinaires,
• s’il n’y a qu’un paramètre, tous les fichiers de répertoire seront traités,
• on suppose qu’aucun nouveau nom ne correspond à une référence déjà existante.
Vous penserez à faire les tests d’erreur nécessaires. Lors d’une erreur d’usage, vous afficherez un
message rappelant l’usage correct du script à l’utilisateur. Dans ces cas, vous pouvez utiliser la
commande exit pour sortir du script, en envoyant une sortie (décimale) non-nulle (cf. exemple
ci-dessous).
Exemple : le script cdrep contient :
# script qui utilise la commande cd avec le premier paramètre
# seulement si le premier paramètre est un repertoire
# sinon il affiche un message d’erreur.
if [ $# != 1 ]
then
echo $0 ne fonctionne qu avec un seul parametre.
exit 1
elif [ ! –d $1 ] # le caractere ! indique la negation de
# l’expression qui le suit
then
echo $1 n est pas un repertoire
exit 2
fi
cd $1
Exercice 3 : Encore ? Demandez à l'enseignant, il en a toujours quelques uns en réserve.
DESS Electronique & Automatique
8/8

Documents pareils

Partie 1 ) Arguments d`un shell script 1.1) les variables d`un

Partie 1 ) Arguments d`un shell script 1.1) les variables d`un N.B. : si variable n'est pas définie, son contenu, lors de son appel, sera mis à 0, sauf si le shell est lancé avec l'option u (dans ce cas toute utilisation de variable non définie mettra fin au s...

Plus en détail