bash/zsh脚本中“case”语句的奇怪语法的原因是什么?
从程序员的角度来看,shell脚本只是另一种编程语言,其中必须学习并遵守语言的规则。然而,我不得不承认,这种语法是我在一个相当普遍使用的语言中看到的最古怪的风格。 shell是否从它下降的旧语言采用这种语法?在语法中有特殊的含义/含义吗?
作为一个例子,这里是一个小片段,我从another post从SO case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) check_status ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac 看看这个,首先我可以看到,情况以esac结束,这是它的反转形式(如果结尾在fi)。其次,我理解每种情况都遵循a)。公平的,但为什么我需要两个;在每个语句结束时?我也会说,)没有伴随(是丑陋的。 我正在寻找关于语言的历史方面的更多信息,但我也开放技术原因。
每个请求:
>所以你可以猜测为什么一个循环是’for …;做…完成“而不是”…“做… od’?有一个正确的理由 – 但Algol像颠倒关键字标记的结束在别处使用。 回答: >语法来自Bourne(Bourne shell fame)。他曾经在Algol工作,并喜欢它足以模仿一些shell语法在Algol。 Algol使用反向关键字来标记结构的末尾,因此“case … esac”是合适的。循环不以’od’结尾的原因是在Unix – 八进制转储中已经有一个命令’od’。所以,使用’done’而不是。 根据声誉,Bourne shell源代码是用特殊的C语言编写的,使宏看起来像Algol。这使得难以维护。 关于主要问题 – 为什么在案例陈述中没有开头的括号(括号) – 我有一些相关的理论。 首先,回到Bourne shell编写时(1970年代后期),很多编辑用’ed’,standard text editor完成。它没有跳到平衡括号或其他这样的符号的概念,所以没有要求括号。另外,如果你正在编写一个文档,你可能很好地组织你的参数: a) ...blah... b) ...more... c) ...again... 开始括号通常被省略 – 并且case语句将很适合该模型。 当然,从那时起,我们已经习惯了当你键入一个右括号时标记匹配的开括号的编辑器,所以旧的Bourne shell符号是一个麻烦。 POSIX标准使前导括号可选;最现代的POSIX类shell(Korn,Bash,Zsh)的实现将支持它,我通常使用它,当我不必担心可移植性到机器如Solaris 10 where / bin / sh仍然是一个忠实的Bourne shell不允许前导括号。 (我通常使用#!/ bin / ksh作为shebang处理。) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- scala – Spark case类 – 十进制类型编码器错误“无法从十
- bootstrap学习笔记-CSS-基础
- 一些免费的webservice
- AngularJS – Angular UI-Router只重新加载嵌套视图,而不是
- angularjs – 如何使ng-init触发ng-change?
- scala – Specs2:如何将Seq [Matcher [A]]转换为单个匹配器
- 小蚂蚁学习Bootstrap(3)——标签页Tags制作和弹出框制作
- scala – 在Akka集群中同步数据的简单方法?
- scala – 不可变的,可打字的树的设计
- 如何从unix shell脚本获取java程序完成状态?