“ esac
”终止较早的“ case
”以形成“ 代码块 ”。
在Algol68中使用它们,通常使用Introduction关键字的反向字符序列来终止外壳,例如 ( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).
在Edsger Dijkstra和他的Guarded Command Language之后,我将它们称为“ Guarded Blocks” 。
od
大概是因为Unix的“ od”命令已经存在,所以在Bourne Shell中没有使用它。
历史:
“ Guarded Block”的想法似乎来自 ALGOL 68,例如英语:
proc days in month = (int year, month)int:
case month in
31,
if year mod 4=0 ∧ year mod 100≠0 ∨ year mod 400=0 then 29 else 28 fi,
31, 30, 31, 30, 31, 31, 30, 31, 30, 31
esac;
苏联的Algol68 LGU实施也是如此:英语中Algol68的崇高案例声明为case ~ in ~ out ~ esac
,西里尔字母为выб ~ в ~ либо ~ быв
。
然后在1975年Edsger Dijkstra借用了Algol68的代码块作为他的“ 守卫命令语言”。例如
if a ≥ b → max := a
| b ≥ a → max := b
fi
大概Dijstra使用“ Guarded Blocks”来克服Algol60中实现的Dangling 其他歧义,然后用C编程语言进行了重新设计。(请参阅shift-reduce冲突。)
最后-从Algol68 esac
到1977年的Bourne外壳(您在那里发现esac
)都是由Stephen R. Bourne提供的,他开发了早期的Algol68编译器ALGOL 68C。
著名的斯蒂芬还在一个名为macro.h的“ C头文件”中使用了这些相同的保护块。
#define IF if(
#define THEN ){
#define ELSE } else {
#define ELIF } else if (
#define FI ;}
著名的软件天才Landon Curt Noll和Larry Bassel于1984年在美国国家半导体公司Genix移植小组受雇时,偶然发现了Steve的macro.h代码,并努力理解其应用。因此,Landon&Larry随后创建了国际混淆C代码竞赛 ...
从1984年到今天,还有数千种不使用Dijkstra的“防护命令”的“更好”的编程语言。macro.h
现在,在IT本科生的“软件开发论文”中经常提到Steven Bourne在其中的使用,以证明他们没有上课睡觉。:-)
esac
精确指出其应在的位置—指向定义它并说明它是必需的行。