shell编程之循环语句 for
1 什么是循环
凡是重复执行一段代码, 都可以称之为循环。 循环体中三种专业的话术:遍历、迭代、递归 。
- 遍历(traversal) - 按规则访问非线性结构中的每一项。
- 迭代(iterate) - 按顺序访问线性结构中的每一项。
- 递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况。
通常有进入循环的条件和退出循环的条件。
循环次数分为两种:
- 循环次数事先已知
- 循环次数事先未知
常见的循环命令:for, while, until。
2 for循环语句
用法:
- 读取不同的变量值,用来逐个执行同一组命令。
- 使用场景:一般用于循环次数事先已知的场景。
- 执行机制:遍历。
格式:
for 变量名 in 取值列表
do
命令序列 done
执行机制:
1.依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。
2.如果省略 [in WORDS ... ] ,此时使用位置参数变量 in "$@"
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030161958531-147188250.png)
2.1 for语句的作用演示
1、打印1到10的三种方法:
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030162112104-1049938515.png)
2、打印1到10之间的奇数:
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030162213722-1929158946.png)
3、打印1到10之间的偶数:
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030162324629-1301252565.png)
2.2 for循环应用示例
示例1:求从1加到10的和。
创建脚本:
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030162457723-1223719647.png)
示例2:批量添加用户
要求:
- 用户名存放在users.txt文件中,每行一个
- 初始密码均设为123456
创建脚本:
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030162613570-1241724830.png)
示例3:根据IP地址检查主机状态
要求:
- IP地址存放在ips.txt文件中,每行一个
- 使用ping命令检测各主机的连通性
创建脚本:
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030162801318-457844598.png)
3 多线程执行脚本(并行执行)
普通for循环是串行,一个一个执行。
在do和done中间增加 { } 符号,可以多线程同时执行。
多线程案例演示:
- ping 192.168.72.0/24网段内的所有主机。
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030162948080-1972392727.png)
4 for的三个默认分隔符
环境变量$IFS,是指内部字段分隔符, 默认为三个:空格、制表符 \t、换行符 \n。
使用set命令查看所有变量:
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030163047088-1878274773.png)
4.1 分隔符的作用演示:
示例:使用for读取文件内容,文件中有空格
演示:
文件中只有3行内容,使用for语句读取却显示为5行。
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030163124758-1818049087.png)
原因:
变量IFS定义的分隔符中有空格,for从文件中获取变量值时,以空格作为了分隔符,将"zhang san"分隔成了两行,"wang wu"也是如此。
解决方法:
在脚本中,先临时将变量IFS的值中的空格删除,使for语句不以空格作为分隔符,最后还原变量值。
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030163227792-2089131201.png)
![](https://img2022.cnblogs.com/blog/2964616/202210/2964616-20221030163254454-2123554899.png)