He encontrado varios ejemplos de "esac" que aparecen al final de una declaración de caso bash, pero no he encontrado ninguna documentación clara sobre su uso. La página de manual lo usa e incluso tiene un índice en la palabra ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ), pero no define su uso. ¿Es la forma requerida de finalizar una declaración de caso, una mejor práctica o una técnica pura?
55
esac
puntos exactamente donde debería, a la línea que lo define e ilustra que es obligatorio.esac
o algo así, ¿cómo cree que podría decir dónde está el final de lacase
declaración?case
instrucción, de la misma manera queelse
,elif
yfi
se define como parte de la sintaxis de unaif
declaración. No tiene semántica propia, por lo que no hay nada que decir al respecto, pero está al final de la definición de unacase
declaración, por lo que es dondecase
termina una declaración. El hecho de que estécase
escrito al revés es una curiosidad conveniente, pero a la computadora no le importa, solo sabe que está buscando una palabra determinada.Respuestas:
Me gusta
fi
porif
ydone
parafor
,esac
es la forma requerida de finalizar unacase
declaración.esac
secase
deletrea hacia atrás, más bien comofi
seif
deletrea hacia atrás. No sé por qué el token que termina unfor
bloque no lo esrof
.fuente
od
para terminar undo
bloque? :)\od
cada vez que quiera usar esa utilidad! Lo cual es raro, pero mi punto esfi
y noneht
, así que por analogía seríarof
(oelihw
) y nood
(también, por supuesto,od
ya está tomado) ... pero tal vez esto espere demasiada coherencia de uno de los lenguajes más inconsistentes Ahi esta.De hecho, la
esac
palabra clave es un delimitador requerido para finalizar unacase
declaraciónbash
y la mayoría de los shells utilizados en Unix / Linux, excluyendo lacsh
familia.El shell Bourne original fue creado por Steve Bourne, quien trabajó anteriormente en ALGOL68 . Este lenguaje inventó esta técnica de palabra invertida para delimitar bloques.
Este último es no más
do/od
, perodo/done
en Bourne y todas las conchas derivados incluidosbash
porqueod
ya estaba vigente como un comando de Unix desde su creación ( o CTAL d UMP ).Tenga en cuenta que los
do/done
bloques funcionales se introducen mediante las instrucciones thefor
, thewhile
ountil
.for
,while
yuntil
no es necesario terminarlo, ya quedone
es suficiente. Esa es la razón por la cual no hay necesidad de los hipotéticosrof
y loselihw
tokens.fuente
El "
esac
" termina un "anterior"case
para formar un " bloque de código ".En Algol68 se usan, generalmente la secuencia de caracteres invertida de la palabra clave de introducción se usa para terminar el recinto, p. Ej.
( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).
Los llamaría "Bloques guardados" después de Edsger Dijkstra y su lenguaje de comando guardado .
od
presumiblemente no se utilizó en Bourne Shell debido a la preexistencia del comando "od" de Unix .La historia:
La idea del "bloque guardado" parece provenir de ALGOL 68, por ejemplo, inglés:
La implementación de la LGU Algol68 del soviet hizo lo mismo: en inglés se lee la declaración de caso reveladora de Algol68
case ~ in ~ out ~ esac
, en cirílico esto se leeвыб ~ в ~ либо ~ быв
.Luego, en 1975, los bloques de código de Algol68 fueron prestados por Edsger Dijkstra para su Lenguaje de comando guardado . p.ej
Presumiblemente Dijstra utiliza "bloques" de vigilado para superar la persona que cuelga ambigüedad implementado en Algol60 y luego re-ingeniería en el lenguaje de programación C . (cf. desplazamiento-reducir conflicto ) .
Finalmente, de Algol68, "
esac
" llegó al shell Bourne de 1977 (donde descubrióesac
) por cortesía de Stephen R. Bourne, quien había desarrollado un compilador de Algol68 temprano llamado ALGOL 68C .El famoso Stephen también usó estos mismos bloques guardados en un "archivo de encabezado C" llamado macro.h
Los genios notables del software Landon Curt Noll y Larry Bassel se toparon con el código macro.h de Steve en 1984 mientras trabajaban en el grupo de transferencia Genix de National Semiconductor y lucharon por comprender su aplicación. Y entonces Landon & Larry crearon el Concurso Internacional de Código C Ofuscado ...
Desde 1984 hasta hoy ha habido varios miles de otros "mejores" lenguajes de programación que no utilizan los comandos guardados de Dijkstra. Y el uso de Steven Bourne en ellos
macro.h
ahora se cita a menudo en las "Disertaciones de desarrollo de software" de estudiantes universitarios de TI como prueba de que no dormían en las conferencias. :-)fuente
case out
? nunca he visto esa sintaxisod
incluso si no lo hubieran tomado? ¿No seríarof
oelihw
?do ~ od
,if ~ fi
ycase ~ esac
simplemente significa que un sinfín de futuras generaciones de estudiantes podrán reflexionar sobre Algol68 y agregar una simple "crítica" de Algol68 en su proyecto de último año, sin tener que escribir más de una página (¿línea?) De código Algol68.Sí, es obligatorio Como Jacob señala arriba, la lógica es la misma que
if
/fi
. Delimitadores de comentarios C tradicionales/*
y*/
también se emparejan de manera similar. Debido a que C se escribió para que Unix se pudiera escribir principalmente en C, con el mínimo de código de ensamblaje, con una gran superposición entre los equipos de desarrollo de C y Unix, es razonable asumir una fuente común de la noción de que el equivalente de cierre de un multi El delimitador de bloque de caracteres debe ser la misma secuencia de caracteres en orden inverso.Por el contrario, los bucles tienen gusto de
for
,while
yuntil
usando
... endone
lugar de invertir el orden de los caracteres, por lo que hay alguna inconsistencia.fuente