La programmation 'Shell'

Ce document présente les bases de la programmation Shell sous Unix, destiné aux étudiants et utilisateurs souhaitant apprendre à écrire des scripts Shell pour automatiser des tâches, administrer un système ou manipuler des commandes Unix. Il couvre les notions fondamentales du Shell, les variables, les structures de contrôle, les fonctions, ainsi que des exemples pratiques.

D'après le document La programmation 'Shell'

Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Document source

La programmation 'Shell'

Programming · PDF · 89 pages · 2008

Afficher l'aperçu du document

Consulter le document original →

Ce document présente les bases de la programmation Shell sous Unix, destiné aux étudiants et utilisateurs souhaitant apprendre à écrire des scripts Shell pour automatiser des tâches, administrer un système ou manipuler des commandes Unix. Il couvre les notions fondamentales du Shell, les variables, les structures de contrôle, les fonctions, ainsi que des exemples pratiques.

Introduction à la programmation Shell

Le Shell est un interpréteur de commandes sous Unix, distinct du noyau du système. Son rôle est d'analyser les commandes tapées par l'utilisateur et de les exécuter. Il existe plusieurs shells, chacun avec ses particularités, tels que :

  • Bourne Shell (/bin/sh)
  • Korn Shell (/bin/ksh)
  • C Shell (/bin/csh)
  • Bourne Again Shell (/bin/bash)
  • Et d'autres comme /bin/tcsh, /bin/ash, /bin/zsh...

Le Shell est à la fois un langage de commandes et un langage de programmation permettant l'utilisation de variables, la séquence, l'exécution conditionnelle et la répétition de commandes. Un programme Shell, appelé script, regroupe des commandes Unix et des appels systèmes pour automatiser des tâches.

Pourquoi programmer en Shell ?

La programmation Shell est essentielle pour l'administration système sous Unix, car la plupart des scripts d'administration sont écrits en Shell. Elle permet d'analyser et modifier le comportement du système. Cependant, le Shell n'est pas adapté pour :

  • Les tâches exigeant beaucoup de ressources ou de rapidité
  • Les applications complexes nécessitant une programmation structurée avancée (typage, tableaux multidimensionnels...)
  • Les applications sensibles à la sécurité
  • Les applications accédant directement au matériel
  • Les applications avec interface graphique (GUI)
  • Les applications propriétaires (car un script Shell est lisible)

Pour ces cas, d'autres langages comme Perl, Tcl, Python, Ruby ou des langages compilés comme C sont recommandés.

Modes d'exécution du Shell

Il existe deux modes pour exécuter des commandes Shell :

  1. Mode direct : l'utilisateur tape les commandes directement dans le terminal. Si une commande est incomplète, le Shell affiche un prompt secondaire pour continuer la saisie.
  2. Mode script : l'utilisateur écrit un fichier texte contenant les commandes, appelé script. Ce fichier est rendu exécutable et lancé comme une commande Unix.

Exemple de commande en mode direct :

Prompt> date
Tue Jan 16 17:26:50 NFT 2001
Prompt> pwd
/tmp
Prompt> if test 5 = 5
Prompt secondaire> then
Prompt secondaire> echo vrai
Prompt secondaire> fi
vrai

Exemple de script :

# Contenu du fichier "prog"
date
pwd
if test 5 = 5
then
  echo "vrai"
fi

Pour rendre ce script exécutable :

Prompt> chmod a+x prog
Prompt> ./prog
Tue Jan 16 17:26:50 NFT 2001
/tmp
vrai

Il est aussi possible d'exécuter un script sans le rendre exécutable en appelant explicitement un interpréteur :

Prompt> sh prog
Prompt> ksh prog

Impératifs de la programmation Shell

Le Shell est un interpréteur qui analyse et exécute chaque ligne. La syntaxe est rigoureuse :

  • Les majuscules et minuscules sont différentes
  • Les éléments doivent être séparés par un espace (sauf pour l'affectation)
  • Le premier mot d'une ligne non commentée doit être une instruction valide (commande Unix, script, ou commande interne)

Exemple d'erreur :

Prompt> echoBonjour
sh: echoBonjour: not found
Prompt> echo Bonjour
Bonjour

Conventions utilisées dans ce cours

  • Prompt> indique une invite de commande à taper directement dans le terminal.
  • #!/bin/sh en début de script indique quel interpréteur utiliser.
  • Les syntaxes sont données sans prompt ni ligne #!/bin/sh.
  • Les éléments entre crochets [elem] sont facultatifs et ne doivent pas être tapés tels quels.
  • Le caractère n signifie un entier positif ou nul.
  • Le caractère | signifie un choix entre éléments.
  • Les points de suspension ... indiquent une répétition possible.

Éléments de base du langage Shell

L'affichage

La commande d'affichage est echo. Elle permet d'afficher du texte ou le contenu de variables.

Prompt> echo Hello World
Hello World

Les commentaires

Un commentaire commence par le caractère dièse #. Tout ce qui suit sur la ligne est ignoré.

#!/bin/sh
# Ce programme affiche la date
date

# Cette ligne est un commentaire

Le débogueur

Le Shell propose un outil de débogage via la commande set avec des options :

  • v : affiche chaque instruction avant analyse (affiche les noms des variables)
  • x : affiche chaque instruction après analyse (affiche le contenu des variables)
  • e : quitte immédiatement le script en cas d'erreur

Ces options s'activent avec set -option et se désactivent avec set +option.

#!/bin/sh
set -x
date
set +x

Qui exécute ?

Chaque utilisateur peut choisir son Shell. Un script écrit pour un Shell peut ne pas fonctionner dans un autre. Pour assurer la portabilité, on indique en début de script l'interpréteur à utiliser grâce à la ligne #!interpréteur.

#!/bin/sh
date

Exemple pour le Korn Shell :

#!/bin/ksh
date

Cette ligne n'est pas un commentaire mais une instruction pour le système.

Les variables

Les variables permettent de stocker des informations pour réutilisation. Elles sont créées à la volée, sans déclaration de type. Leur nom commence par une lettre ou un underscore _, suivi de lettres, chiffres ou underscores. Les mots-clés Shell ne peuvent pas être utilisés comme noms.

Le contenu d'une variable est toujours une chaîne de caractères. En Bourne Shell, il n'existe pas d'opérations arithmétiques directes ni de tableaux. Ces fonctionnalités sont disponibles dans des shells plus évolués comme Korn Shell ou Bourne Again Shell.

Le Shell distingue deux états pour une variable :

  • Non définie : la variable n'existe pas en mémoire
  • Définie : la variable existe, même si elle est vide

L'affectation et l'accès aux variables simples

Syntaxe d'affectation :

variable=chaîne

Il ne doit pas y avoir d'espace autour du signe =. Pour affecter une chaîne contenant des espaces, on utilise des guillemets simples ou doubles.

Pour accéder au contenu, on précède le nom de variable du caractère $.

Prompt> nom="Pierre"
Prompt> objet="voiture"
Prompt> coul=bleue
Prompt> echo "Il se nomme $nom"
Il se nomme Pierre
Prompt> txt="$nom a une $objet $coul"
Prompt> echo $txt
Pierre a une voiture bleue

Les tableaux (dans shells évolués)

Les shells évolués (Korn Shell, Bourne Again Shell et descendants) permettent la création de tableaux à une dimension.

Syntaxes :

  • Affectation d'un élément : variable[n]=chaîne où n est un entier ≥ 0
  • Affectation multiple : variable=(chaîne1 chaîne2 ...)

L'accès à un élément se fait avec :

${variable[n]}

Pour accéder à tous les éléments :

  • ${variable[*]} concatène tous les éléments en une chaîne
  • ${variable[@]} renvoie tous les éléments séparément (visuellement identique à *)

Exemple :

Prompt> nom[1]="Pierre"
Prompt> nom[5]="Paul"
Prompt> nom="Jacques"
Prompt> i=5
Prompt> prenom=(Pim Pam Poum)
Prompt> echo "Voici mes 3 noms: ${nom[0]}, ${nom[1]} et ${nom[$i]}"
Voici mes 3 noms: Jacques, Pierre et Paul
Prompt> echo "Mon tableau de noms contient ${nom[*]}"
Mon tableau de noms contient Jacques Pierre Paul
Prompt> echo "Mon tableau de prénoms contient ${prenom[@]}"
Mon tableau de prénoms contient Pim Pam Poum

Remarque sur les variables de variables

Il est déconseillé de manipuler des variables de variables (pointeurs) en Shell. Par exemple, la syntaxe $$var ne signifie pas "contenu du contenu de var" mais "contenu de la variable $$" suivi de la chaîne "var".

Glossaire des termes clés

  • Shell : interpréteur de commandes sous Unix, interface entre l'utilisateur et le système.
  • Script Shell : fichier texte contenant une suite de commandes Shell exécutables.
  • Prompt : invite de commande affichée par le Shell pour indiquer qu'il attend une instruction.
  • Variable : espace mémoire nommé contenant une chaîne de caractères.
  • Tableau : variable contenant plusieurs éléments indexés (disponible dans certains shells).
  • Interpréteur : programme chargé d'exécuter un script Shell.
  • Commande interne : instruction reconnue et exécutée directement par le Shell.
  • Commande externe : programme ou utilitaire Unix appelé par le Shell.
  • Débogueur : outil permettant de suivre l'exécution d'un script pour détecter les erreurs.
  • Substitution : mécanisme par lequel le Shell remplace une variable par son contenu.

Points clés à retenir

  • Le Shell est un interpréteur de commandes et un langage de programmation simple mais puissant.
  • Il existe plusieurs shells, chacun avec ses spécificités ; la portabilité nécessite d'indiquer l'interpréteur en début de script.
  • Les scripts Shell automatisent des tâches en regroupant des commandes Unix.
  • La syntaxe Shell est rigoureuse : pas d'espace autour du signe = pour l'affectation, distinction entre majuscules et minuscules.
  • Les variables stockent des chaînes de caractères, accessibles avec $ ; les shells évolués supportent les tableaux.
  • Les commentaires commencent par # et améliorent la lisibilité.
  • Le débogueur set permet de suivre l'exécution des scripts.

Partager

Commentaires

Aucun commentaire pour le moment. Posez la première question.

Les commentaires sont relus avant publication. Votre e-mail n'est jamais affiché.

← Toutes les révisions