Я нашел несколько примеров «esac», появляющихся в конце заявления случая bash, но я не нашел четкой документации по его использованию. Страница man использует его и даже имеет индекс по слову ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ), но не определяет его использование. Это обязательный способ завершить постановку дела, передовой опыт или чистую технику?
55
esac
указывает, где именно это должно быть - на строку, которая ее определяет и иллюстрирует, что это необходимо.esac
или что-то в этом роде, как, по вашему мнению, можно было бы определить, где находится конецcase
утверждения?case
заявления, таким же образом , чтоelse
,elif
иfi
определяются как часть синтаксисаif
заявления. У него нет собственной семантики, поэтому об этом нечего сказать, но это в конце определенияcase
оператора, поэтому на этомcase
оператор заканчивается. Тот факт, что оноcase
написано задом наперед, является любопытным любопытством, но компьютеру все равно, он просто знает, что ищет определенное слово.Ответы:
Как
fi
дляif
иdone
дляfor
,esac
является искомым способом закончитьcase
заявление.esac
какcase
пишется назад, а какfi
этоif
пишется в обратном направлении. Я не знаю, почему токен, заканчивающийfor
блок, не являетсяrof
.источник
od
закончитьdo
блок? :)\od
каждый раз, когда вы хотите использовать эту утилиту! Что редко, но моя точка зрения стоит;)fi
и нетneht
, поэтому по аналогии это будетrof
(илиelihw
) и нетod
(также, конечно,od
уже занято) ... но, возможно, это требует слишком много самосогласованности из одного из самых несовместимых языков есть.esac
Ключевое слово действительно требуется разделитель , чтобы закончитьcase
заявление , вbash
и большинство оболочек используется в Unix / Linux за исключениемcsh
семьи.Оригинальная оболочка Bourne была создана Стивом Борном, который ранее работал над ALGOL68 . Этот язык изобрел эту технику обратного слова для разделения блоков.
Последнее не более ,
do/od
ноdo/done
в Bourne и все производных оболочек в том числеbash
из - заod
уже существующие в качестве команды Unix с момента его создания ( о ЛАСТАХ д UMP ).Следует отметить , что
do/done
функциональные блоки вводятся либо вfor
, наwhile
, илиuntil
инструкция.for
,while
Иuntil
не должны быть прекращены , какdone
достаточно. Вот почему нет нужды в гипотетическихrof
иelihw
токенах.источник
"
esac
" Завершает более раннее "case
", чтобы сформировать " кодовый блок ".В Algol68 они используются, как правило, для завершения вложения используется обратная последовательность символов вводящего ключевого слова, например
( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).
Я бы назвал их «Охраняемые блоки» в честь Эдсгера Дейкстры и его « Охраняемого командного языка» .
od
по-видимому, не использовался в Bourne Shell из-за существования в Unix команды «od» .История:
Идея "Охраняемого блока" пришла из Алгола 68, например, английского:
Советская реализация LGU Algol68 сделала то же самое: на английском языке благоговейная формулировка Algol68 гласит
case ~ in ~ out ~ esac
: на кириллице это звучит таквыб ~ в ~ либо ~ быв
.Затем в 1975 году кодовые блоки Algol68 были заимствованы Эдсгером Дейкстрой для его защищенного командного языка . например
Предположительно, Диджстра использовал «Охраняемые блоки», чтобы преодолеть неоднозначность Dangling else, реализованную в Algol60 и затем переработанную на языке программирования Си . (ср. сдвиг-уменьшение конфликта. )
Наконец - из Algol68 - «
esac
» сделал его в оболочку Bourne 1977 года (где вы обнаружилиesac
) благодаря Стивену Борну, который разработал ранний компилятор Algol68 под названием ALGOL 68C .Известно, что Стивен также использовал эти самые защищенные блоки в «заголовочном файле C», который называется macro.h
Известные гении программного обеспечения Лэндон Курт Нолл и Ларри Бассель наткнулись на код macro.h Стива в 1984 году, когда работали в группе переноса Genix National Semiconductor, и пытались понять, как это можно сделать. И вот тогда Landon & Larry создали Международный конкурс кодов с запутанным кодом C ...
С 1984 года по сегодняшний день существует несколько тысяч других «лучших» языков программирования, которые не используют охраняемые команды Дейкстры. И использование их Стивеном Борном в
macro.h
настоящее время часто цитируется в «диссертациях по разработке программного обеспечения» магистрантов ИТ как доказательство того, что они не спали на лекциях. :-)источник
case out
? никогда не видел этот синтаксисod
даже если это не было уже взято? Не было быrof
илиelihw
?do ~ od
,if ~ fi
иcase ~ esac
просто означает, что бесконечные будущие поколения старшекурсников смогут обдумать Algol68 и добавить простую «критику» Algol68 в свой проект последнего года без необходимости писать больше, чем страницу (строку?) Кода Algol68.Да, это обязательно. Как указывает Джейкоб выше, логика этого та же, что и
if
/fi
. Традиционные разделители комментариев C,/*
а*/
также пары аналогично. Поскольку C был написан так, что Unix мог быть написан в основном на C, с минимумом кода на ассемблере и большим перекрытием между командами разработчиков C и Unix, разумно предположить, что общий источник понятия, что закрывающий эквивалент мульти Разделитель -character должен иметь одинаковую последовательность символов в обратном порядке.Напротив, циклы типа
for
,while
иuntil
используютdo
...done
вместо изменения порядка символов, так что есть некоторая несогласованность.источник