J'ai trouvé plusieurs exemples de "esac" apparaissant à la fin d'une déclaration de cas bash mais je n'ai trouvé aucune documentation claire sur son utilisation. La page de manuel l'utilise et a même un index sur le mot ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ), mais ne définit pas son utilisation. Est-ce le moyen requis pour mettre fin à une déclaration de cas, à une pratique exemplaire ou à une technique pure?
56
esac
points exactement où elle devrait - à la ligne qui la définit et illustre que c'est nécessaire.esac
ou quelque chose du genre, comment pensez-vous qu'il serait capable de dire où se trouve la fin de lacase
déclaration?case
déclaration, de la même manière queelse
,elif
etfi
sont définies comme faisant partie de la syntaxe d'uneif
déclaration. Il n'a pas de sémantique propre, donc il n'y a rien à dire à ce sujet, mais c'est à la fin de la définition d'unecase
déclaration, donc c'est là quecase
se termine une déclaration. Le fait qu'il soitcase
orthographié à l'envers est une curiosité commode, mais l'ordinateur ne s'en soucie pas, il sait simplement qu'il recherche un mot particulier.Réponses:
Comme
fi
pourif
etdone
pourfor
,esac
est le moyen requis pour terminer unecase
déclaration.esac
estcase
orthographié en arrière, un peu commefi
estif
orthographié en arrière. Je ne sais pas pourquoi le jeton qui termine unfor
bloc ne l'est pasrof
.la source
od
mettre fin à undo
bloc? :)\od
chaque fois que vous voulez utiliser cet utilitaire! Ce qui est rare, mais mon argument estfi
et pasneht
, donc par analogie ce seraitrof
(ouelihw
) et pasod
(aussi, bien sûr,od
c'est déjà pris) ... mais peut-être attendons-nous trop de cohérence de l'un des langages les plus contradictoires il y a.Le
esac
mot clé est en effet un délimiteur obligatoire pour terminer unecase
instructionbash
et la plupart des shells utilisés sous Unix / Linux, à l'exclusion de lacsh
famille.Le shell Bourne original a été créé par Steve Bourne qui avait auparavant travaillé sur ALGOL68 . Ce langage a inventé cette technique de mots inversés pour délimiter des blocs.
Ce dernier est plus ,
do/od
maisdo/done
dans Bourne et toutes les coquilles dérivées , y comprisbash
parce queod
déjà existant comme une commande Unix depuis sa création ( o CTAL d ump ).Notez que
do/done
les blocs fonctionnels sont introduits par lefor
, lewhile
ou lesuntil
instructions.for
,while
Etuntil
ne pas être résiliées commedone
est suffisante. C'est la raison pour laquelle il n'est pas nécessaire d'utiliser l'hypothèserof
et leselihw
jetons.la source
Le "
esac
" termine un "case
" antérieur pour former un " bloc de code ".Dans Algol68, ils sont utilisés, généralement la séquence de caractères inversée du mot-clé d'introduction est utilisée pour terminer l'enceinte, par exemple:
( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).
Je les appellerais "blocs gardés" après Edsger Dijkstra et son langage de commande gardé .
od
probablement pas été utilisé dans Bourne Shell à cause de la pré-existence de la commande Unix "od" .L'histoire:
L’idée "Guarded Block" semble provenir d’ ALGOL 68, par exemple en anglais:
La mise en œuvre de la LGU Algol68 du Soviet a fait de même: en anglais, la déclaration de cas respectueuse d’Algol68 est lue
case ~ in ~ out ~ esac
, celle en cyrilliqueвыб ~ в ~ либо ~ быв
.Puis, en 1975, Edsger Dijkstra a emprunté les blocs de code d'Algol68 pour son Guarded Command Language . par exemple
On peut supposer que Dijstra utilisé « blocs » Surveillé pour surmonter la Dangling autre ambiguïté mis en œuvre dans Algol60 puis réorganisées dans le C Langage de programmation . (cf. shift-réduire le conflit. )
Enfin - d’Algol68 - "
esac
" a été intégré dans le shell Bourne de 1977 (où vous l’avez découvertesac
) grâce à Stephen R. Bourne qui avait mis au point un ancien compilateur Algol68 appelé ALGOL 68C .Stephen a aussi utilisé ces mêmes blocs protégés dans un "fichier d'en-tête C" appelé macro.h
Les génies logiciels réputés Landon Curt Noll et Larry Bassel sont tombés par hasard sur le code macro.h de Steve en 1984 alors qu’ils travaillaient pour le groupe de portage Genix de National Semiconductor et avaient du mal à comprendre son application. Landon & Larry ont alors créé le concours international de code C obscurci ...
De 1984 à nos jours, plusieurs milliers d' autres "meilleurs" langages de programmation n'utilisant pas les commandes gardées de Dijkstra. Et leur utilisation par Steven Bourne
macro.h
est à présent souvent citée dans les "Dissertations sur le développement logiciel" des étudiants en informatique comme la preuve qu'ils n'étaient pas endormis dans des cours magistraux. :-)la source
case out
? jamais vu cette syntaxeod
même si ce n'était pas déjà pris? Ne serait-ce pasrof
ouelihw
?do ~ od
,if ~ fi
etcase ~ esac
signifie simplement que les générations futures sans fin de undergrads seront en mesure de réfléchir Algol68 et ajouter un simple « critique » de Algol68 dans leur projet de fin d'année, sans avoir à réellement écrire plus de une page (ligne?) Du Code Algol68.Oui, c'est nécessaire. Comme Jacob le souligne ci-dessus, la logique est la même que
if
/fi
. Les délimiteurs de commentaires traditionnels en C/*
et les*/
paires similaires. Parce que C a été écrit pour qu'Unix puisse être écrit principalement en C, avec le minimum de code assembleur, avec un grand chevauchement entre les équipes de développement C et Unix, il est raisonnable de supposer une source commune de la notion que l'équivalent final d'un multi le délimiteur de bloc de caractère doit être la même séquence de caractères dans l'ordre inverse.En revanche, les boucles aiment
for
,while
etuntil
utilisentdo
...done
au lieu d'inverser l'ordre des caractères, il y a donc une certaine incohérence.la source