目录
流程控制之循环
for循环是最简单,也是最常用的循环语句。与其他的程序设计语言一样,for循环都是初学者在学习循 环结构时的入门课程。for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语 句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。
一, 带列表的for循环语句
带列表的for循环通常用于将一组语句执行已知的次数,其基本语法如下:
for variable in list
do
statement1
statement2
...
Done
示例1:
模拟音乐循环播放
1,使用命令 vim music_player.sh 打开脚本文件
[root@wangjingjing ~]# vim music_player.sh
2,按照要求编写脚本文件
(1)方法一
for song in song1 song2 song3 song4
do
echo "current play $song"
sleep 2
done
(2)方法二
for song in song{1..4}
do
echo "current play $song"
sleep 2
done
(3)方法三
for song in song{1,3,5,7}
do
echo "current play $song"
sleep 1
done
3,使用命令 bash music_player.sh 执行脚本文件,结果如下:
(1)方法一,二
[root@wangjingjing ~]# bash music_player.sh
current play song1
current play song2
current play song3
current play song4
(2)方法三
[root@wangjingjing ~]# bash music_player.sh
current play song1
current play song3
current play song5
current play song7
示例2:
测试主机192.168.206.131,132,133是否在线
方法一:
1,使用命令 vim ping_script.sh 打开脚本文件
[root@wangjingjing 0130]# vim ping_script.sh
2,按照要求编写脚本文件
#连续的变量用空格隔开
for ip in 192.168.206.131 192.168.106.132 192.168.206.133
do
#-c 2:发送2个数据包,并且不打印出来,写到/dev/null里面
ping -c 2 $ip &>/dev/null
#如果状态码等于0,表示Ping通主机,显示host is online
if [ "$?" -eq 0 ]
then
echo "host $ip is online"
#否则,输出host is offline
else
echo "host $ip is offline"
fi
done
3,使用命令 bash ping_script.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash ping_script.sh
host 192.168.206.131 is online
host 192.168.106.132 is offline
host 192.168.206.133 is online
方法二:
1,使用命令 vim ping_script.sh 打开脚本文件
[root@wangjingjing 0130]# vim ping_script.sh
2,按照要求编写脚本文件
for ip in 192.168.206.{131..133}
do
#-c 2:发送2个数据包,并且不打印出来,写到/dev/null里面
ping -c 2 $ip &>/dev/null
#如果状态码等于0,表示Ping通主机,显示host is online
if [ "$?" -eq 0 ]
then
echo "host $ip is online"
#否则,输出host is offline
else
echo "host $ip is offline"
fi
done
3,使用命令 bash ping_script.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash ping_script.sh
host 192.168.206.131 is online
host 192.168.106.132 is offline
host 192.168.206.133 is online
方法三:
1,使用命令 vim ping_script.sh 打开脚本文件
[root@wangjingjing 0130]# vim ping_script.sh
2,按照要求编写脚本文件
#-f表示指定后面的格式,“%3g”中的3位宽度,%d打印浮点数,去掉多余0
for ip in `seq -f "192.168.206.%3g" 131 133`
do
#-c 2:发送2个数据包,并且不打印出来,写到/dev/null里面
ping -c 2 $ip &>/dev/null
#如果状态码等于0,表示Ping通主机,显示host is online
if [ "$?" -eq 0 ]
then
echo "host $ip is online"
#否则,输出host is offline
else
echo "host $ip is offline"
fi
done
3,使用命令 bash ping_script.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash ping_script.sh
host 192.168.206.131 is online
host 192.168.206.132 is offline
host 192.168.206.133 is online
示例3:
打印:1-10之间的奇数-》 1,3,5,7,9
1,使用命令 vim num_script.sh 打开脚本文件
[root@wangjingjing ~]# vim num_script.sh
2,按照要求编写脚本文件
for i in {1..10..2}
do
echo $i
done
3,使用命令 bash num_script.sh 执行脚本文件,结果如下:
[root@wangjingjing ~]# bash num_script.sh
1
3
5
7
9
示例4:
计算100以内的奇数和:
1,使用命令 vim num_script2.sh 打开脚本文件
[root@wangjingjing 0130]# vim num_script2.sh
2,按照要求编写脚本文件
sum=0
for i in {1..100..2}
do
#第一种方式
# let sum+=i
#第二种方式
((sum+=i))
done
echo $sum
3,使用命令 bash num_script2.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash num_script2.sh
2500
二,不带列表的for循环语句
在某些特殊情况下,for循环的条件列表可以完全省略,称为不带列表的for循环语句。如果没有为for循 环提供条件列表,Shell将从命令行获取条件列表。不带列表的for循环语句的一般语法如下:
for variable
do
statement1
statement2
...
done
三, 类C风格的for循环语句
语法:
for((intialize;condition;operation))
do
statement1
....
statementN
Done
在上面的语法中,for循环语句的执行条件被2个圆括号包括起来。执行条件分为3个部分,由2个分号隔 开,第1部分expression1通常是条件变量初始化的语句;第2部分expression2是决定是否执行for循环 的条件。当expression2的值为0时,执行整个循环体;当expression2的值为非0时,退出for循环体。 第3部分,即表达式expression3通常用来改变条件变量的值,例如递增或者递减等。
示例1:
打印1-10
1,使用命令 vim cycle_ctl2.sh 打开脚本文件
[root@wangjingjing 0130]# vim cycle_ctl2.sh
2,按照要求编写脚本文件
for ((i=1;i<11;i++))
do
echo "$i"
done
3,使用命令 bash cycle_ctl2.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash cycle_ctl2.sh
1
2
3
4
5
6
7
8
9
10
示例2:
打印1-10里面的奇数
1,使用命令 vim cycle_ctl2.sh 打开脚本文件
[root@wangjingjing 0130]# vim cycle_ctl2.sh
2,按照要求编写脚本文件
for ((i=1;i<11;i++))
do
if (($i%2 != 0))
then
echo "$i"
fi
done
3,使用命令 bash cycle_ctl2.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash cycle_ctl2.sh
1
3
5
7
9
四,For 循环的嵌套
示例:
打印10以内的奇数,以及10-20以内的奇数,20-30内的奇数
1,使用命令 vim nesting_for.sh 打开脚本文件
[root@wangjingjing 0130]# vim nesting_for.sh
2,按照要求编写脚本文件
#打印10以内的奇数,10-20以内的奇数,20-30以内的奇数
for i in 10 20 30
do
for ((j=$i-9;j<$i;j++))
do
if (($j%2 != 0))
then
echo "$j"
fi
done
echo "****************$i分割线***********"
done
3,使用命令 bash nesting_for.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash nesting_for.sh
1
3
5
7
9
****************10分割线***********
11
13
15
17
19
****************20分割线***********
21
23
25
27
29
****************30分割线***********
五, while循环语句
while循环是另外一种常见的循环结构。使用while循环结构,可以使得用户重复执行一系列的操作,直 到某个条件的发生。这听起来好像跟until循环非常相似,但是与until语句相比,while语句有着较大的区别。
语法:
while expression
do
statement1
done
示例1:
打印1-10
1,使用命令 vim cycle_while.sh 打开脚本文件
[root@wangjingjing 0130]# vim cycle_while.sh
2,按照要求编写脚本文件
i=1
while (($i<11))
do
echo "$i"
let i+=1
done
3,使用命令 bash cycle_while.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash cycle_while.sh
1
2
3
4
5
6
7
8
9
10
示例2:
打印1-10内的奇数
1,使用命令 vim cycle_while.sh 打开脚本文件
[root@wangjingjing 0130]# vim cycle_while.sh
2,按照要求编写脚本文件
i=1
while (($i<11))
do
if (($i%2 != 0))
then
echo "$i"
fi
let i+=1
done
3,使用命令 bash cycle_while.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash cycle_while.sh
1
3
5
7
9
示例3:
打印10以内的奇数,以及10-20以内的奇数,20-30内的奇数?
1,使用命令 vim cycle_while.sh 打开脚本文件
[root@wangjingjing 0130]# vim cycle_while.sh
2,按照要求编写脚本文件
i=10
while (($i<31))
do
let j=$i-9
while ((j<=i))
do
if (($j%2 != 0))
then
echo "$j"
fi
let j++
done
echo "---------------$i的分界线---------------"
let i+=10
done
3,使用命令 bash cycle_while.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash cycle_while.sh
1
3
5
7
9
---------------10的分界线---------------
11
13
15
17
19
---------------20的分界线---------------
21
23
25
27
29
---------------30的分界线---------------
六,while循环读取文件
Read 每次读取一行
1,使用命令 vim while.txt 打开需要读取文件
[root@wangjingjing 0130]# vim while.txt
2,编写需要读取的文件内容
welcome to my world
you can do everything you want to do !
3,使用命令 vim while_read_file.sh 打开脚本文件
[root@wangjingjing 0130]# vim while_read_file.sh
4,按照要求编写脚本文件
(1)方法一
#使用命令read 读取文件内容
while read line
do
echo "$line"
#把while.txt重定向给while循环;此处都在一个目录下,没有用绝对路径
done < while.txt
(2)方法二:
#把文件重定向给exec
exec < while.txt
#使用命令read 读取文件内容
while read line
do
echo "$line"
done
5,使用命令 bash while_read_file.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash while_read_file.sh
welcome to my world
you can do everything you want to
七,until循环语句
until循环语句同样也存在于多种程序设计语言中。顾名思义,until语句的作用是将循环体重复执行,直到某个条件成立为止。until语句的基本语法如下:
until expression
do
statement1
statement2
...
done
示例:
打印1-10
1,使用命令 vim cycle_until.sh 打开脚本文件
[root@wangjingjing 0130]# vim cycle_until.sh
2,按照要求编写脚本文件
i=1
until ((i>11))
do
echo "$i"
let i+=1
done
3,使用命令 bash cycle_until.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash cycle_until.sh
1
2
3
4
5
6
7
8
9
10
八, select循环语句
select循环语句的主要功能是创建菜单,在执行带有select循环语句脚本时,输出会按照数字顺序的列表 显示一个菜单,并显示提示符(默认是#?),同时等待用户输入数字选择。select语句的基本语法如 下:
select 变量名 [ in 菜单值列表 ]
do
statement1
statement2
...
done
示例:
模拟选择玩家
1,使用命令 vim cycle_select.sh 打开脚本文件
[root@wangjingjing 0130]# vim cycle_select.sh
2,按照要求编写脚本文件
select op in players1 players2
do
echo "$op"
done
~
3,使用命令 bash cycle_select.sh 执行脚本文件,结果如下:
输入1,显示players1;输入2,显示players2;ctrl + c 退出;
[root@wangjingjing 0130]# bash cycle_select.sh
1) players1
2) players2
#? 1
players1
#? 2
players2
#? ^C
九,利用break和continue语句控制循环
在Shell中的循环结构中,还有2个语句非常有用,即break和continue语句。前者用于立即从循环中退出;而后者则用来跳过循环体中的某些语句,继续执行下一次循环。
break语句的作用是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中。
continue语句则比较有趣,它的作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行。
示例:
同一段代码分别用break和continue控制循环的不同效果
break:
1,使用命令 vim cycle_break.sh 打开脚本文件
[root@wangjingjing 0130]# vim cycle_break.sh
2,按照要求编写脚本文件
for i in {1..10}
do
if [ $i -eq 5 ]
then
break
fi
echo "$i"
done
3,使用命令 bash cycle_break.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash cycle_break.sh
1
2
3
4
Continue:
1,使用命令 vim cycle_continue.sh 打开脚本文件
[root@wangjingjing 0130]# vim cycle_continue.sh
2,按照要求编写脚本文件
for i in {1..10}
do
if [ $i -eq 5 ]
then
continue
fi
echo "$i"
done
3,使用命令 bash cycle_continue.sh 执行脚本文件,结果如下:
[root@wangjingjing 0130]# bash cycle_continue.sh
1
2
3
4
6
7
8
9
10