いまさらレス。
ifはともかくwhileは{}で囲うかどうかで意味が違ってくる。
while [...] {...}
としちゃうと[..]はコマンドを実行した結果がwhileの引数に渡される。
whileの第一引数がループ本体を実行する以前に決定されてしまっている。

while {[...]} {...}
だと[...]という文字列がwhileの引数に渡される。
[...]がループ本体の結果を受けて変化することを期待しているなら後者でしか正常動作しない。