Що означає "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 1000    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.