Introduction aux scripts shell
- Qu'est-ce que c'est un shell ?
- Comment je peux savoir quel est le shell que
j'utilise ?
- Qu'est-ce que c'est un script ?
- Exemple de script
- A quoi sert d'ecrire des scripts ?
- Quelle shell est recommande pour ecrire des
scripts ?
- Les pas necessaires pour executer les
scripts
- Execution des scripts
- Pourquoi mon script ne s'execute pas
?
- Je sais qu'il faut toujours commenter le
code. Comment commenter un script ?
- Variables
- Passer des arguments aux scripts
- Entrees/sorties
- Commandes shell (if, case, while, for)
- Je n'arrive pas a mettre une condition dans le
if
- Functions
- Comment ecrire des scripts a la philosophie
Unix ?
- Questions Posees Frequemment et
divers
Qu'est-ce que c'est un shell ?
Le shell c'est le programme que tout utilisateur de Unix
utilise, c'est celui qui prend les commandes de l'utilisateur et
les passe (generalement) au systeme d'exploitation pour etre
executees. Il affiche pour cela un prompt, par exemple $.
Comment je peux savoir quel est le shell
que j'utilise ?
echo $SHELL
Qu'est-ce que c'est un script ?
Un script c'est un programme qui peut etre execute par le shell
lui-meme, qui contient donc des commandes shell.
Exemple de script
Voici un script qui remplace une ligne par une autre (les deux
passees en parametre) dans un fichier:
#!/bin/sh
if [ $# -ne 2 ] # si le nombre de parametres n'est pas 2
then # affiche l'usage
echo Usage: $0 ligne1 ligne2 1>&2
echo Ce programme lit l'entree standard, remplace ligne1 par 1>&2
echo ligne2 et ecrit le resultat sur la sortie standard 1>&2
exit 1
fi
IFS="\n" # la variable IFS (Internal Field Separator) est "ENTER"
# (utilisee par la commande read)
while read ligne # met dans la variable ligne une ligne de l'entree standard
# tant qu'on n'est pas arrive a la fin
do
if [ $ligne = $1 ] # si ligne est egal au premier parametre
then
echo $2 # affiche le deuxieme parametre a sa place
else
echo $ligne # sinon, il affiche la ligne
fi
done
exit 0 # sortie normale (code de retour 0)
Pour l'utiliser, executez (par exemple) : script un deux
<fichEntree >fichSortie.
A quoi sert d'ecrire des scripts ?
Si vous utilisez plusieurs fois une sequence de commandes shell,
vous pouvez les mettre dans un script. Un script a aussi l'avantage
d'etre execute sur n'importe quelle machine Unix sans
modification. Il n'a pas besoin d'etre compile ! Le seul outil
necessaire se trouve (generalement) sur toutes les machines
Unix: le shell !
Quelle shell est recommande pour ecrire
des scripts ?
Il est recomandable d'utiliser toujours sh (Bourne shell),
car ce shell se trouve surement sur toutes les machines. Cette page
Web explique seulement sh. S'il faut utiliser des
facilites que sh ne fournit pas, vous pouvez utiliser
bash, qui est le shell par defaut de Linux (et
qui peut aussi executer tous les scripts sh). Pour
utiliser un shell specifique, voir execution des
scripts.
Shells compatibles a sh : bash,
ksh
Shells incompatibles a sh : csh,
tcsh
Les pas necessaires pour executer les
scripts
- Vous ecrivez le script dans un editeur de textes (n'oubliez pas
de specifier le shell sur la premiere ligne, voir execution
des scripts)
- (optionnel) Vous mettez le script dans un repertoire qui se
trouve dans $PATH
- Vous changez le type du fichier en le rendant executable :
chmod a+x script
- Vous pouvez l'executer en tapant : script (ou le path
s'il ne se trouve pas dans $PATH)
Execution des scripts
Un script est interprete par le shell ligne par ligne jusqu'a la
fin du script ou la rencontre de la commande exit. En cas d'erreur,
l'execution est arretee avec un message d'erreur. Le shell qui
execute le script est le shell qui apparait dans la premiere ligne
du script (si elle commence par #!), sinon c'est votre
shell courant qui l'executera.
Pourquoi mon script ne s'execute pas
?
- Il n'a pas le mode x pour pouvoir etre execute.
Utilisez dans ce cas la commande : chmod a+x script
- Le shell que vous avez specifie dans le script n'existe pas.
Verifiez que le path mis apres #! est valide
- Le script contient des commandes pour un autre shell (ex.
csh) que celui que vous avez specifie
- Vous utilisez mal un apostrof ou guillemet (exemple : echo
J'ai 3 parametres est errone, utilisez echo J\'ai 3
parametres)
- Il ne se trouve pas dans le $PATH. Specifiez dans ce
cas le path du script
Je sais qu'il faut toujours commenter le
code. Comment commenter un script ?
Toute ligne qui commence par le caractere # introduit un
commentaire que le shell ignorera. Un cas special est #!
en debut de la premiere ligne du script, voir execution
du script.
Variables
PATH, SHELL, HOME sont des exemples de
variables. Vous pouvez creer des variables dans le script, mais
elles existerons seulement dans le script. Pour lire une variable,
vous devez lui prefixer $:
MESSAGE=coucou
echo $MESSAGE
Passer des arguments aux scripts
Vous pouvez lire les arguments avec les variables $i, ou
i est le numero de l'argument (i>=1). $0
represente le nom du fichier script. Pour savoir le nombre
d'arguments, utilisez $#. Pour un exemple d'utilisation,
voir exemple de script.
Entrees/sorties
Par defaut, tout programme (script ou non) lit du clavier est ecrit
sur l'ecran. A chaque programme sont associees une entree standard,
une sortie standard et une erreur standard. Cela peut etre change
avec :
> fichier - specifie que la sortie standard n'est
plus l'ecran, mais le fichier specifie
< fichier - specifie que l'entree standard n'est
plus le clavier, mais le fichier specifie
2> fichier - specifie que l'erreur standard n'est
plus l'ecran, mais le fichier specifie
2>&1 - specifie que l'erreur standard devient la meme que
la sortie standard
Exemple :
programme <donnees >resultats 2>erreur
Pour lire une ligne (un mot) de l'entree standard, utilisez la
commande read. Pour ecrire une ligne a la sortie standard
ou a la erreur standard, utilisez echo. Exemple :
read lecture # lit une ligne (un mot) et la met dans la variable lecture
echo Lecture de la chaine $lecture 1>&2 # sur la sortie standard
echo Lecture de la chaine $lecture 2>&1 # sur l'erreur standard
Commandes shell (if, case, while, for)
Sans les constructions clasiques un script serait inutile.
- La commande if (la partie else est
optionnelle) :
-
if [ $# -ne 3 ]
then
commande1
else
commande2
fi
- La commande case :
-
case `expr $jours % 7` in
0)
echo Lundi
1)
echo Mardi
...
esac
- La commande for :
-
for i in `cat fichiers`
do
commandes
done
- La commande while :
-
while command
do
commandes
done
- Dans une boucle for ou while vous pouvez
utiliser break (pour sortir de la boucle) ou
continue (pour continuer la boucle).
Je n'arrive pas a mettre une condition dans
le if
Verifiez bien qu'il y a des espaces autour des crochets.
Exemples (voir le manuel de test si vous avez encore
des problemes) :
- fichiers :
-
- if [ -f fichier ] # si le fichier fichier existe et
n'est pas un repertoire
- if [ -d fichier ] # si le fichier fichier existe et
c'est un repertoire
- chaines :
-
- if [ $word = "coucou" ]
- if [ $var != "chaine" ]
- if [ $var ] # si la variable var n'est pas la chaine
vide
- nombres :
-
- if [ $# -eq 3 ] # EQual. Si le nombre de parametres est 3
- if [ $1 -ne 1 ] # NotEqual. Si le premier parametre est
numeriquement 1
- if [ $chiffre -gt 4 ] # GreaterThan. Si $chiffre est
numeriquement superieure a 4
- if [ $chiffre -ge 5 ] # GreaterorEqual
- if [ $chiffre -lt 5 ] # LessThan
- if [ $chiffre -le 5 ] # LessorEqual
Functions
Exemple de creation et d'utilisation d'une fonction :
fonct()
{
echo Je suis appele avec $1
}
fonct 4 # affiche 4
fonct coucou # affiche coucou
Comment ecrire des scripts a la philosophie
Unix ?
Un bon script doit remplir les conditions suivantes :
- Il doit specifier sur la premiere ligne (voir execution
des scripts) le shell qui l'execute
- Il doit verifier ses parametres
- Il doit retourner un valeur de retour : 0 en cas de succes,
different de 0 sinon (pour cela, utiliser exit)
- Il doit ecrire les messages d'erreur a la sortie standard
d'erreur
Questions Posees Frequemment et divers
| Ecrit par Eugen Dedu |
Derniere modification : le 9
juin 1999
|