La sintaxis de Shell está basada en prefijo. Tiene cláusulas introducidas por palabras clave especiales. Ciertas cláusulas tienen que ir juntas.
Un whilebucle se compone de uno o más comandos de prueba:
test ; test ; test ; ...
y por uno o más comandos del cuerpo:
body ; body ; body ; ...
Algo tiene que decirle al shell que comienza un ciclo while. Ese es el propósito de la whilepalabra:
while test ; test ; test ; ...
Pero entonces, las cosas son ambiguas. ¿Qué comando es el comienzo del cuerpo? Algo tiene que indicar eso, y eso es lo doque hace el prefijo:
do body ; body ; body ; ...
y, finalmente, algo tiene que indicar que se ha visto el último cuerpo; una palabra clave especial donehace eso.
Estas palabras clave de shell no requieren separación de punto y coma, incluso en la misma línea. Por ejemplo, si cierra varios bucles anidados, simplemente puede tener done done done ....
Más bien, el punto y coma se encuentra entre ... test ; body ... si están en la misma línea. Se entiende que ese punto y coma es un terminador: pertenece al test. Por lo tanto, si dose inserta una palabra clave entre ellas, debe ir entre el punto y coma y body. Si estuviera al otro lado del punto y coma, estaría incorrectamente incrustado dentro de la testsintaxis del comando, en lugar de colocarse entre los comandos.
La sintaxis de shell fue diseñada originalmente por Stephen Bourne y está inspirada en Algol . Bourne amaba tanto a Algol que utilizó muchas macros de C en el código fuente del shell para hacer que C se pareciera a Algol. Puede explorar las fuentes de shell con fecha de 1979 de la Versión 7 de Unix . Las macros están adentro mac.hy se usan por todas partes. Por ejemplo, iflas declaraciones se representan como IF... ELSE... ELIF... FI.