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