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'écrire des scripts ?
- Quel shell est recommandé pour écrire des scripts ?
- Les pas nécessaires pour exécuter les scripts
- Exécution des scripts
- Pourquoi mon script ne s'exécute pas ?
- Je sais qu'il faut toujours commenter le code. Comment commenter un script ?
- Variables
- Passer des arguments aux scripts
- Entrées/sorties
- Commandes shell (if, case, while, for)
- Je n'arrive pas à mettre une condition dans le if
- Fonctions
- Comment écrire des scripts à la philosophie Unix ?
- Questions Posées Fréquemment et divers
Qu'est-ce que c'est un shell ?
Le shell c'est le programme que tout utilisateur d' Unix utilise,
c'est celui qui prend les commandes de l'utilisateur et les passe (généralement)
au système d'exploitation pour être exécutées. 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 être exécute par le shell lui-même,
qui contient donc des commandes shell.
Exemple de script
Voici un script qui remplace une ligne par une autre (les deux passées
en paramètre) dans un fichier:
#!/bin/sh
if [ $# -ne 2 ] # si le nombre de paramètres n'est pas 2
then # affiche l'usage
echo Usage: $0 ligne1 ligne2 1>&2
echo Ce programme lit l'entrée standard, remplace ligne1 par 1>&2
echo ligne2 et écrit le résultat sur la sortie standard 1>&2
exit 1
fi
IFS="\n" # la variable IFS (Internal Field Separator) est "ENTER"
# (utilisée par la commande read)
while read ligne # met dans la variable ligne une ligne de l'entrée standard
# tant qu'on n'est pas arrivé a la fin
do
if [ $ligne = $1 ] # si ligne est égale au premier paramètre
then
echo $2 # affiche le deuxième paramètre à sa place
else
echo $ligne # sinon, il affiche la ligne
fi
done
exit 0 # sortie normale (code de retour 0)
Pour l'utiliser, exécutez (par exemple) :
script un deux <fichierEntrée>fichierSortie.
A quoi sert d'écrire des scripts ?
Si vous utilisez plusieurs fois une séquence de commandes shell, vous pouvez
les mettre dans un script. Un script a aussi l'avantage d'être exécuté
sur n'importe quelle machine Unix sans modification. Il n'a pas
besoin d'être compilé ! Le seul outil nécessaire se trouve (généralement)
sur toutes les machines Unix: le shell !
Quelle shell est recommandé pour écrire des scripts ?
Il est recomandable d'utiliser toujours sh (Bourne shell), car
ce shell se trouve sûrement sur toutes les machines. Cette page Web explique
seulement sh. S'il faut utiliser des facilités que sh
ne fournit pas, vous pouvez utiliser bash, qui est le shell par
defaut de GNU/Linux (et qui peut aussi exécuter tous les scripts sh).
Pour utiliser un shell spécifique, voir exécution des scripts.
Shells compatibles a sh : bash, ksh
Shells incompatibles a sh : csh, tcsh
Les pas nécessaires pour exécuter les scripts
- Vous écrivez le script dans un éditeur de textes (n'oubliez pas de spécifier le shell sur la première ligne, voir exécution des scripts)
- (optionnel) Vous mettez le script dans un répertoire qui se trouve dans $PATH
- Vous changez le type du fichier en le rendant exécutable : chmod a+x script
- Vous pouvez l'exécuter en tapant : script (ou le path s'il ne se trouve pas dans $PATH)
Exécution des scripts
Un script est interprété par le shell ligne par ligne jusqu'à la fin du
script ou la rencontre de la commande exit. En cas d'erreur, l'exécution
est arrêtée avec un message d'erreur. Le shell qui exécute le script est
le shell qui apparaît dans la première ligne du script (si elle commence
par #!), sinon c'est votre shell courant qui l'exécutera.
Pourquoi mon script ne s'exécute pas ?
- Il n'a pas le mode x pour pouvoir être exécuté. Utilisez dans ce cas la commande : chmod a+x script
- Le shell que vous avez spécifié dans le script n'existe pas. Verifiez que le path mis après #! est valide
- Le script contient des commandes pour un autre shell (ex. csh) que celui que vous avez spécifié
- Vous utilisez mal une apostrophe ou guillemet (exemple : echo J'ai 3 paramètres est erroné, utilisez echo J\'ai 3 paramètres)
- Il ne se trouve pas dans le $PATH. Spécifiez 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 caractère # introduit un commentaire
que le shell ignorera. Un cas spécial est #! en début de la première
ligne du script, voir exécution du script.
Variables
PATH, SHELL, HOME sont des exemples de variables.
Vous pouvez créer des variables dans le script, mais elles existerons seulement
dans le script. Pour lire une variable, vous devez lui préfixer $:
MESSAGE=coucou
echo $MESSAGE
Passer des arguments aux scripts
Vous pouvez lire les arguments avec les variables $i, ou i
est le numéro de l'argument (i>=1). $0 représente le nom du fichier
script. Pour savoir le nombre d'arguments, utilisez $#. Pour un
exemple d'utilisation, voir exemple de script.
Entrées/sorties
Par défaut, tout programme (script ou non) lit du clavier est écrit sur
l'écran. A chaque programme sont associées une entrée standard, une sortie
standard et une erreur standard. Cela peut être changé avec :
> fichier - spécifie que la sortie standard n'est plus l'écran,
mais le fichier spécifié
< fichier - spécifie que l'entrée standard n'est plus le
clavier, mais le fichier spécifié
2> fichier - spécifie que l'erreur standard n'est plus l'écran,
mais le fichier spécifié
2>&1 - spécifie que l'erreur standard devient la même que la sortie standard
Exemple :
programme <donneés >resultats 2>erreur
Pour lire une ligne (un mot) de l'entrée standard, utilisez la commande
read.
Pour écrire une ligne à la sortie standard ou à l'erreur standard, utilisez
echo.
Exemple :
read lecture # lit une ligne (un mot) et la met dans la variable lecture
echo Lecture de la chaîne $lecture 1>&2 # sur la sortie standard
echo Lecture de la chaîne $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 à mettre une condition dans le if
Vérifiez bien qu'il y a des espaces autour des crochets.
Exemples (voir le manuel de test si vous avez encore des problèmes) :
- fichiers :
- if [ -f fichier ] # si le fichier fichier existe et n'est pas un répertoire
- if [ -d fichier ] # si le fichier fichier existe et c'est un répertoire
- chaînes :
- if [ $word = "coucou" ]
- if [ $var != "chaîne" ]
- if [ $var ] # si la variable var n'est pas la chaîne vide
- nombres :
- if [ $# -eq 3 ] # EQual. Si le nombre de paramètres est 3
- if [ $1 -ne 1 ] # NotEqual. Si le premier paramètre est numériquement 1
- if [ $chiffre -gt 4 ] # GreaterThan. Si $chiffre est numériquement supérieur à 4
- if [ $chiffre -ge 5 ] # GreaterorEqual
- if [ $chiffre -lt 5 ] # LessThan
- if [ $chiffre -le 5 ] # LessorEqual
Functions
Exemple de création et d'utilisation d'une fonction :
fonct()
{
echo Je suis appelé avec $1
}
fonct 4 # affiche 4
fonct coucou # affiche coucou
Comment écrire des scripts à la philosophie Unix ?
Un bon script doit remplir les conditions suivantes :
- Il doit spécifier sur la première ligne (voir exécution des scripts) le shell qui l'exécute
- Il doit vérifier ses paramètres
- Il doit retourner un valeur de retour : 0 en cas de succès, différent de 0 sinon (pour cela, utiliser exit)
- Il doit écrire les messages d'erreur à la sortie standard d'erreur
Questions Posées Fréquemment et divers
- Comment je peux exécuter indéfiniment une boucle ?
while true
do
... # vous pouvez utiliser break pour vous en sortir
done
Comment je fais un traitement sur tous les fichiers du répertoire courant ?
for i in *
do
...
done
Où je peux trouver quelques exercices de shell ?
Essayez : http://shogun.depinfo.enseeiht.fr/~grig/comp/cours/
J'ai lu cette page, mais je n'ai pas trouvé la reponse à ma question. Où me renseigner ?
Regardez le manuel pour sh
Essayez la page de yahoo sur les shells http://dir.yahoo.com/Computers_and_Internet/Software/Operating_Systems/Unix/Shells/
Ecrit par Eugen Dedu
|
Dernière modification : le 9 juin 1999
|