目录
前言
一、循环语句
1.1 for循环
1.2 while循环
示例1:批量添加用户
示例2:猜价格游戏
示例3:查看文件内容
1.3 until循环
示例1:计算1~50的和
二、多线程
三、分隔符
举例:读取文件,但是文件中有空格
举例:将五个环境分行输出
四、双循环
五、退出循环
5.1 exit
5.2 break
5.3 continue
5.4 死循环
六、总结
前言
本篇博客整理归类shell循环语句的相关知识点,单层循环以及双层循环的逻辑到底是什么样的?
另外本人写这篇博客的途中发现的Xshell的正确使用方式,将不透明度调低以后,可以透过窗口看到我美丽的桌面壁纸,就像是给Xshell增加了一个背景图片一样,我真是i了!!!
一、循环语句
1.1 for循环
for循环的知识点提前单独写了一篇博客,这里就不再赘述了,大家自行查阅
shell编程for循环语句原来如此
1.2 while循环
重复测试某个条件,主要条件成立则反复执行
相对于for,需要知道循环次数;我们只知道停止条件,不知道次数,就需要使用while,直到达到条件
while [条件表达式] do ..... done
示例1:批量添加用户
用户名称以stu开头,按数字顺序进行编号
一共添加20个用户,即stu1、stu2......
初始密码均为000000
#!/bin/bash #批量添加用户 i=1 while [ $i -le 20 ] do useradd stu$i echo "000000" |passwd --stdin stu$i &>/dev/null let i++ #一定要有变量迭代的过程 done
示例2:猜价格游戏
通过变量RANDOM获得随机数
提示用户猜测并记录次数,猜中后退出循环
#!/bin/bash #猜价格游戏 res=$[RANDOM % 100] a=0 while [ $a -eq 0 ] #永远为真 do read -p "请输入你猜的价格(0-99):" price if [ $price -eq $res ] then echo "恭喜你猜对了!" let b++ let a++ #a++代表正确后退出循环 #b++用来统计猜的次数 elif [ $price -lt $res ] then echo "猜低了,继续猜" let b++ elif [ $price -gt $res ] then echo "猜高了,继续猜" let b++ fi done echo "你一共猜了$b 次" #也可以将b++放在read -p下面
示例3:查看文件内容
法一:
#!/bin/bash #查看文件内容 while read line #read结合后面的重定向,模拟用户输入 #line是变量名,名字不唯一 do echo $line #打印这个变量 done < test.txt #文件重定向给循环
法二:
#!/bin/bash cat test.txt |while read line #使用管道符将查看到的文件利用read导入给while循环 #read结合后面的重定向,模拟用户输入 #line是变量名,名字不唯一 do echo $line #打印这个变量 done
1.3 until循环
重复测试某个条件,只要条件不成立则反复执行
基本上while能干的事情,until也能干
until [条件表达式] do ..... done
示例1:计算1~50的和
#!/bin/bash #求50以内的和 a=0 sum=0 #给定初值 until [ $a -gt 50 ] #大于50为假 do sum=$[sum + a] let a++ #得出值,并迭代 done echo "50以内的和: $sum "
二、多线程
for循环一般在正常执行的时候一个进程串行执行的取值列表的,如果脚本内容很多,效率低下,我们可以通过多线程并行处理提高效率
#!/bin/bash #多线程 for ip in 192.168.109.{1..254} do { ping -c 3 -i 0.5 -w 2 $ip &>/dev/null if [ $? -eq 0 ] then echo "$ip is online">>/opt/host_online.txt else echo "$ip is offline">>/opt/host_offline.txt fi }& #增加&符号(前面将代码用括号括起来),代表将进程放到后台处理,后台命令之间不区分先后关系 done wait #wait的作用是等待上面所有后台进程都执行完毕后才会去执行后面的语句。 #如果不用wait,后面的语句不会等待后台进程,会造成需要有上下文依赖关系 #的程序执行错误 cat /opt/host_online.txt cat /opt/host_offline.txt