目录
前言
本篇博客整理归类shell循环语句的相关知识点,单层循环以及双层循环的逻辑到底是什么样的?
另外本人写这篇博客的途中发现的Xshell的正确使用方式,将不透明度调低以后,可以透过窗口看到我美丽的桌面壁纸,就像是给Xshell增加了一个背景图片一样,我真是i了!!!
一、循环语句
1.1 for循环
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
三、分隔符
举例:读取文件,但是文件中有空格
解决办法:
还有个办法比较简单的,就是使用while read在while的示例3中有介绍,这个不涉及分隔符,但是用for写无法避免
举例:将五个环境分行输出
[root@localhost sh]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#!/bin/bash
IFS_OLD=$IFS
IFS=':'
for i in $PATH
do
echo $i
done
IFS=$IFS_OLD
四、双循环
外层循环每执行一次,内层循环都要全部执行完毕,下一次外层循环才能再执行
内层循环看作是外层循环的一个命令语句
#!/bin/bash
#双层循环测试
for ((i=1;i<=5;i++))
do
echo "outer loop: $i"
#外层循环
for ((j=1;j<=5;j++))
do
echo " inter loop: $j"
#内层循环
done
done
五、退出循环
5.1 exit
外循环1次,内循环3次
5.2 break
外循环5次,内循环3次
5.3 continue
外循环五次,内循环4次
跳过j等于3的循环,其他的循环不影响
在for循环中比较好用,while中慎用
5.4 死循环
while循环中一定要注意迭代(自增)的方式
六、总结
for
给了已知的取值列表,使用for循环是首选
循环操作一般会首选for循环
for(())
for i in ...
循环的分隔符 IFS是空格,制表符\t 换行符\n
while
需要满足某种条件时可以使用,不知道循环次数时可以配合配合退出语句(break,exit,continue)实现循环操作
until
不满足条件的时候要已知循环时使用
多线程
{
....
}&
wait
读取文件
法一
while read 变量名
do
....
done < 文件名
法二
cat 文件 |while read 变量名
do
....
done
退出循环
exit n(0-255)退出shell脚本进程,并且可以返回指定状态码,执行exit后脚本后面的所有语句都不执行
break 跳出当前的循环体,去执行循环后面的语句(默认跳出单层循环),break 2 跳出两层循环
continue 中止某次循环的执行,但不会完全中止整个循环(跳过这次循环);while until循环中使用要慎重,如果continue放在迭代语句前面会造成死循环