gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:41:05 32 4
gpt4 key购买 nike

从程序员的角度来看,shell脚本只是另一种编程语言,必须学习并遵守语言规则。但是,我不得不承认,这种语法是我在一种相当常用的语言中见过的最奇怪的风格。 shell 是否从它起源的旧语言中采用了这种语法?语法中是否有特殊的含义/含义?

例如,这是我从 another post 中摘录的一个小片段就这样

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
check_status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac

看这里,首先我可以看到 caseesac 结尾,这是它的反转形式(如 if 结尾>fi).其次,我知道每个案例后面都有一个 )。很公平,但到底为什么我需要在每个语句末尾使用两个 ; ?我还要说 ) 没有伴随的 ( 是丑陋的。

我正在寻找有关该语言的历史方面的更多信息,但出于技术原因我也持开放态度。

最佳答案

每个请求:

  • 那么你能猜出为什么循环是'for ...;做 ...; done' 而不是 'for ...;做 ...; od'?这是有充分理由的——但在其他地方使用了类似 Algol 的 reversed 关键字来标记结束。

回答:

  • 语法来自 Bourne(以 Bourne shell 闻名)。他曾从事 Algol 方面的工作,并且非常喜欢它以在 Algol 上模拟一些 shell 语法。 Algol 使用反向关键字来标记构造的结尾,因此“case ... esac”是合适的。循环不以 'od' 结尾的原因是 Unix 中已经有一个命令 'od' - octal dump。因此,改为使用“完成”。

众所周知,Bourne shell 源代码是在 idiosyncratic C with macros to make it look like Algol 中编写的.这使得维护变得困难。

关于主要问题 - 关于为什么 case 语句中的备选方案周围没有左方括号(圆括号) - 我有几个相关的理论。

首先,在编写 Bourne shell 时(1970 年代后期),很多编辑都是用 'ed' 完成的,standard text editor .它没有跳到平衡括号或其他类似符号的概念,因此不需要前导括号。此外,如果您正在撰写文档,您可能会用以下方式整理您的论点:

a) ...blah...
b) ...more...
c) ...again...

左括号通常被省略 - case 语句很适合该模型。

当然,从那时起,我们已经习惯了在您键入右括号时标记匹配的左括号的编辑器,因此旧的 Bourne shell 表示法令人讨厌。 POSIX 标准使前导括号成为可选的;大多数更现代的类 POSIX shell(Korn、Bash、Zsh)的实现都将支持它,并且我通常在不必担心像 Solaris 10 这样的机器的可移植性时使用它,其中/bin/sh 仍然是忠实的 Bourne不允许前导括号的 shell。 (我通常使用 #!/bin/ksh 作为 shebang 来处理这个问题。)

关于bash - bash/zsh 脚本中 "case"语句的奇怪语法的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4238341/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com