Bash无限循环示例

时间:2020-01-09 10:37:23  来源:igfitidea点击:

如何在Linux或UNIX等操作系统下的Bash脚本中编写无限循环?
无限循环不过是一系列指令,这些指令可以无休止地循环,这可能是由于循环没有终止条件,有一个永远无法满足的条件,或者是导致循环重新开始的一条指令。
使用while循环的语法如下:

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

这是一个将永远打印的循环。
按[CTRL + C]停止...

请注意是空命令。

null命令不执行任何操作,并且其退出状态始终设置为true。
您可以修改上述内容以提高可读性:

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

单行bash无限while循环语法如下:

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

或者

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

for无限循环示例

#!/bin/bash
 
for (( ; ; ))
do
   echo "Pres CTRL+C to stop..."
   sleep 1
done

我如何退出循环?

当满足某些条件时,可以使用break语句对for或while循环进行转义:

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

或者

### while loop example ###
while :
do
   echo "Pres CTRL+C to stop..."
   sleep 1
   if (disaster-condition)
   then
	break       	   #Abandon the loop.
   fi
done

您还可以使用case语句来使用break语句:

while :
do 
     ### add some input and output here ###
     case $var in
       yes) do something ;;
       no) do something ;;
       quit) break ;;        ##Abandon the loop.
     ease
done

例子

一个示例shell脚本演示了无限循环和break语句的实际用法:

#!/bin/bash
# Purpose: Display various options to operator using menus
# Author: Hyman Gite < Hyman @ theitroad . com > under GPL v2.0+
# --------------------------------------------------------------------------
# capture CTRL+C, CTRL+Z and quit singles using the trap
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