【发布时间】:2011-05-13 09:45:47
【问题描述】:
从程序员的角度来看,shell 脚本只是另一种编程语言,人们必须学习并遵守该语言的规则。然而,我不得不承认,这种语法是我所见过的一种相当常用的语言中最奇怪的风格。 shell 是否从它所继承的旧语言中获取了这种语法?语法中是否有特殊含义/含义?
作为一个例子,这是我在 SO 上从another post 获取的一个小 sn-p
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
check_status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
看到这个,首先我可以看到case 以esac 结尾,这是它的反转形式(如if 以fi 结尾)。其次,我知道每个案例后面都有一个)。很公平,但是为什么我在每个语句的末尾都需要两个;?我还要说没有伴随( 的) 是丑陋的。
我正在寻找有关该语言历史方面的更多信息,但出于技术原因我也愿意。
【问题讨论】:
-
那么你能猜出为什么循环是'for ...;做 ...;完成'而不是'为了......;做 ...;哦?这样做是有充分理由的 - 但是在其他地方使用了类似 Algol 的反向关键字来标记结尾。
-
@Jonathan 我不是在争论“为什么会这样而不是那样?” (我想我一开始就说清楚了)。我的问题更像是“丑陋的语法从何而来?”
-
语法来自 Bourne(以 Bourne shell 闻名)。他曾在 Algol 上工作过,并且非常喜欢它以在 Algol 上对一些 shell 语法进行建模。 Algol 使用反向关键字来标记结构的结尾,因此“case ... esac”是合适的。循环不以 'od' 结尾的原因是 Unix 中已经有一个命令 'od' - 八进制转储。因此,改为使用“完成”。 (而且,众所周知,Bourne shell 源代码是用特殊的 C 语言编写的,带有宏,使它看起来像 Algol。这使得它难以维护。)
-
@Jonathan 好,请回答:)