La syntaxe du shell est basée sur un préfixe. Il a des clauses introduites par des mots clés spéciaux. Certaines clauses doivent aller de pair.
Une whileboucle est constituée d'une ou plusieurs commandes de test:
test ; test ; test ; ...
et par une ou plusieurs commandes de corps:
body ; body ; body ; ...
Quelque chose doit dire au shell qu'une boucle while commence. C'est le but du whilemot:
while test ; test ; test ; ...
Mais alors, les choses sont ambiguës. Quelle commande est le début du corps? Quelque chose doit l'indiquer, et c'est ce que fait le dopréfixe:
do body ; body ; body ; ...
et, enfin, quelque chose doit indiquer que le dernier corps a été vu; un mot done- clé spécial fait cela.
Ces mots clés shell ne nécessitent pas de séparation par point-virgule, même sur la même ligne. Par exemple, si vous fermez plusieurs boucles imbriquées, vous pouvez simplement en avoir done done done ....
Au lieu de cela, le point-virgule est entre ... test ; body ... s'ils sont sur la même ligne. Ce point-virgule est compris comme un terminateur: il appartient au test. Par conséquent, si un domot-clé est inséré entre eux, il doit aller entre le point-virgule et body. S'il était de l'autre côté du point-virgule, il serait mal intégré dans la testsyntaxe de la commande, plutôt que placé entre les commandes.
La syntaxe du shell a été initialement conçue par Stephen Bourne et est inspirée d' Algol . Bourne aimait tellement Algol qu'il a utilisé beaucoup de macros C dans le code source du shell pour faire ressembler C à Algol. Vous pouvez parcourir les sources du shell datant de 1979 à partir de la version 7 Unix . Les macros sont en place mac.het sont utilisées partout. Par exemple les ifdéclarations sont rendus comme IF... ELSE... ELIF... FI.