Ich habe mehrere Beispiele für "esac" gefunden, die am Ende einer Bash-Case-Anweisung erscheinen, aber ich habe keine eindeutige Dokumentation zu ihrer Verwendung gefunden. Die Manpage verwendet es und hat sogar einen Index für das Wort ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ), definiert aber nicht seine Verwendung. Ist dies der erforderliche Weg, um eine Fallbeschreibung, eine bewährte Vorgehensweise oder eine reine Technik zu beenden?
55
esac
Punkte genau dort, wo er sein sollte - auf die Linie, die ihn definiert und veranschaulicht, dass er erforderlich ist.esac
oder so ähnlich, wie könnte es Ihrer Meinung nach erkennen, wo das Ende dercase
Aussage liegt?case
Anweisung, in der gleichen Weise,else
,elif
, undfi
definiert sind als Teil der Syntax eines seinif
Aussage. Es hat keine eigene Semantik, daher gibt es nichts zu sagen, aber es steht am Ende der Definition einercase
Anweisung, alsocase
endet eine Anweisung. Die Tatsache, dass escase
rückwärts geschrieben ist, ist eine praktische Kuriosität, aber dem Computer ist es egal, er weiß nur, dass er nach einem bestimmten Wort sucht.Antworten:
Wie
fi
fürif
unddone
fürfor
,esac
ist der erforderliche Weg, um einecase
Aussage zu beenden .esac
istcase
rückwärts buchstabiert, eher wiefi
istif
rückwärts buchstabiert. Ich weiß nicht, warum das Token, das einenfor
Block beendet, nicht istrof
.quelle
od
, einendo
Block zu beenden ? :)\od
jedes Mal tippen, wenn Sie dieses Dienstprogramm verwenden möchten! Was selten ist, aber mein Punkt steht;)fi
und nichtneht
, also wäre es analogrof
(oderelihw
) und nichtod
(natürlichod
ist es auch schon vergeben) ... aber vielleicht erwartet dies zu viel Selbstkonsistenz aus einer der selbstinkonsistentesten Sprachen es gibt.Das
esac
Schlüsselwort ist in der Tat ein erforderliches Trennzeichen, um einecase
Anweisung zu beenden,bash
und die meisten unter Unix / Linux verwendeten Shells mit Ausnahme dercsh
Familie.Die ursprüngliche Bourne-Shell wurde von Steve Bourne erstellt, der zuvor an ALGOL68 gearbeitet hatte . Diese Sprache erfand diese umgekehrte Worttechnik, um Blöcke abzugrenzen.
Letzteres gibt es
do/od
nurdo/done
in Bourne und allen abgeleiteten Shells, auchbash
weilod
es seit seiner Einführung ( o ctal d ump ) bereits als Unix-Befehl existierte .Beachten Sie, dass
do/done
Funktionsblöcke entweder durch diefor
, diewhile
oder dieuntil
Anweisungen eingeführt werden.for
,while
Unduntil
müssen nicht beendet werden alsdone
ausreichend ist. Das ist der Grund, warum das Hypothetischerof
und dieelihw
Token nicht benötigt werden .quelle
Das "
esac
" beendet ein früheres "case
", um einen " Codeblock " zu bilden.In Algol68 werden sie verwendet, im Allgemeinen wird die umgekehrte Zeichenfolge des einleitenden Schlüsselworts zum Beenden des Gehäuses verwendet, z
( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).
Ich würde sie nach Edsger Dijkstra und seiner Guarded Command Language "Guarded Blocks" nennen .
od
Wurde in der Bourne-Shell vermutlich nicht verwendet, da der Unix- Befehl "od" bereits vorhanden war .Die Geschichte:
Die Idee "Guarded Block" scheint von ALGOL 68 zu stammen, zB Englisch:
Die Algol68-LGU-Implementierung des Sowjets hat das Gleiche getan: In Englisch lautet die ehrfurchtsvolle Erklärung von Algol68
case ~ in ~ out ~ esac
, in Kyrillisch lautet sieвыб ~ в ~ либо ~ быв
.1975 wurden die Code-Blöcke von Algol68 von Edsger Dijkstra für seine Guarded Command Language ausgeliehen . z.B
Vermutlich verwendete Dijstra "Guarded Blocks", um die in Algol60 implementierte und dann in der Programmiersprache C überarbeitete Dangling else- Ambiguität zu überwinden . (vgl. Schichtreduzierungskonflikt. )
Schließlich - von Algol68 - "
esac
" schaffte es 1977 mit freundlicher Genehmigung von Stephen R. Bourne , der einen frühen Algol68-Compiler namens ALGOL 68C entwickelt hatte, in die Bourne-Shell (wo Sie es entdecktenesac
) .Bekanntermaßen verwendete Stephen diese Guarded Blocks auch in einer "C-Header-Datei" namens " macro.h"
Die bemerkenswerten Software-Genies Landon Curt Noll und Larry Bassel stießen 1984 bei der Genix-Portierungsgruppe von National Semiconductor auf Steves macro.h-Code und hatten Mühe, dessen Anwendung zu verstehen. Und so gründete Landon & Larry den International Obfuscated C Code Contest ...
Von 1984 bis heute gab es mehrere tausend andere "bessere" Programmiersprachen, die die geschützten Befehle von Dijkstra nicht verwenden. Und Steven Bournes Einsatz in diesen
macro.h
Studiengängen wird inzwischen häufig in den "Software Development Dissertations" von IT-Studenten als Beweis dafür angeführt, dass sie nicht in Vorlesungen geschlafen haben. :-)quelle
case out
?od
auch wenn es nicht schon vergeben war? Wäre es nichtrof
oderelihw
?do ~ od
,if ~ fi
undcase ~ esac
einfach bedeutet , dass endlose künftige Generationen von undergrads der Lage sein werden Algol68 nachzudenken und eine einfache „Kritik“ von Algol68 in ihrem letztes Jahr Projekt hinzufügen, ohne tatsächlich mehr schreiben , um mit dann einer Seite (Linie?) Von Algol68 Code.Ja, das ist erforderlich. Wie Jacob oben ausgeführt hat, ist die Logik dieselbe wie bei
if
/fi
. Herkömmliche C-Kommentar-Begrenzer/*
und werden*/
ähnlich gepaart. Da C so geschrieben wurde, dass Unix größtenteils in C mit einem Minimum an Assembler-Code und einer großen Überlappung zwischen den C- und Unix-Entwicklungsteams geschrieben werden kann, ist es vernünftig, eine gemeinsame Quelle des Begriffs anzunehmen, dass das abschließende Äquivalent eines Multi -Zeichenblock-Begrenzer sollte dieselbe Zeichenfolge in umgekehrter Reihenfolge sein.Im Gegensatz dazu Schleifen wie
for
,while
unduntil
Verwendungdo
...done
stattdessen Charakter , um umzukehren, so gibt es einige Inkonsistenz.quelle