Colchetes simples no shell é sinônimo de test (o comando separado ou o shell interno), portanto, [ 0 ] significa a mesma coisa que test 0 . test é para fazer comparações e testar os atributos dos arquivos, como você pode ler na manpage. Quando não é dada uma expressão que parece uma comparação, teste de arquivo ou uma das outras operações que ele pode fazer, ele irá testar se o argumento está presente e uma string não vazia. Nem 0 ou 1 são entradas realmente apropriadas para teste, e como o teste de cadeias não vazias simplesmente é bem-sucedido e o loop while executa loops para sempre.
Você pode tentar em vez disso
while false; do
echo "hello"
done
possivelmente substituindo false por true . Ou talvez o que você queira é usar (( )) :
while (( 0 )); do
echo "hello"
done
O que se comportará como a maioria dos idiomas, em que 0 significa falha / falsa e 1 significa sucesso / verdade.