为什么直到'存在?

时间:2017-04-10 08:15:53

标签: linux bash shell

有什么理由将命令until实现到bash / shell中(我还不确定哪个)?对于while声明的否定,你有什么可以做的吗?它比使用NOT CPU功能更快吗? - 不太可能......

3 个答案:

答案 0 :(得分:21)

Bash支持它,因为它符合POSIX - 特别是IEEE Std 1003.1, 2004 Edition - Shell Command Language - The until Loop。该功能早于GNU,而GNU bash repo在21年前拥有它since the 1st commit

As Guillaume also explains in another answer该功能背后的理由是(误导性的尝试)可读性。他们试图在这里对事物进行微观管理,因为 shell语言最初针对最终用户而不是专业的程序员(如BASIC和SQL)。

然而,这样的冗余语法在相同的代码复杂性下执行完全相同的事情被证明比它的价值更麻烦:提供两个,而不是一种规范形式的股票结构,它实际上损害了可读性而不是改善它并引入了不必要的决策来制造 1 。这就是为什么它只出现在那个时代设计的几种语言中,同样也是为了接近自然语言" - 像Perl和Visual Basic。

如今,这种方法已演变为syntax sugar概念 2 :只有通过替换整个样板构造才能显着简化代码,才会引入冗余构造。经常使用的。 C#就是一个很好的例子。

1 "在这里使用哪一个?当我改变条件时改变它?我为什么要关心?"根据我的经验,它在Pascal过程与函数中是相同的:我记得在设计代码时必须多次在这两个子程序之间切换子程序。它只会给程序员带来多余的工作,从而浪费他们的时间。

2 我在这里缩小了这个术语,因为我从语言设计师的角度来表达事物。它相当"现在被认为是好的语法糖"。由于来自语言设计师的POV,任何其他SS实际上都不存在。

答案 1 :(得分:7)

until可以使用while完成所有操作。由于这种“优化”,您的代码可能缩短1个字符,而某些解释器可能稍微快一点,但与代码中的其余部分相比,它可能是无关紧要的。

据我所知,这个陈述主要存在,因为有些语言有它,所以从语言移植到bash更容易。但是截至今天(2017年),我认为绝大多数语言都支持while语句,很少支持until。我建议专门使用while,以便其他阅读代码的程序员不会浪费时间问自己until的作用。

更不用说某些语言有一个until语句,它在循环结束时(而不是开头)执行,这会带来很多不必要的混淆。

答案 2 :(得分:7)

这种陈述的原因并不是技术性的(事实上,倒置的while具有相同的含义),但语义上的。

until (condition) {do something}

可以比自然语言更接近

while (not condition) {do something}

当条件本身表示为负数时尤其如此,因为读取多个否定不会整齐地流动:

while (not not_connected) {} VS until (not_connected) {}