Bash – Esempi di loop infiniti
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 |
Commenti