Co oznacza „esac” na końcu instrukcji bash? Czy to jest wymagane

55

Znalazłem wiele przykładów „esac” pojawiających się na końcu instrukcji bash case, ale nie znalazłem żadnej przejrzystej dokumentacji dotyczącej jego użycia. Strona podręcznika używa go, a nawet ma indeks tego słowa ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ), ale nie definiuje jego użycia. Czy jest to wymagany sposób, aby zakończyć opis przypadku, najlepszą praktykę lub czystą technikę?

GrnMtnBuckeye
źródło
2
Wpis indeksu dla esacpunktów dokładnie tam, gdzie powinien - do linii, która go definiuje i pokazuje, że jest on wymagany.
hobbs
@ Hobbs, masz rację, że indeks wskazuje linię ilustrującą jego użycie, ale nie definiuje go w żaden sposób, zwłaszcza w porównaniu ze sposobem, w jaki opisuje użycie innych znaków, takich jak „|” lub „;” lub „;;”. Teraz, gdy przeczytałem odpowiedź (y), pisownia wsteczna „case” wydaje się być tak de facto standardem dla kończących się poleceń, że większość doświadczonych użytkowników uznałaby to za coś oczywistego.
GrnMtnBuckeye
Jeśli nie masz esaclub coś w tym stylu, jak myślisz, czy byłby w stanie powiedzieć, gdzie jest koniec casewypowiedzi?
Barmar
Definiuje go jako część składni caseinstrukcji, w taki sam sposób else, jak elif, i fidefiniuje się jako część składni ifinstrukcji. Nie ma własnej semantyki, więc nie ma nic do powiedzenia na ten temat, ale jest na końcu definicji caseinstrukcji, więc tam casekończy się instrukcja. Fakt, że jest caseprzeliterowany do tyłu, jest wygodną ciekawostką, ale komputer nie dba o to, po prostu wie, że szuka określonego słowa.
hobbs
1
@ Hobbs „... nie ma nic do powiedzenia na ten temat ...”, ale właśnie napisałeś akapit wyjaśniający, dlaczego nie ma o tym nic do powiedzenia. Ważne jest, aby zrozumieć intencję „esaca”. Dlatego na to pytanie ma prostą odpowiedź z dużą liczbą pozytywnych opinii.
Angelo

Odpowiedzi:

99

Jak fidla ifi donedla for, esacjest wymagany sposób na zakończenie casekomunikatu.

esacjest casewpisany do tyłu, a jak fijest ifnapisane w tył. Nie wiem, dlaczego token kończący forblok nie jest rof.

Jacob Minshall
źródło
33
Masz na myśli, dlaczego to nie odkoniec dobloku? :)
Wildcard
4
Wyobraź sobie, że \odmusisz pisać za każdym razem, gdy chcesz użyć tego narzędzia! Co jest rzadkie, ale mój punkt widzenia;)
Score_Under
2
Ściągnął cię z 666. Nie ma za co: P. I świetna odpowiedź!
TheWanderer,
12
@Wildcard Jest fii nie neht, więc przez analogię byłoby rof(lub elihw) i nie od(też oczywiście odjest już zajęte) ... ale może to spodziewa się zbyt dużej spójności z jednym z najbardziej niekonsekwentnych języków jest.
zwolnienie
1
ROTFL nic więcej do powiedzenia
Gerhard D.
55

Słowo esackluczowe jest rzeczywiście ogranicznikiem wymaganym do zakończenia caseinstrukcji bashi większość powłok używanych w systemach Unix / Linux z wyłączeniem cshrodziny.

Oryginalną powłokę Bourne'a stworzył Steve Bourne, który wcześniej pracował nad ALGOL68 . Ten język wynalazł tę technikę odwróconego słowa w celu rozgraniczenia bloków.

case/esac

if/fi

do/od

Ten ostatni nie jest już do/odjednak do/doneBourne i wszystkie powłoki otrzymane w tym bashz powodu odjuż istniejących, jak polecenie Unix od jego początku ( O ctal d UMP ).

Należy pamiętać, że do/donebloki funkcjonalne są wprowadzane albo przez fortego, whilelub untilinstrukcje. for, whileI untilnie muszą być zakończone jak donejest wystarczające. To jest powód, dla którego nie ma potrzeby używania hipotetycznych rofi elihwżetonów.

jlliagre
źródło
6

esac” Kończy wcześniejsze ”, casetworząc„ blok kodu ”.

W Algol68 są one używane, na ogół odwrócona sekwencja znaków słowa kluczowego wprowadzającego służy do zakończenia obudowy, np ( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).

Nazwałbym ich „Strzeżonymi blokami” po Edsgerze Dijkstrze i jego Guarded Command Language .

odprawdopodobnie nie był używany w powłoce Bourne'a z powodu wcześniejszego istnienia uniksowego polecenia „od” .

Historia:

Wygląda na to, że pomysł „Guarded Block” pochodzi z ALGOL 68, np. Angielski:

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;

Sowiecka implementacja LGU Algol68 zrobiła to samo: w języku angielskim pełen szacunku przypadek Algol68 brzmi: case ~ in ~ out ~ esaccyrylica to brzmi выб ~ в ~ либо ~ быв.

Następnie w 1975 r. Bloki kodu Algol68 zostały pożyczone przez Edsger Dijkstra dla jego Guarded Command Language . na przykład

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

Przypuszczalnie Dijstra używane „strzeżonego bloków”, aby przezwyciężyć błędnych innego niejasności realizowany w Algol60 a następnie ponownie zaprojektowany w C Programming Language . (por . konflikt shift-redukcja ).

Wreszcie - z Algol68 - „ esac” trafił do powłoki Bourne'a z 1977 r. (Gdzie odkryłeś esac) dzięki uprzejmości Stephena R. Bourne'a, który opracował wczesny kompilator Algol68 o nazwie ALGOL 68C .

Słynny Stephen używał również tych samych bloków bezpieczeństwa w „pliku nagłówkowym C” o nazwie macro.h

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

Znani geniusze oprogramowania, Landon Curt Noll i Larry Bassel, natknęli się na kod macro.h Steve'a w 1984 r., Kiedy zostali zatrudnieni w grupie portali Genix firmy National Semiconductor i starali się zrozumieć jego zastosowanie. I tak Landon i Larry stworzyli Międzynarodowy Konkurs Obfuscated C Code ...

Od 1984 r. Do dnia dzisiejszego istniało kilka tysięcy innych „lepszych” języków programowania, które nie używają poleceń strzeżonych Dijkstry. Wykorzystanie ich przez Stevena Bourne'a macro.hjest często cytowane w „Rozprawach programistycznych” studentów IT jako dowód, że nie spali na wykładach. :-)

NevilleDNZ
źródło
Co jest case out? nigdy nie widziałem tej składni
Dani_l
1
@Dani_l To składnia Algol68 nieprzyjęta przez powłokę Bourne'a.
jlliagre
Dlaczego mieliby to nazywać, odnawet jeśli jeszcze nie zostało to zrobione? Czy nie byłoby rofalbo elihw?
flarn2006
Wybór do ~ od, if ~ fia case ~ esacpo prostu oznacza, że ​​niekończące się przyszłe pokolenia studentów będą w stanie zastanowić się nad Algol68 i dodać prostą „krytykę” Algol68 do projektu z ostatniego roku, bez konieczności pisania więcej niż strony (linii?) Kodu Algol68.
NevilleDNZ
1

Tak, jest to wymagane. Jak Jacob wskazuje powyżej, jego logika jest taka sama jak if/ fi. Tradycyjne ograniczniki komentarzy C, /*a */także parują podobnie. Ponieważ C zostało napisane tak, aby Unix mógł być napisany głównie w C, z minimum kodu asemblującego, z dużym nakładaniem się między zespołami programistycznymi C i Unix, rozsądne jest przyjęcie wspólnego źródła, że ​​końcowy odpowiednik wielu -Znak blokowy znaku powinien być tą samą sekwencją znaków w odwrotnej kolejności.

W przeciwieństwie do tego, jak pętle for, whileoraz untilwykorzystanie do... donezamiast odwrócenie kolejności liter, więc nie jest pewne niespójności.

Monty Harder
źródło
3
Składnia pochodzi z Bourne, który ponownie został zainspirowany przez ALGOL.
Runium