Что означает «esac» в конце заявления случая bash? Это обязательно?

55

Я нашел несколько примеров «esac», появляющихся в конце заявления случая bash, но я не нашел четкой документации по его использованию. Страница man использует его и даже имеет индекс по слову ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ), но не определяет его использование. Это обязательный способ завершить постановку дела, передовой опыт или чистую технику?

GrnMtnBuckeye
источник
2
Индексная запись esacуказывает, где именно это должно быть - на строку, которая ее определяет и иллюстрирует, что это необходимо.
Хоббс
@hobbs, вы правы, указатель указывает на строку, которая иллюстрирует его использование, но никак не определяет его, особенно по сравнению с тем, как он описывает использование других символов, таких как «|» или же ";" или же ";;". Теперь, когда я прочитал ответ (ы), «обратный» орфографический «случай» кажется настолько фактическим стандартом для завершения команд, что большинство опытных пользователей воспримут это как должное.
GrnMtnBuckeye
Если у вас не было esacили что-то в этом роде, как, по вашему мнению, можно было бы определить, где находится конец caseутверждения?
Бармар
Он определяет его как часть синтаксиса caseзаявления, таким же образом , что else, elifи fiопределяются как часть синтаксиса ifзаявления. У него нет собственной семантики, поэтому об этом нечего сказать, но это в конце определения caseоператора, поэтому на этом caseоператор заканчивается. Тот факт, что оно caseнаписано задом наперед, является любопытным любопытством, но компьютеру все равно, он просто знает, что ищет определенное слово.
Хоббс
1
@hobbs "... тут нечего сказать ...", но вы только что написали параграф, объясняющий, почему тут нечего сказать. Важно просто понять намерения "esac". Вот почему этот вопрос имеет прямой ответ с большим количеством голосов.
Анджело

Ответы:

99

Как fiдля ifи doneдля for, esacявляется искомым способом закончить caseзаявление.

esacкак caseпишется назад, а как fiэто ifпишется в обратном направлении. Я не знаю, почему токен, заканчивающий forблок, не является rof.

Джейкоб Миншалл
источник
33
Ты имеешь в виду, почему не odзакончить doблок? :)
Wildcard
4
Представьте, что вам нужно печатать \odкаждый раз, когда вы хотите использовать эту утилиту! Что редко, но моя точка зрения стоит;)
Score_Under
2
Вытащил вас из 666. Всегда пожалуйста: P. И отличный ответ!
Странник
12
@Wildcard Это fiи нет neht, поэтому по аналогии это будет rof(или elihw) и нет od(также, конечно, odуже занято) ... но, возможно, это требует слишком много самосогласованности из одного из самых несовместимых языков есть.
zwol
1
ROTFL больше нечего сказать
герхард д.
55

esacКлючевое слово действительно требуется разделитель , чтобы закончить caseзаявление , в bashи большинство оболочек используется в Unix / Linux за исключением cshсемьи.

Оригинальная оболочка Bourne была создана Стивом Борном, который ранее работал над ALGOL68 . Этот язык изобрел эту технику обратного слова для разделения блоков.

case/esac

if/fi

do/od

Последнее не более , do/odно do/doneв Bourne и все производных оболочек в том числе bashиз - за odуже существующие в качестве команды Unix с момента его создания ( о ЛАСТАХ д UMP ).

Следует отметить , что do/doneфункциональные блоки вводятся либо в for, на while, или untilинструкция. for, whileИ untilне должны быть прекращены , как doneдостаточно. Вот почему нет нужды в гипотетических rofи elihwтокенах.

jlliagre
источник
6

" esac" Завершает более раннее " case", чтобы сформировать " кодовый блок ".

В Algol68 они используются, как правило, для завершения вложения используется обратная последовательность символов вводящего ключевого слова, например ( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).

Я бы назвал их «Охраняемые блоки» в честь Эдсгера Дейкстры и его « Охраняемого командного языка» .

odпо-видимому, не использовался в Bourne Shell из-за существования в Unix команды «od» .

История:

Идея "Охраняемого блока" пришла из Алгола 68, например, английского:

proc days in month = (int year, month)int:

  case month in
    31,
    if year mod 4=0  year mod 1000    year mod 400=0 then 29 else 28 fi,
    31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  esac;

Советская реализация LGU Algol68 сделала то же самое: на английском языке благоговейная формулировка Algol68 гласит case ~ in ~ out ~ esac: на кириллице это звучит так выб ~ в ~ либо ~ быв.

Затем в 1975 году кодовые блоки Algol68 были заимствованы Эдсгером Дейкстрой для его защищенного командного языка . например

if a  b  max := a
| b  a  max := b
fi

Предположительно, Диджстра использовал «Охраняемые блоки», чтобы преодолеть неоднозначность Dangling else, реализованную в Algol60 и затем переработанную на языке программирования Си . (ср. сдвиг-уменьшение конфликта. )

Наконец - из Algol68 - « esac» сделал его в оболочку Bourne 1977 года (где вы обнаружили esac) благодаря Стивену Борну, который разработал ранний компилятор Algol68 под названием ALGOL 68C .

Известно, что Стивен также использовал эти самые защищенные блоки в «заголовочном файле C», который называется macro.h

#define IF  if(
#define THEN    ){
#define ELSE    } else {
#define ELIF    } else if (
#define FI  ;}

Известные гении программного обеспечения Лэндон Курт Нолл и Ларри Бассель наткнулись на код macro.h Стива в 1984 году, когда работали в группе переноса Genix National Semiconductor, и пытались понять, как это можно сделать. И вот тогда Landon & Larry создали Международный конкурс кодов с запутанным кодом C ...

С 1984 года по сегодняшний день существует несколько тысяч других «лучших» языков программирования, которые не используют охраняемые команды Дейкстры. И использование их Стивеном Борном в macro.hнастоящее время часто цитируется в «диссертациях по разработке программного обеспечения» магистрантов ИТ как доказательство того, что они не спали на лекциях. :-)

NevilleDNZ
источник
Что case out? никогда не видел этот синтаксис
Dani_l
1
@Dani_l Это синтаксис Algol68, не принятый оболочкой Bourne.
Jlliagre
Почему они назвали бы это, odдаже если это не было уже взято? Не было бы rofили elihw?
flarn2006
Выбор do ~ od, if ~ fiи case ~ esacпросто означает, что бесконечные будущие поколения старшекурсников смогут обдумать Algol68 и добавить простую «критику» Algol68 в свой проект последнего года без необходимости писать больше, чем страницу (строку?) Кода Algol68.
NevilleDNZ
1

Да, это обязательно. Как указывает Джейкоб выше, логика этого та же, что и if/ fi. Традиционные разделители комментариев C, /*а */также пары аналогично. Поскольку C был написан так, что Unix мог быть написан в основном на C, с минимумом кода на ассемблере и большим перекрытием между командами разработчиков C и Unix, разумно предположить, что общий источник понятия, что закрывающий эквивалент мульти Разделитель -character должен иметь одинаковую последовательность символов в обратном порядке.

Напротив, циклы типа for, whileи untilиспользуют do... doneвместо изменения порядка символов, так что есть некоторая несогласованность.

Монти Хардер
источник
3
Синтаксис пришел от Борна, который снова был вдохновлен ALGOL.
Runium