Синтаксис оболочки основан на префиксах. В нем есть предложения, введенные специальными ключевыми словами. Некоторые пункты должны идти вместе.
Цикл while
состоит из одной или нескольких тестовых команд.:
test ; test ; test ;...
и одной или несколькими командами тела:
body ; body ; body ;...
Что-то должно сообщить оболочке, что начинается цикл while. В этом смысл while
слова:
while test ; test ; test ;...
Но тогда все неоднозначно. Какая команда является началом тела? Что-то должно указывать на это, и именно это делает префикс do
:
do body ; body ; body ;...
и, наконец, что-то должно указывать на то, что видели последнее тело; для этого используется специальное ключевое слово done
.
Эти ключевые слова оболочки не требуют разделения точкой с запятой даже в одной строке. Например, если вы закрываете несколько вложенных циклов, вы можете просто done done done...
.
Скорее точка с запятой ставится между ... test ; body...
, если они находятся на одной строке. Эта точка с запятой понимается как терминатор :, она принадлежит к test
. Следовательно, если между ними вставлено ключевое слово do
, оно должно располагаться между точкой с запятой и body
. Если бы он был по другую сторону точки с запятой, он был бы ошибочно встроен в синтаксис команды test
, а не помещен между командами.
Синтаксис оболочки был первоначально разработан Стивеном Борном и вдохновлен Algol . Борн так любил Алгол, что использовал множество макросов C в исходном коде оболочки, чтобы сделать C похожим на Алгол. Вы можете просмотреть исходные коды оболочки, датированные 1979 годом -, из версии 7 Unix . Макросы находятся в mac.h
, и они используются повсеместно. Например, операторы if
отображаются как IF
... ELSE
... ELIF
... FI
.