É um separador de comandos. Embora no primeiro caso, talvez seja melhor pensar nisso como terminar a declaração while .
Por exemplo, se você quisesse fazer um loop enquanto algum comando retornasse sucesso, você faria algo como
while test -f /foo; do some_command; done'
O ponto-e-vírgula é usado para indicar o final dos argumentos para test . Caso contrário, pensaria que do é outro argumento para test .
No entanto, você pode usar novas linhas em vez do ponto-e-vírgula. O seguinte seria exatamente equivalente ao exemplo acima, apenas sem nenhum ponto-e-vírgula
while test -f /foo
do
some_command
done
Na verdade, com o bash, se você executar o comando acima e depois que ele terminar (ou você CTRL + C), se você voltar no histórico (teclas de seta para cima ou outros), você perceberá que ele substitui o comando multi-line com um usando ponto e vírgula.
Então, sim, a sintaxe de coisas como if e while quebra o comportamento normal do shell.
Eu pessoalmente sempre achei que a sintaxe é estranha, pois o do parece estranho. Mas você se acostuma com isso.