Scusa, ma lo hai provato?
Il codice che ti ho postato inizializza $opzione alla stringa nulla, poi controlla che la stringa non sia nè 1 nè 2 e siccome non è nessuna delle due stampa il menu e aspetta un carattere; una volta che lo ha ricevuto controlla, se è 1 fa qualcosa, se è 2 fa qualcos'altro e poi torna alla while a controllare: se ho pigiato 1 o 2 esce dal ciclo, e il programma finisce, se invece ho pigiato qualcos'altro allora ristampa il menu e aspetta un altro tasto e così via.
Al limite, se non pigio mai nè 1 nè 2, posso far stampare il menu quante volte voglio...
Non capisco da dove tu deduca che viene stampato 3 o due volte!