Introduction au Script Shell

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Bourne-again shell, est l'interprète de commandes libre du projet GNU. Son nom est un jeu de mots (Bourne again / born again, « né de nouveau » ou encore « réincarné ») sur le shell historique d'Unix, le Bourne shell. Basé sur ce dernier, il apporte de nombreuses améliorations, provenant notamment du Korn shell et du C shell.

Son auteur original est Brian Fox de la Free Software Foundation, relayé plus tard par Chet Ramey. Le Bourne shell original fut écrit par Steve Bourne.

Bash est un logiciel libre publié sous licence GPL. Il est l'interprète par défaut sur de nombreux Unix libres, notamment sur les systèmes GNU/Linux. C'est aussi le shell par défaut de Mac OS X et il a été porté sous Windows par le projet Cygwin.

Bash utilise la bibliothèque readline ce qui lui permet, comme le C shell, de compléter automatiquement les noms de commandes et de fichiers lors d'une frappe sur la touche TAB, ce qui accélère considérablement le travail. Les touches UP et DOWN permettent de naviguer avec facilité dans l'historique des commandes.

2 Créer un script shell

Pour créer un script c'est très simple, il suffit de créer un fichier et de le rendre exécutable :

touch test.sh && chmod 700 test.sh

3 Les flux de données

Les flux de données du Shell sont transportés par trois voies différentes :

  • l'entrée standard
  • la sortie standard
  • la sortie d'erreur standard

3.1 Entrée standard

L'entrée standard est le canal d'entrée des données qui est utilisé par le système. Par défaut c'est le clavier.

Ainsi, les commandes du Shell prennent leur paramètres sur l'entrée standard.

3.2 Sortie standard

La sortie standard est le canal de sorties des données. C'est par ce canal que transitent les données résultant de l'exécution d'une commande. C'est en général un terminal, c'est-à-dire l'écran.

Ainsi, les commandes du Shell écrivent très souvent des résultats sur la sortie standard.

3.3 Sortie d'erreur standard

La sortie d'erreur standard est le canal par lequel les messages d'erreurs transitent, c'est en général l'écran. Il arrive quelque fois qu'une fenêtre soit spécialement dédiée à ce canal.

Dès qu'un code d'erreur est généré par une commande, il est envoyé un message sur ce canal.

3.4 Redirections

Il est possible de changer temporairement les entrées et sorties standard lors de l'exécution d'une commande.

Par exemple on souhaite écrire dans un fichier la liste des fichiers d'un répertoire. La commande ls permet de lister les fichiers d'un répertoire. Cette commande envoie le résultat de sa recherche sur la sortie standard (écran).

  • Exemple :
$ ls
amoi.c           montage.jpg     tp3.c
lettre.doc       tp1.c           zizitop.mp3
monprog.c        tp2.c

Pour rediriger la sortie standard sur un fichier, on utilise le caractère spécial >.

  • Exemple :
$ ls > liste.txt

Si on affiche à l'écran le contenu du fichier, on vera qu'il contient ce que la commande aurait du afficher à l'écran.

  • Exemple :
$ cat liste.txt
amoi.c           montage.jpg     tp3.c
lettre.doc       tp1.c           zizitop.mp3
monprog.c        tp2.c

Le caractère > permet de créer le fichier si celui-ci n'existe pas lors de l'exécution de la commande. Si le fichier existe déjà, sont contenu est écrasé.

Pour conserver le contenu du fichier intact et écrire à sa suite, on utilise le caractère spécial >>.

  • Exemple :
echo "Liste de mon répertoire" >> liste.txt

La commande echo permet d'afficher du texte sur la sortie standard qui est ici redirigée vers le fichier liste.txt à la suite duquel on écrit la chaîne de caractères passée en argument.

  • Exemple :
$ cat liste.txt
amoi.c           montage.jpg     tp3.c
lettre.doc       tp1.c           zizitop.mp3
monprog.c        tp2.c

Liste de mon répertoire

On voit que le contenu du fichier n'a pas été écrasé et qu'il contient une phrase en plus.

Le tableau suivant récapitule les caractères spéciaux de redirection.

Caractère Description
> Redirige la sortie standard.
>> Redirige la sortie standard sans écrasement.
< Redirige l'entrée standard.
2> Redirige la sortie d'erreur standard.
2>> Redirige la sortie d'erreur standard sans écrasement.

4 Caractères spéciaux

En plus des caractères de redirection des flux standards de données, le Shell possèdent des caractères dont la signification est très... spéciale, les voici regroupés dans le tableau suivant.

Caractère Description
* Métacaractère qui remplace n'importe quelle chaîne de caractères (même vide).

Exemple : cp * DATA copie tous les fichiers dans le répertoire DATA.

? Métacaractère qui remplace un caractère quelconque.
; Permet de séparer plusieurs commandes écrites sur une même ligne.

Exemple :
cp *.c DATA; tar cvf data.tar DATA copie tous les fichiers d'extention .c
dans le répertoire DATA et les archive dans le fichier data.tar.

( ) Regroupe des commandes.

Exemple :
(echo "Liste :"; ls ) > liste.txt
écrit la chaîne Liste : et la liste des fichiers du répertoire courant dans le fichier liste.txt.

& Permet le lancement d'un processus en arrière plan. Cela permet d'exécuter d'autres commandes pendant qu'un processus est en marche.

Exemple : netscape&.

Permet la communication par tube entre deux commandes.

Exemple : ls -1 | file la commande de listage des fichiers du répertoire (ls) envoie chacun d'eux à la commande qui permet de connaître le type d'un fichier (file).

# Introduit un commentaire. Donc tout ce qui suit ce caractère dans une ligne est ignoré par le Shell.

Exemple : # ceci est un commentaire.

\ Déspécialise le caractère qui suit. C'est-à-dire que si le caractère qui suit celui là est un caractère spécial alors le Shell l'ignorera.

Exemple : echo Bon\*jour affiche bon*jour à l'écran.

'...' Défini une chaîne de caractères qui ne sera pas évaluée par le Shell.

Exemple : echo '*?&' affiche sur la sortie standard les caractères spéciaux *?& sans les interpréter.

"..." Défini une chaîne de caractères dont les variables seront évaluées par le Shell.

Exemple : echo "Vous êtes $USER." affiche Vous êtes + la valeur de la variable $USER.

`...` Défini une chaîne de caractères qui sera interprétée comme une commande et remplacée par la chaîne qui serait renvoyée sur la sortie standard à l'exécution de la dite commande.

Exemple : echo `pwd` >> liste.txt écrit à la fin du fichier le chemin et le nom du répertoire courant. Le caractère spécial utilisé s'obtient par la combinaison de touche : AltGr + 7 (c'est l'accent grave).

5 Les variables du Shell

5.1 Les variables d'environnement

Le Shell possède comme MS-DOS des variables d'environnement qui permettent de garder en mémoire des informations importantes telles que le login de l'utilisateur (stocké dans la variable $USER) ainsi que son répertoire de connexion ($HOME), la liste des répertoires dans lequels aller chercher les exécutables des commandes externes ($PATH), et bien d'autres encore...

La commande env affiche la liste de toutes les variables d'environnement du Shell avec leurs valeurs.

Vous pouvez afficher les variables disponibles avec la commande env.

5.2 Autres variables

Variable Description
$$ PID du processus Shell en cours.
$! PID du dernier processu lancé en background.
$? Code erreur de retour de la dernière commande (0:vrai; sinon faux).

6 Déclaration

L'utilisateur peut déclarer facilement de nouvelles variables par l'affectation directe d'une valeur.

Syntaxe : nom=valeur

La valeur de la variable peut être numérique ou être une chaîne de caractère, sont format n'a pas d'importance.

Exemple : EMAIL=deimos@deimos.fr Manipulation

Une variable peut être utilisée dans n'importe quelle circonstance du moment que c'est dans le Shell. Son nom doit être précédé du signe dollard ($) et être entre accolades ({}) si un autre mot lui est contigu.

Exemples :

$ echo $EMAIL
deimos@deimos.fr
$ echo "Mon mail : $EMAIL"
Mon mail : deimos@deimos.fr
$ echo 'Mon mail : $EMAIL'
Mon mail : $EMAIL

Dans le premier exemple, la variable EMAIL est passé directement en paramètre à la commande echo qui l'affiche après que le Shell en ait évalué la valeur.

Dans le second exemple, une chaîne contenant la même variable est passée en paramètre à echo. Les doubles quotes sont des caractères spéciaux ("...")qui obligent le Shell a évaluer la valeur des variables que contient la chaîne entre double quote. La commande echo affiche donc la chaîne à l'écran.

Et enfin, cette fois les simples quotes interdisent au Shell d'évaluer la valeur de la variable. Donc echo affiche la chaîne brute.

6.1 Autres exemples

$ moi=deimos; echo $moi
deimos
$ phrase="Bonjour $moi"; echo $phrase
Bonjour deimos
$ rep=`pwd`; echo $rep
/home/deimos/data

Dans le second exemple, la variable est entre accolades afin que le Shell la distingue des caractères qui suivent.

Dans le dernier exemple, la variable rep contient une chaîne entre accents graves, ce qui oblige le Shell à l'interpréter comme une commande et à la remplacer par la chaîne qui serait renvoyée sur la sortie standard à l'exécution de la dite commande. Fichiers de commandes

Les fichiers de commandes (scripts) sont des fichiers textes qui contiennent des commandes du Shell ordonnées par des structures de contrôle. Exécution

Pour exécuter un script, plusieurs solutions :

  • Syntaxe : sh script

Cette syntaxe lance un nouveau processus Shell qui lit ses commandes dans le fichier script. Ce fichier doit être accessible en lecture.

  • Syntaxe : . script

Le terminal est momentanément remplacé par le fichier script accessible en lecture (pas de nouveau processus créé).

  • Syntaxe : script

Lance un nouveau processus Shell qui lit ses commandes dans le fichier qui doit être accessible en lecture et en exécution.

  • Syntaxe : exec script

Le Shell courant est remplacé par un processus Shell qui lit ses commandes dans le fichier qui doit être accessible en lecture et en exécution.

6.2 Paramètres

Il est possible d'exécuter un script en lui passant des arguments comme pour n'importe quelle autre commande.

Le tableau suivant résume les variables accessibles à un script :

Variable Description
$# Nombre d'arguments.
$* Liste des arguments.
$0 Nom de la commande.
$1 Valeur du premier paramètre.
$i Valeur du ième paramètre si i compris entre 1 et 9.
$9 Valeur du neuvième paramètre.

7 Créer des variables à la volée

Vu que bash n'est pas un vrai language de programmation, il y a pas mal de choses qu'il devient difficile à faire quand on pousse pépère dans ses derniers retranchements. Bref, si vous avez besoin de déclarer des variables à la volée, voici un exemple :

f=0
for j in `echo $nodes` ; do
   f=`expr $f + 1`
   local porttest_node$f=`ssh root@$node1 netstat -auntp | grep :$clientport | grep -c "LISTEN"`
done

8 Lire un fichier ligne par ligne

Si vous avez besoin de lire ligne par ligne un fichier, comme on peut le faire dans certains langages plus avancés, voici ex ememple :

  while read line; do echo "$(date),$(hostname),$line"; done < somefile.txt

9 Récupérer les signaux

Récupérer les signaux, c'est tellement pratique. Pour ceux qui ne comprennent pas ou n'ont aucunes notions sur ces méchanismes, c'est assez simple. Lors d'un SIGHUP et autres fermetures de programmes, vous pouvez effectuer des actions diverses et variées a l'aide de la commande trap :

Command trap
 trap "echo \"$0 process $$ killed on $(date).\"; exit " HUP INT QUIT ABRT TERM STOP

10 Cacher un mot de passe à la saisie au clavier

Il peut être pratique lorsqu'un utilisateur saisie quelque chose au clavier de devoir le cacher à l'écran. Cela se traduit de la façon suivante en shell script :

Command trap
 save_state=$(stty -g)
 echo -n "Password: "
 stty -echo
 read password
 stty "$save_state"
 echo ""
 echo "You inserted $password as password"

11 Références

Documentation sur l'initiation Unix et les scripts shell