$ reset() { i=$1; }
$ for i in 1 2 3 4 ; do echo -n "$i "; reset 3; echo "$i" ; done;
1 3
2 3
3 3
4 3
i não é feito em local em reset , portanto, a alteração é visível fora da função. Mas a mudança para i não afeta os valores que i recebe nas seguintes iterações. As palavras listadas no comando for são atribuídas a i , uma por vez, na ordem esperada.
Então, sim, há um "ponteiro oculto" que informa a posição na lista de palavras. Tem que haver, caso contrário, loops com palavras repetidas, como for i in a a a ; do ... não funcionaria. Há i obtém o mesmo valor em cada iteração, mas o loop ainda executa um número fixo de iterações.