是否有任何理由将命令until实现到bash/shell中(我还不确定哪个)?对于while声明的否定,你有什么不能做的吗?它比使用NOTCPU功能更快吗? - 不太可能......
iva*_*eev 21
Bash支持它,因为它符合POSIX - 特别是IEEE Std 1003.1,2004版 - Shell命令语言 - 直到循环.该功能早于GNU,GNU bashrepo 自 21年前的第一次提交以来就拥有它.
正如Guillaume在另一个答案中解释的那样,该功能的基本原理是(误导性的)可读性.他们试图在这里对事物进行微观管理,因为shell语言最初是针对最终用户而不是专业程序员(如BASIC和SQL).
然而,在相同代码复杂性下完全相同的冗余语法被证明比它的价值更麻烦:通过为库存构造提供两个而不是一个规范形式,它实际上损害了可读性而不是改进它并引入做出不必要的决定1.这就是为什么它只出现在那个时代设计的几种语言中,同样也是为了"接近自然语言" - 比如Perl和Visual Basic.
如今,这种方法已演变为语法糖概念2:只有通过替换足够频繁使用的整个样板构造来显着简化代码,才会引入冗余构造.C#就是一个很好的例子.
1 "在这里使用哪一个?当我改变条件时改变它?我为什么要关心?" 根据我的经验,它在Pascal过程与函数中是相同的:我记得在设计代码时必须多次在这两个子程序之间切换子程序.它只会给程序员带来多余的工作,从而浪费他们的时间.
2 我在这里缩小了这个术语,因为我是从语言设计师的角度来表达的.它更像是"现在被认为是好的语法糖".从语言设计者的POV开始,任何其他SS实际上都不存在.
您可以做的一切until都可以完成while.由于这种"优化",你的代码可能缩短了1个字符,而且有些解释器可能会稍快一些,但与代码中的其余部分相比,这些代码可能会非常微不足道.
据我所知,这种说法大多存在,因为有些语言可以使用它,所以从语言移植到bash更容易.但截至今天(2017年),我认为绝大多数语言都支持这种while说法,而且很少有人支持until.我建议专门使用,while以便其他阅读代码的程序员不会浪费时间问自己是什么until.
更不用说某些语言有一个until在循环结束时(而不是开头)执行的语句,这会带来很多不必要的混淆.
这种说法的原因并不是技术性的(事实上,倒置while具有相同的含义),而是语义.
until (condition) {do something}
可以更接近自然语言而不是
while (not condition) {do something}
当条件本身表示为负数时尤其如此,因为读取多个否定不会整齐地流动:
while (not not_connected) {}
VS
until (not_connected) {}.