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