为什么要设计“until”块,因为它只是“while”的负版本?

为什么要设计“until”块,因为它只是“while”的负版本?

据我了解,untilblock 只是 的相反版本while

likeuntil "condition A is met"相当于while "condition A is not met".

在一些现代语言中,例如python,只有while.

那么作者为什么要bourne shell同时设计untilwhile呢?

有没有什么情况是while不能替代的until

答案1

该语法的来源 Bourne shell 没有命令否定 ( !) 运算符。因此,虽然这对于if您可以在哪里使用来说并不是什么大问题:

if cmd; then
  : no-op
else
  something if cmd returns false
fi

这更多是一个问题while,你需要在哪里做一些丑陋的事情,比如:

while cmd; [ "$?" -ne 0 ]; do
  ...
done

这看起来更好:

until cmd; do
  ...
done

使用ksh(以及也采用它的 POSIX sh(以及 bash/zsh...)),您可以执行以下操作:

if ! cmd; then
  something if cmd fails
fi
while ! cmd; do
  ...
done

尽管您在此过程中丢失了退出状态的确切值。

答案2

直到始终运行至少一次迭代。考虑满足条件A的情况:

While A is not met:
run X

不会运行 X。但是:

do
run X
until A is met

将运行 X 一次,然后评估是否满足 A 并继续下一步。

相关内容