Un ulteriore costrutti ricorsivo è while <programma che valuta la condizione>; do <elenco di cose da fare>; done
In questo caso la lista di operazioni da eseguire verrà ripetuta fintanto che l'esecuzione del programma ritornerà il codice 0
Un ulteriore costrutto di selezione è case <parola da controllare> in (<elenco di casi, con caratteri jolly, separati da |>) <elenco di azioni da fare> ;; <eventuali altri casi> esac
la <parola da controllare> può essere una variabile (indicata dal $), una stringa contenente variabili (eventualmente racchiusa tra ") oppure il ciò che un comando ha stampato su standard output (racchiuso tra `)
E' da notare che ogni lista di comandi dei casi va terminata con due ;
La parola da confrontare viene confrontata con le varie espressioni in ordine, dalla prima all'ultima. Appena una coincide, viene eseguita la lista delle operazioni e non vengono eseguiti altri controlli. Se noi inseriamo una espressione più generica prima di una più specifica, verrà sempre solo eseguita la lista di operazioni della più generica.
Se si vuole creare un lista che venga eseguita in caso la parola di selezione non coincida con nessun caso precedente si può utilizzare come elenco delle condizioni da verificare ( * ) che intercetta qualunque parola non intercettata da altri prima