Por que o bloco 'until' foi projetado porque é apenas uma versão negativa de 'while'?

3

No meu entender, until block é apenas a versão oposta de while ,

como until "condition A is met" é equivalente a while "condition A is not met" .

Em algumas linguagens modernas, como python , há apenas while .

Então, por que o autor de bourne shell criou until e while ?

Existe alguma situação em que while não pode substituir until ?

    
por Zen 22.02.2015 / 04:30

2 respostas

2

O shell Bourne, de onde essa sintaxe vem, não tem um operador de negação de comando ( ! ). Então, enquanto isso não era tanto um problema para if onde você poderia usar:

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

Isso é mais um problema com while , onde você precisa fazer coisas feias como:

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

Isso parece melhor:

until cmd; do
  ...
done

Com ksh (e POSIX sh que também adotou (e bash / zsh ...)), você pode fazer:

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

Embora você perca o valor exato do status de saída no processo.

    
por 22.02.2015 / 12:48
0

Até sempre executa pelo menos uma iteração. Considere o caso em que a condição A é atendida:

While A is not met:
run X

não executará o X. Mas:

do
run X
until A is met

executará X uma vez, avaliará que A foi atendido e continuará adiante.

    
por 22.02.2015 / 04:38