Eu encontrei vários exemplos de "esac" aparecendo no final de uma declaração de caso bash, mas não encontrei nenhuma documentação clara sobre seu uso. A página de manual o usa e até possui um índice na palavra ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ), mas não define seu uso. É a maneira necessária para encerrar uma declaração de caso, prática recomendada ou técnica pura?
55
esac
pontos exatamente onde deveria - para a linha que o define e ilustra que é necessário.esac
ou algo parecido, como você acha que seria capaz de dizer onde está o final dacase
declaração?case
declaração, da mesma forma queelse
,elif
efi
são definidos como sendo parte da sintaxe de umaif
declaração. Ele não possui nenhuma semântica própria, portanto não há nada a dizer sobre isso, mas está no final da definição de umacase
declaração, então é onde acase
declaração termina. O fato de ter sidocase
escrito para trás é uma curiosidade conveniente, mas o computador não se importa, apenas sabe que está procurando uma determinada palavra.Respostas:
Como
fi
paraif
edone
parafor
,esac
é a maneira necessária de terminar umacase
declaração.esac
écase
soletrado para trás, assim comofi
éif
soletrado para trás. Não sei por que o token que termina umfor
bloco não érof
.fonte
od
termina umdo
bloco? :)\od
toda vez que quiser usar esse utilitário! O que é raro, mas o meu argumento permanece;)fi
e nãoneht
, então, por analogia, seriarof
(ouelihw
) e nãood
(também,od
é claro, já está sendo usado) ... mas talvez isso esteja esperando muita autoconsistência de uma das linguagens mais inconsistentes Há sim.A
esac
palavra-chave é realmente um delimitador necessário para finalizar umacase
declaraçãobash
e a maioria dos shells usados no Unix / Linux, exceto acsh
família.O shell Bourne original foi criado por Steve Bourne, que trabalhou anteriormente no ALGOL68 . Essa linguagem inventou essa técnica de palavras invertidas para delimitar blocos.
Este último não é mais
do/od
, masdo/done
em Bourne e todas as conchas derivados, incluindobash
, porqueod
já existia como um comando Unix desde a sua criação ( o ctal d UMP ).Observe que os
do/done
blocos funcionais são introduzidos pelas instruçõesfor
, thewhile
ou theuntil
.for
,while
euntil
não precisa ser finalizado comodone
é suficiente. Essa é a razão pela qual não há necessidade de hipotéticosrof
eelihw
tokens.fonte
O "
esac
" termina um "case
" anterior para formar um " bloco de código ".No Algol68, eles são usados, geralmente a sequência de caracteres invertida da palavra-chave de introdução é usada para terminar o gabinete, por exemplo,
( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).
Eu os chamaria de "Blocos Guardados", em homenagem a Edsger Dijkstra e sua Linguagem de Comando Guardada .
od
presumivelmente não foi usado no Bourne Shell por causa da pré-existência do comando "od" do Unix .A história:
A idéia do "Bloco Guardado" parece ter vindo do ALGOL 68, por exemplo, inglês:
A implementação da LGU Algol68 da União Soviética fez o mesmo: em inglês, a declaração de caso reverente de Algol68 diz
case ~ in ~ out ~ esac
, em cirílico, isto dizвыб ~ в ~ либо ~ быв
.Então, em 1975, os blocos de código de Algol68 foram emprestados por Edsger Dijkstra para sua Linguagem de Comando Guardada . por exemplo
Presumivelmente Dijstra usado "vigiado Blocks" para superar a outra oscilação ambigüidade implementado em Algol60 e então re-engenharia na Linguagem de Programação C . (cf. turno-reduzir conflito ) .
Finalmente - do Algol68 - "
esac
" chegou ao shell Bourne de 1977 (onde você descobriuesac
), cortesia de Stephen R. Bourne, que havia desenvolvido um compilador Algol68 antigo chamado ALGOL 68C .Famosamente, Stephen também usou esses mesmos Blocos Guardados em um "arquivo de cabeçalho C" chamado macro.h
Os notáveis gênios do software Landon Curt Noll e Larry Bassel encontraram o código macro.h de Steve em 1984 enquanto trabalhavam no grupo de portões Genix da National Semiconductor e lutavam para entender sua aplicação. Então Landon & Larry criou o Concurso Internacional de Código Ofuscado C ...
De 1984 até hoje, existem milhares de outras linguagens de programação "melhores" que não usam os Comandos Guardados de Dijkstra. E o uso deles por Steven Bourne
macro.h
agora é frequentemente citado nas "Dissertações de Desenvolvimento de Software" dos estudantes de TI como prova de que não dormiam em palestras. :-)fonte
case out
? nunca visto que a sintaxeod
mesmo que ainda não tivesse sido tirado? Não seriarof
ouelihw
?do ~ od
,if ~ fi
ecase ~ esac
significa simplesmente que infinitas gerações futuras de estudantes de graduação será capaz de refletir Algol68 e adicionar um simples "crítica" de Algol68 em seu projeto final do ano, sem ter que escrever mais, em seguida, uma página (linha?) De código Algol68.Sim, é necessário. Como Jacob aponta acima, a lógica é a mesma que
if
/fi
. Delimitadores tradicionais de comentários em C/*
e*/
também emparelham da mesma forma. Como o C foi escrito para que o Unix pudesse ser escrito principalmente em C, com o mínimo de código de montagem, com uma grande sobreposição entre as equipes de desenvolvimento do C e do Unix, é razoável assumir uma fonte comum da noção de que o equivalente final de um multi O delimitador de bloco de caracteres deve ter a mesma sequência de caracteres na ordem inversa.Em contraste, laços como
for
,while
euntil
usodo
...done
em vez de inverter ordem de caracteres, para que haja alguma inconsistência.fonte