1、基本格式
for 变量名称(注意是名称不是变量$等) [ in 名称范围 ] (可以不写)
do
执行内容 若满足循环则做什么动作
done for循环结束标志
for i in $(cat /opt/users.txt);
do
useradd $i
echo 123456 | passwd --stdin $i
don
![](https://i-blog.csdnimg.cn/blog_migrate/5b69fbb7ba34f5e435ec2caaa466ca78.png)
![](https://i-blog.csdnimg.cn/blog_migrate/49afd8fa1c506ff32314e0ad3edb6055.png)
类C语言格式
for (( 表达式1 ;表达式2;表达式3 ))
do
执行内容 若满足循环则做什么动作
done for循环结束标志
表达式1:定义变量并赋值
表达式2:决定是否循环
表达式3:决定循环变量如何改变,决定循环什么时候结束
![](https://i-blog.csdnimg.cn/blog_migrate/fc8aaf6e65e24318d32da27d0d29c64f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/24e4a0f3b3470d169445c50b1a342296.png)
while循环
用于不知道循环次数,需要主动结束循环或达到条件结束循环。
1、基本格式
while [ 判断条件] 使用while循环满足条件执行do,不满足不执行
do
执行动作 while循环执行动作
done while循环结束标志
![](https://i-blog.csdnimg.cn/blog_migrate/6a326ea7ab89e0a178a779cf435a4f1b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1c24cf5a8b5883cca2a15b883b916688.png)
死循环语句
while [1 -eq 1] 判断条件写一个永久为真的条件
do 一直执行do内的命令
done
while true 直接写判断条件为真
do 一直执行do内的命令
done
while : 判断条件为冒号也表示死循环
do 一直执行do内的命令
done
until循环
1.基本格式
until循环通常用于当某个条件不满足时执行一些操作,比如等待某个进程退出、等待某个文件被创建等等
格式:
until [ 条件测试操作 ]
do
判断式/命令序列
done
![](https://i-blog.csdnimg.cn/blog_migrate/1b8d3c155b672fce744e19f04d3bc986.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0fd1c15a4975c9be3f9a5d21248e0c08.png)
三、跳出循环
1、continue跳出循环
表示满足continue条件时跳出循环,但是不影响后续循环执行
![](https://i-blog.csdnimg.cn/blog_migrate/286ff3855f4b6ff15ec0dc6ef278db80.png)
![](https://i-blog.csdnimg.cn/blog_migrate/90325973fbf96dfba55918c62d9dfa6b.png)
break跳出循环
在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。
break [数字] 结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,若为3则结束自己所在循环和外边嵌套的2层循环
![](https://i-blog.csdnimg.cn/blog_migrate/f6e59d1d711471181747ce4f3f2ed162.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e95a7a910cacb003b5f3061d982888c1.png)
1、循环打印9*9乘法表
思路:
①第一步for循环打印一行9个*号
②第二步再添加一个for循环打印一个9行9列的*号正方形
②第三步将*号正方形斜砍一般形成9*9乘法表的基本格式
③第四步将*号9*9乘法表格式用乘法算式替换
9*9乘法表
第一步:
vim 99.sh #创建99.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9} #for循环9次从i=1开始
do
echo -n "." #每循环一次打印一个. echo -n参数表示不换行
done #此for循环语句结束
bash 99.sh #调用shell执行脚本
![](https://i-blog.csdnimg.cn/blog_migrate/bdb150f68cfb72774153ab8c8e4765e9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/290fe2c218e23607f15f1e08d46bdd47.png)
第二步:
vim 99.sh #编辑99.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9} #添加打印列循环,循环9次从i=1开始
do #j循环时做do中的内容
for j in {1..9} #第一步for循环内容不变
do
echo -n "."
done
echo #列循环每循环一次打印一行空格进行换行
done #列循环for语句结束标志
![](https://i-blog.csdnimg.cn/blog_migrate/d0f11217e700885670cd4da05a2e384f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/29d0c6ecfcd00730c11cd2796c363da0.png)
seq 是一个 Linux/Unix 命令,用于生成一个序列(sequence)并打印出来。
![](https://i-blog.csdnimg.cn/blog_migrate/86310b749ef21b75801feb69a1592c0e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/02adc4ab657abd8fe3a52beee18b0a8e.png)
第三步:
vim 99.sh #编辑99.sh脚本
脚本内容:
#!/bin/bash
for j in {1..9} #列循环内容不变
do
for i in `seq $j` #修改行循环j的取值范围为展开变量j,即当j=1时i取值只有1,所以循环一次。当
j=2时,i取值为1和2,所以i=1和i=2各循环一次,循环2次。以此类推到j=9
do
echo -n "*"
done
echo
done
![](https://i-blog.csdnimg.cn/blog_migrate/631efe01ce542d40badc1029b4f4b6cd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1a7ccc6da54049999f1afe10f6d41811.png)
第四步:
vim 99.sh #编辑99.sh脚本
脚本内容:
#!/bin/bash
for j in {1..9} #列循环内容不变
do
for i in `seq $j`
do
echo -ne "$j*$i=$[ $j*$i ]\t" #行输出内容修改为9*9算式和结果。$[ ]表示计算里面的正整数结
果,echo -e参数表示调用转义符,\t表示制表符即循环时输出一个tab键
done
echo
done
![](https://i-blog.csdnimg.cn/blog_migrate/3b6683e968397f14c4b714218029e45c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1552ce434c1330c67ba1177020b93c99.png)
循环ping测试某个网段网络连通性
需求:测试用户输入的某个32位网段是否可以ping通,且若可以ping通将此ip输出到文件host.txt中。
思路:
①第一步读取用户输入的32位网段。
②使用for循环生成用户输入网段的所有ip。
③使用ping命令在循环中测试用户输入网段内所有ip,注意指定ping包个数和超时结束时间,否则一直ping。
④将循环检查网络连通性放入后台执行。
![](https://i-blog.csdnimg.cn/blog_migrate/396bf63a2c7db1ffe1f831601249468e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/312fbeebda5afb7f6bea4539f770aa37.png)
while死循环实现猜数字游戏
需求:生成随机1-100的价格给用户猜测直到猜对结束游戏,并统计用户猜对猜了几次。
思路:
①第一步生成一个随机1-100数字
②第二步使用while循环写一个死循环直到用户猜对才结束循环
③在执行循环的过程中统计循环执行次数并输出
vim game.sh #创建脚本game.sh
脚本内容:
#!/bin/bash
num=`echo $[ RANDOM%100+1 ]` # $[RANDOM]是一个0-32767的随机数,%100+1除100取余+1表示生成0-100随机数
time=0 #定义猜对次数变量time初始值为0
while true #生成while死循环
do #循环动作为do内的内容
let time++ #每循环一次time变量自加1
read -p "请输入您猜测的数字,范围(1-100):" user #读取用户输入的内容为变量user
if [ $user -eq $num ] #条件判断分支1,如果用户输入等于随机生成执行then动作
then
echo "您猜对了,您一共猜测了$time次" #if分支1条件成立执行输出
break #if分支1条件成立则结束本次循环
elif [ $user -gt $num ] #条件判断分支2,如果用户输入大于随机生成执行本次then动作
then
echo "您猜大了,请往小猜" #条件判断分支2成立提示用户猜大了
elif [ $user -lt $num ] #条件判断分支3,如果用户输入小于随机生成执行本次then动作
then
echo "您猜小了,请往大猜" #条件判断分支3成立提示用户猜小了
fi #if语句结束
done
![](https://i-blog.csdnimg.cn/blog_migrate/76003c655d3b6eeda7342d1a15e3da2e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e59a74a36635186f8aba9e1a043805fd.png)
数字累加脚本(1-100)
需求:编写脚本实现计算从1加到100的值
思路:
①累加需要用到循环,已知循环次数时使用for循环
②也可以使用while循环达到累加条件时结束循环
vim sum.sh #创建sum.sh脚本
脚本内容:
sum=0 #定义变量sum初始值为0
for i in {1..100} #for循环 i取值从1到100
do
sum=$[ i+sum ]
#let sum=$i+$sum #每次循环内容计算变量i+sum的值赋值给sum,二选一
done #for语句结束标志
echo "1-100累加值为:$sum" #循环结束后输出内容
![](https://i-blog.csdnimg.cn/blog_migrate/13af6811c822d6e89ab42b0bca75cd1b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7f7921592b519d6dddc4e34a8d5c39e8.png)
常用转义字符
echo -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上
常用的转义字符如下:
\b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符。
\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。
\n 换行,被输出的字符从"\n"处开始另起一行。
\f 换行,但是换行后的新行的开头位置连接着上一行的行尾;
\v 与\f相同;
\t 转以后表示插入tab,即横向制表符;
\r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
\\ 表示插入"\"本身;
![](https://i-blog.csdnimg.cn/blog_migrate/074b5b928748d5ee9e1fff806eccdbaf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/346b7543b1b80a41b8680d6bdc5f6a0e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/73192e7ec5a3193baefc3ae07f3bbb8a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/deb78b3d1bc76de242637d1d4c9cf80e.png)