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ę?
55
esac
punktów dokładnie tam, gdzie powinien - do linii, która go definiuje i pokazuje, że jest on wymagany.esac
lub coś w tym stylu, jak myślisz, czy byłby w stanie powiedzieć, gdzie jest konieccase
wypowiedzi?case
instrukcji, w taki sam sposóbelse
, jakelif
, ifi
definiuje się jako część składniif
instrukcji. Nie ma własnej semantyki, więc nie ma nic do powiedzenia na ten temat, ale jest na końcu definicjicase
instrukcji, więc tamcase
kończy się instrukcja. Fakt, że jestcase
przeliterowany do tyłu, jest wygodną ciekawostką, ale komputer nie dba o to, po prostu wie, że szuka określonego słowa.Odpowiedzi:
Jak
fi
dlaif
idone
dlafor
,esac
jest wymagany sposób na zakończeniecase
komunikatu.esac
jestcase
wpisany do tyłu, a jakfi
jestif
napisane w tył. Nie wiem, dlaczego token kończącyfor
blok nie jestrof
.źródło
od
koniecdo
bloku? :)\od
musisz pisać za każdym razem, gdy chcesz użyć tego narzędzia! Co jest rzadkie, ale mój punkt widzenia;)fi
i nieneht
, więc przez analogię byłobyrof
(lubelihw
) i nieod
(też oczywiścieod
jest już zajęte) ... ale może to spodziewa się zbyt dużej spójności z jednym z najbardziej niekonsekwentnych języków jest.Słowo
esac
kluczowe jest rzeczywiście ogranicznikiem wymaganym do zakończeniacase
instrukcjibash
i większość powłok używanych w systemach Unix / Linux z wyłączeniemcsh
rodziny.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.
Ten ostatni nie jest już
do/od
jednakdo/done
Bourne i wszystkie powłoki otrzymane w tymbash
z powoduod
już istniejących, jak polecenie Unix od jego początku ( O ctal d UMP ).Należy pamiętać, że
do/done
bloki funkcjonalne są wprowadzane albo przezfor
tego,while
lubuntil
instrukcje.for
,while
Iuntil
nie muszą być zakończone jakdone
jest wystarczające. To jest powód, dla którego nie ma potrzeby używania hipotetycznychrof
ielihw
żetonów.źródło
„
esac
” Kończy wcześniejsze ”,case
tworzą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 .
od
prawdopodobnie 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:
Sowiecka implementacja LGU Algol68 zrobiła to samo: w języku angielskim pełen szacunku przypadek Algol68 brzmi:
case ~ in ~ out ~ esac
cyrylica 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
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
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.h
jest często cytowane w „Rozprawach programistycznych” studentów IT jako dowód, że nie spali na wykładach. :-)źródło
case out
? nigdy nie widziałem tej składniod
nawet jeśli jeszcze nie zostało to zrobione? Czy nie byłobyrof
alboelihw
?do ~ od
,if ~ fi
acase ~ esac
po 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.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
,while
orazuntil
wykorzystaniedo
...done
zamiast odwrócenie kolejności liter, więc nie jest pewne niespójności.źródło