据我了解,until
block 只是 的相反版本while
,
likeuntil "condition A is met"
相当于while "condition A is not met"
.
在一些现代语言中,例如python
,只有while
.
那么作者为什么要bourne shell
同时设计until
和while
呢?
有没有什么情况是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 并继续下一步。