A sintaxe do shell é baseada em prefixo. Possui cláusulas introduzidas por palavras-chave especiais. Certas cláusulas precisam seguir juntas.
Um whileloop é formado por um ou mais comandos de teste:
test ; test ; test ; ...
e por um ou mais comandos do corpo:
body ; body ; body ; ...
Algo precisa dizer ao shell que um loop while começa. Esse é o objetivo da whilepalavra:
while test ; test ; test ; ...
Mas então, as coisas são ambíguas. Qual comando é o começo do corpo? Algo tem que indicar isso, e é isso que o doprefixo faz:
do body ; body ; body ; ...
e, finalmente, algo tem que indicar que o último corpo foi visto; uma palavra-chave especial donefaz isso.
Essas palavras-chave shell não requerem separação de ponto e vírgula, mesmo na mesma linha. Por exemplo, se você fechar vários loops aninhados, poderá apenas ter done done done ....
Em vez disso, o ponto e vírgula é entre ... test ; body ... se eles estiverem na mesma linha. Esse ponto-e-vírgula é entendido como um terminador: ele pertence ao test. Portanto, se uma dopalavra-chave é inserida entre eles, ela deve ir entre o ponto e vírgula e body. Se estivesse do outro lado do ponto e vírgula, seria incorretamente incorporado à testsintaxe do comando, em vez de ser colocado entre os comandos.
A sintaxe do shell foi originalmente projetada por Stephen Bourne e é inspirada em Algol . Bourne amava tanto o Algol que usava muitas macros C no código-fonte do shell para fazer o C parecer com o Algol. Você pode procurar as fontes de shell datadas de 1979 na Versão 7 Unix . As macros estão inseridas mac.he são usadas em todo o lugar. Por exemplo ifdeclarações são processados como IF... ELSE... ELIF... FI.