9.5 循环 (loop)
9.5.1 while do done
condition表示判断条件,statements表示要执行的语句(可以只有一条,也可以有多条),do和done都是 Shell 中的关键字。
u 先对 condition 进行判断,如果该条件成立,就进入循环,执行 while 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环。
u 每一次执行到 done 的时候都会重新判断 condition 是否成立,如果成立,就进入下一次循环,继续执行 do 和 done 之间的语句,如果不成立,就结束整个 while 循环,执行 done 后面的其它 Shell 代码。
u 如果一开始 condition 就不成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。
[root@localhost tmp]# vim 1.sh
9.5.2 until do done
condition表示判断条件,statements表示要执行的语句(可以只有一条,也可以有多条),do和done都是 Shell 中的关键字。
u 先对 condition 进行判断,如果该条件不成立,就进入循环,执行 until 循环体中的语句(do 和 done 之间的语句),这样就完成了一次循环。
u 每一次执行到 done 的时候都会重新判断 condition 是否成立,如果不成立,就进入下一次循环,继续执行循环体中的语句,如果成立,就结束整个 until 循环,执行 done 后面的其它 Shell 代码。
u 如果一开始 condition 就成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。
[root@localhost tmp]# vim 1.sh
9.5.3 for...do...done
variable 表示变量,value_list 表示取值列表,in 是 Shell 中的关键字。
in value_list 部分可以省略,省略后的效果相当于 in $@。
每次循环都会从 value_list 中取出一个值赋给变量 variable,然后进入循环体(do 和 done 之间的部分),执行循环体中的 statements。直到取完 value_list 中的所有值,循环就结束了。
[root@localhost tmp]# vim 1.sh
start 表示起始值,end 表示终止值;注意中间用两个点号相连,而不是三个点号。根据实测,这种形式只支持数字和字母。
[dmtsai@study bin]$ vim pingip.sh
network="192.168.1" # 先定义一个网域的前面部分!
for sitenu in $(seq 1 100) # seq 为 sequence(连续) 的缩写之意
# 底下的程序在取得 ping 的回传值是正确的还是失败的!
ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
# 开始显示结果是正确的启动 (UP) 还是错误的没有连通 (DOWN)
echo "Server ${network}.${sitenu} is UP."
echo "Server ${network}.${sitenu} is DOWN."
#seq 是一个 Linux 命令,用来产生某个范围内的整数,并且可以设置步长。
#seq 2 2 100表示从 2 开始,每次增加 2,到 100 结束。
for username in `cut -d ":" -f1 /etc/passwd | head -n 5`
9.5.4 for...do...done 的数值处理
u exp1、exp2、exp3 是三个表达式,其中 exp2 是判断条件,for 循环根据 exp2 的结果来决定是否继续下一次循环;
u statements 是循环体语句,可以有一条,也可以有多条;
2) 再执行 exp2,如果它的判断结果是成立的,则执行循环体中的语句,否则结束整个 for 循环。
4) 重复执行步骤 2) 和 3),直到 exp2 的判断结果不成立,就结束循环。
u exp1 仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。
u exp2 一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。
u exp3 很多情况下是一个带有自增或自减运算的表达式,以使循环条件逐渐变得“不成立”。
9.5.5 select in 循环
select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。select in 是 Shell 独有的一种循环,非常适合终端(Terminal)这样的交互场景。
variable 表示变量,value_list 表示取值列表,in 是 Shell 中的关键字。
[root@localhost tmp]# vim 1.sh
echo "What is your favourite OS?"
select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"
echo "You have selected $name"
注:#?用来提示用户输入菜单编号;^D表示按下 Ctrl+D 组合键,它的作用是结束 select in 循环。
注:select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环。
echo "What is your favourite OS?"
select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"
echo "Linux是一个类UNIX操作系统,它开源免费,运行在各种服务器设备和嵌入式设备。"
echo "Windows是微软开发的个人电脑操作系统,它是闭源收费的。"
echo "Mac OS是苹果公司基于UNIX开发的一款图形界面操作系统,只能运行与苹果提供的硬件之上。"
echo "UNIX是操作系统的开山鼻祖,现在已经逐渐退出历史舞台,只应用在特殊场合。"
echo "Android是由Google开发的手机操作系统,目前已经占据了70%的市场份额。"