shell 流程控制之循环以及案例
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
流程控制之循环
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.131132,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显示players2ctrl + 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