le Shell : langage de programmation

  1. Unix fut écrit en C (ou plutôt le C fut écrit pour écrire Unix).
  2. Les shells Unix sont écrits en C.

La filiation est évidente, et les mécanismes mis en œuvre dans le shell découlent directement de ses 2 parents.
L’idée de base d’un interpréteur de commande, est qu’il doit être interactif, mais également pouvoir servir à lancer des traitements automatisés (les traitements par lots ou batch).
Pour ce faire, et conformément à l’un des préceptes de base d’Unix (une tache peut être décomposée en autant d’opérations simples que nécessaire, et donc un programme ne doit généralement accomplir qu’une tache bien délimitée – mais la faire bien !!!) : le shell va permettre d’enchaîner une suite de commandes Unix afin de réaliser un objectif déterminé ; et ces suites de commandes peuvent être enregistrées dans un fichier pour pour pouvoir être rejouées à l’envie.

Celà revient donc à écrire un programme dont la syntaxe du code source devra correspondre à la syntaxe de l’interpréteur de commandes cible qui sera donc destiné à être exécuté par le shell :  De fait; l’interpréteur de commandes est bien également un langage de programmation.
Mais, à la différence du langage C, par exemple, qui est un langage compilé, un programme suivant la syntaxe du shell ne devra pas être compilé avant de s’éxécuter (au demeurant, c’est quand même parfait pour tout ce qui est du domaine de l’administration système : on modifie le source, et on exécute sans autre forme de procès !!!).

Il s’agit donc d’un langage informatique interprété dont la principale fonctionnalité est de permettre l’enchaînement de commandes Unix pour au final effectuer une tache bien déterminée.
Comme tout langage de programmation, le shell peut mémoriser les données avec lesquelles il travaille dans des variables :

Pour être valide, le nom de toute variable doit obligatoirement débuter par un des caractères compris dans [a-zA-Z_] : une lettre (majuscule ou minuscule) ou un tiret bas. Les caractères suivants pouvant être compris dans l’ensemble [a-zA-Z0-9_] : c’est à dire les mêmes plus les chiffres.

Exemples de noms valides :

_UnNombre
Un_Nombre
Un_Nombre_

Exemples de noms invalides :

1_Nombre
-Un_Nombre
/Un_Nombre_

La déclaration d’une variable est optionnelle (elle est alors implicitement déclarée lors de son affectation), mais peut faire l’objet d’une instruction particulière via les commandes internes declare ou typeset qui suivent la syntaxe suivante :

declare | typeset [option] [nom[=affectation]]

L’accès à la valeur de ces variables se fait via la notation préfixée par le symbole $, ainsi la déclaration d’une variable toto s’écrit :

toto=1

et la récupération de sa valeur via :

print $toto

Les shells sont des interpréteurs faiblement typés, et considèrent (sauf stipulation contraire) que toute valeur d’une variable est une chaine de caractères.

Le shell renseigne automatiquement un certain nombre de variables :

La commande interne shift [n] permet de décaler (de n positions si n est fourni) vers la gauche l’ensemble des arguments. Elle met à jour l’ensemble des paramètres positionnels à l’exception de $0 qui représentera toujours le nom du script. Cette commande peut être utile pour traiter successivement l’ensemble des arguments fournis à un script.

La commande interne exit [n] permet d’arrêter l’exécution et de transmettre le code de retour d’un script. Appelée sans argument, exit arrête l’exécution du script et retourne 0. A défaut d’appel de exit, le script se termine en retournant 0.

Les commandes env et set permettent notamment de lister les variables d’une session shell ou les variables d’environnement par défaut …

la suite …