É 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.