Ответ 1
По запросу:
- Так вы можете догадаться, почему цикл "
for ...; do ...; done
", а не "for ...; do ...; od
"? Для этого была веская причина - но ключевое слово с обратным обращением, подобным Алголу, для обозначения конца было использовано в другом месте.
Ответ:
- Синтаксис был получен от Bourne (от славы раковины Bourne). Он работал над Algol, и ему понравилось достаточно, чтобы смоделировать синтаксис оболочки на Algol. Алгол использует обратные ключевые слова, чтобы отметить концы конструкций, поэтому "case... esac" был подходящим. Причина, по которой циклы не заканчиваются на "od", заключается в том, что в Unix-восьмеричном дампе уже была команда "od". Итак, вместо этого используется "done".
По репутации исходный код оболочки Bourne был написан на идиосинкразическом C с макросами, чтобы он выглядел как Algol. Это затрудняло поддержание.
В отношении основного вопроса - о том, почему не существует открытой скобки (скобки) вокруг альтернатив в выражении case
- у меня есть пара связанных теорий.
Прежде всего, когда была написана оболочка Борна (конец 1970-х годов), многое редактировалось с помощью ed
, стандартный текстовый редактор. Он не имеет понятия о переходе к сбалансированной круглой скобке или других таких обозначениях, поэтому не было требования для ведущей круглой скобки. Кроме того, если вы пишете документ, вы вполне можете маршалировать свои аргументы с помощью:
a) ...blah...
b) ...more...
c) ...again...
Открывающая скобка часто опускается - и оператор case
подходит к этой модели довольно счастливо.
Конечно, с тех пор мы привыкли к редакторам, которые отмечают совпадающие открытые круглые скобки при вводе закрывающей круглой скобки, поэтому старая нотация оболочки Bourne является досадой. Стандарт POSIX делает ведущие скобки необязательными; наиболее современные реализации POSIX-подобных оболочек (Korn, Bash, Zsh) будут поддерживать это, и я обычно использую его, когда мне не нужно беспокоиться о переносимости на такие машины, как Solaris 10, где /bin/sh все еще является верная оболочка Борна, которая не позволяет вести круглые скобки. (Обычно я занимаюсь этим, используя #!/bin/ksh
как shebang.)