Un loop infinito non è altro che una serie infinita di istruzioni, eseguite in modo ciclico, senza una fine, per via di una condizione sempre vera che non permette l’uscita dal ciclo.

Un esempio di loop infinito usando la sintassi While su bash è questo:

#!/bin/bash
while :
do
	echo "Press [CTRL+C] to stop.."
	sleep 1
done

Questo è un loop che stampa in maniera infinita e con un ritardo di 1 secondo fra una stampa e l’altra, la scritta “Press [Ctrl+C] to stop..”

Notare che : è il comando null. Il comando null non fa niente e il suo stato d’uscita è sempre true.
Si può modificare l’esempio sopra per renderlo più leggibile:

#!/bin/bash
while true
do
	echo "Press [CTRL+C] to stop.."
	sleep 1
done

Oppure scrivendolo su un’unica riga:

 while :; do echo 'Hit CTRL+C'; sleep 1; done

oppure

 while true; do echo 'Hit CTRL+C'; sleep 1; done

Ciclo infinito in Bash

Lo stesso si può ottenere usando la sintassi con un loop di tipo for.

for (( ; ; ))
do
   echo "Pres CTRL+C to stop..."
   sleep 1
   if (disaster-condition)
   then
	break       	   #uscire dal loop
   fi
done

Si può anche usare il case statement per uscire:

while :
do 
     ### qualche input e output qui ###
     case $var in
       yes) do something ;;
       no) do something ;;
       quit) break ;;        ##uscita dal loop
     ease
done

Esempio completo

Un esempio completo che mostra l’utilizzo effettivo di un ciclo infinito con un’istruzione d’uscita.

#!/bin/bash
# Scopo: Mostrare diverse opzioni con un menu
# ---------------------------------------------------------------------------
# cattura CTRL+C, CTRL+Z ed esce
trap '' SIGINT
trap ''  SIGQUIT
trap '' SIGTSTP
 
# display message and pause 
pause(){
	local m="$@"
	echo "$m"
	read -p "Press [Enter] key to continue..." key
}
 
# set an 
while :
do
	# show menu
	clear
	echo "---------------------------------"
	echo "	     M A I N - M E N U"
	echo "---------------------------------"
	echo "1. Show current date/time"
	echo "2. Show what users are doing"
	echo "3. Show top memory & cpu eating process"
	echo "4. Show network stats"
	echo "5. Exit"
	echo "---------------------------------"
	read -r -p "Enter your choice [1-5] : " c
	# take action
	case $c in
		1) pause "$(date)";;
		2) w| less;;
		3) echo '*** Top 10 Memory eating process:'; ps -auxf | sort -nr -k 4 | head -10; 
		   echo; echo '*** Top 10 CPU eating process:';ps -auxf | sort -nr -k 3 | head -10; 
		   echo;  pause;;
		4) netstat -s | less;;
		5) break;;
		*) Pause "Select between 1 to 5 only"
	esac
done