bash/zsh脚本中“case”语句的奇怪语法的原因是什么?

前端之家收集整理的这篇文章主要介绍了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处理。)

猜你在找的Bash相关文章