Синтаксис оболочки основан на префиксах. В нем есть пункты, введенные специальными ключевыми словами. Некоторые пункты должны идти вместе.
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 выглядел как Algol. Вы можете просмотреть источники оболочки 1979 года из Версии 7 Unix . Макросы находятся внутри mac.h
, и они используются повсеместно. Например if
заявления предоставляются в качестве IF
... ELSE
... ELIF
... FI
.