Що означає "esac" наприкінці заяви про справу? Це потрібно?


55

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


2
Запис індексу для esacточок саме там, де він повинен бути - до рядка, який його визначає, і ілюструє, що це потрібно.
— варення

@hobbs, ви впевнені, що індекс вказує на рядок, який ілюструє його використання, але він жодним чином не визначає його, особливо порівняно з способом опису використання інших символів, таких як "|" або ";" або ";;". Тепер, коли я прочитав відповідь (відповіді), "випадок" зворотнього написання, як видається, є таким фактичним стандартом для закінчення команд, що більшість досвідчених користувачів сприймають це як належне.
— GrnMtnBuckeye

Якщо у вас цього не було esacчи чогось подібного, як ви думаєте, як він міг би сказати, де кінець caseзаяви?
— Бармар

Він визначає його як частину синтаксису caseвисловлювання так само else, як elif, і fiвизначається як частина синтаксису ifтвердження. У ній немає власної семантики, тому нічого про це не можна сказати, але це в кінці визначення caseвисловлювання, тому на цьому caseзакінчується твердження. Той факт, що це caseнаписано назад, - цікаве цікавість, але комп’ютер не хвилює, він просто знає, що шукає певне слово.
— панно

1
@hobbs "... нема про що сказати ...", але ти лише написав абзац пояснення, чому про це нічого не сказати. Важливо - просто зрозуміти наміри "есака". Ось чому на це запитання є пряма відповідь із достатньою кількістю відгуків.
— Анджело

Відповіді:


99

Як fiдля ifі doneдля for, esacє обов'язковим способом закінчити caseзаяву.

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


33
Ти маєш на увазі, чому це не odзакінчити doблок? :)
— Wildcard

4
Уявіть, що вам потрібно буде вводити \odкожен раз, коли ви хотіли скористатися цією утилітою! Що
— трапляється

2
Зняв вас з 666. Вас вітає: P. І чудова відповідь!
— The Wanderer

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у Борна та всіх похідних оболонок, у bashтому числі тому, що odвже існувала як команда Unix з моменту її створення ( o ctal d ump ).

Слід зазначити , що do/doneфункціональні блоки вводяться або в for, на while, або untilінструкція. for, whileі untilїх не потрібно припиняти, як doneдостатньо. Ось чому немає необхідності в гіпотетичних rofі elihwлексемах.


6

" esac" Закінчується раніше " case" для формування " коду-блоку ".

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

Я б назвав їх "Блоками, що охороняються" за Едджером Дійкстра та його мовою командної охорони .

odімовірно, він не використовувався в оболонці Борна через існування команди "od" Unix .

Історія:

Ідея "Охоронного блоку", схоже, походить від ALGOL 68, наприклад англійською:

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

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

Радянська реалізація Algol68 LGU зробила те ж саме: англійською мовою Algol68 написано шанобливе твердження про справу case ~ in ~ out ~ esac, кирилицею це написано выб ~ в ~ либо ~ быв.

Потім у 1975 році кодові блоки Algol68 були запозичені Едсгером Дайкстра для своєї мови охоронної команди . напр

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

Імовірно Dijstra використовується «Блоки охоронюваних» , щоб подолати обірвану ще неоднозначність реалізований в Algol60 , а потім повторно спроектований в мові програмування C . (пор . конфлікт зрушення-зменшення. )

Нарешті - від Algol68 - " esac" перетворився на оболонку Борна 1977 року (де ви виявили esac) люб'язно надано Стівену Р. Борну, який розробив ранній компілятор Algol68 під назвою ALGOL 68C .

Відомо, що Стівен також використовував ці самі охоронені блоки у "файлі заголовка C", який називається macro.h

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

Значні програмні генії Ландон Керт Нолл та Ларрі Бассел натрапили на код макро.h Стіва в 1984 році, працюючи в групі перевезень Genix National Semiconductor і намагалися зрозуміти його застосування. Тоді Ландон і Ларрі створили Міжнародний конкурс з прихованих кодів С ...

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


Що 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, розумно вважати загальним джерелом уявлення про те, що завершальний еквівалент множини -розмежувач блоку має бути однаковою послідовністю символів у зворотному порядку.

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


3
Синтаксис походить з Борна, який знову надихнувся ALGOL.
— Руніум
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.