Mir ist nicht ganz klar, was es hier für eine Rolle spielen soll, ob die Bedingung am Anfang oder am Ende des Loops ausgeführt wird (wie soll eine fussgesteuerte "for i in x" Schleife überhaupt funktionieren, was ist i in ersten Durchlauf?). Das hier ist viel mehr eine Frage der Ausführungsregeln. Und bei einem For-Loop in der Shell wird das iterierte Set vor dem ersten Durchlauf vollständig evaluiert.
Um die Frage zu beantworten ob das nur in bash so funktioniert, oder generell: Der POSIX-Standard definiert die For-Schleife wiefolgt:
Zitat von http://pubs.opengroup.org/onlinepubs/007904875/utilities/xcu_chap02.html#tag_02_09_04_03
First, the list of words following in shall be expanded to generate a list of items.
Then, the variable name shall be set to each item, in turn, and the compound-list executed each time.
Was genau Word-Expression sein können (also der Teil nach dem in, in dem Falle hier die Pathname-Extension *.c), steht hier:
http://pubs.opengroup.org/onlinepubs/007….html#tag_02_06 bzw den Link folgend hier: http://pubs.opengroup.org/onlinepubs/007….html#tag_02_13
For-Loop Items können nicht (wie z.B. bei Python, for line in open('words.txt')) lazy generiert werden. Selbst bei sowas wie IFS=$'\n'; for line in $(cat words.txt); do echo $line ; done wartet die Shell bis der Befehl fertig ist und die Datei eingelesen, bevor die Ausgabe beginnt. Das ist anders als z.B. das while-Statement in Shell, wo cat words.txt | while read w ; do echo $w ; done direkt nach der ersten Zeile anfängt zu iterieren - beide Schleifen hier sind kopfgesteuert.
Zum selber testen, einfach das cat zu einem tail -f umwandeln.
TLDR: Ja, Shell garantiert dir, dass bei einem for Loop die Word List nur einmal initial evaluiert wird, und danach über jedes Item separat iteriert.