while blok příkazů 1; do blok příkazů 2 done
While bude provádět blok příkazů 2, dokud je návratová hodnota bloku příkazů 1 rovna 0. Pokud se v bloku příkazů 1 nachází více příkazů oddělených středníkem, zajímá jej jenom poslední návratová hodnota. Obvykle bude oním příkazem příkaz test:
i=0 while [ $i -le 42 ]; do echo $i i=$((i+1)) done
Příkaza read umí načítat text ze standardního vstupu a ukládat jej do proměnných. Jeho syntaxe je prostě read x y z ..., kde x y z jsou jména proměnných. read vždy načte celý řádek a do zadaných proměnných načte postupně obsah prvního pole, druhého pole, … až do poslední proměnné načte celý zbytek řádku (včetně oddělovačů).
Čím jsou oddělena pole? Jedním ze znaků uložených v proměnné $IFS. Její defaultní hodnota je \t\n (tedy mezera, tabulátor a nový řádek). Její hodnotu můžeme změnit, ale musíme to udělat opatrně – tak, abychom ovlivnili pouze příkaz read a žádný jiný. To nám umožní přiřazení do proměnné bezprostředně předcházející volání příkazu – IFS=: read x y z.
Čtení ze souboru není žádná magie, stačí nám přesměrovat soubor na standardní vstup příkazu read: read x y < soubor.txt. Pokud ale chceme vytvořit while cyklus, který přečte všechny řádky souboru, musíme si pomoci jinak:
while IFS=: read x _ y _; do printf "%s -- %s\n" "$x" "$y" done < /etc/passwd