提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、for循环
for循环的主要目的就是减少代码的冗余和重复
● for循环的语法格式
● 根据变量的不同取值,重复执行命令序列
♦ for 变量 in 值列表
do
命令序列
done
♦ for((初值;条件;步长))
do
命令序列
done
示例1:for循环
#!/bin/bash
#"i"作为一个变量,in后面的是值列表
for i in a b c d e f g
do
echo "hello $i"
done
示例2:for循环2
#!/bin/bash
for ((i=1;i<=6;i++))
do
echo "hello $i"
done
示例3:循环创建10个系统账户
#!/bin/bash
for i in {1..10}
do
useradd a$i
echo 123123 |passwd --stdin a$i
done
~
示例4:批量创建系统账户
♦ 先创建一个用户名列表users.txt文件,读取用户名列表文件创建账户
#!/bin/bash
#使用cat查看用户文件,但是并不要cat这个单词,而是这个命令执行的结果,所以这里用$()
#这里cat命令会将1.txt文件中所有的用户名取出来
for i in $(cat /root/123/1.txt)
do
useradd "$i"
echo "123123" | passwd --stdin "$i"
done
示例5:for循环的嵌套(9*9乘法表)
思路:9*9乘法表的规律
1*1=1 | ||||||||
---|---|---|---|---|---|---|---|---|
2*1=2 | 2*2=4 | |||||||
3*1=3 | 3*2=6 | 3*3=9 | ||||||
4*1=4 | 4*2=8 | 4*3=12 | 4*4=16 | |||||
5*1=5 | 5*2=10 | 5*3=15 | 5*4=20 | 5*5=25 | ||||
6*1=6 | 6*2=12 | 6*3=18 | 6*4=24 | 6*5=30 | 6*6=36 | |||
7*1=7 | 7*2=14 | 7*3=21 | 7*4=28 | 7*5=35 | 7*6=42 | 7*7=49 | ||
8*1=8 | 8*2=16 | 8*3=24 | 8*4=32 | 8*5=40 | 8*6=48 | 8*7=56 | 8*8=64 | |
9*1=9 | 9*2=18 | 9*3=27 | 9*4=36 | 9*5=45 | 9*6=54 | 9*7=63 | 9*8=72 | 9*9=81 |
首先,99乘法表是有9行,第一行是1的乘法,第二行是2的乘法,以此类推,第九行是9的乘法,
其次,99乘法表有若干列,第一行是1列,第二行是2列,以此类推,第九行是9列
这里的规律就是他的列数要小于等于行数,假设行数为七的时候,列数不能大于7,它必须小于等于7
9*9乘法表是有两个数字相乘,在这个脚本中用i代表一个数字,同时代表的是行,就是计算左边的数字,使用a代表另外个数字,同时代表列,就是计算的右边的数字
从上面的表格可以看到,右边的数字是小于等于左边的数字
#!/bin/bash
#先做for循环i=1,i<=9,每循环一次i++
#第一步,当i=1的时候,它就会进到do和done里面把里面命令执行一遍,
#第三步,当第二步循环结束后此时并没有结束,i只做了第一次循环,此时i++变成2,再次进到do和done之间进行第二次循环
#第五步,以此类推,当i的值大于9的时候,循环结束
for ((i=1;i<=9;i++))
do
#又嵌套一个for循环,这个for循环变量是a,a初始值为1,a永远要小于等于i的值,然后a++
#第二步,当i=1,此时a=1,1>=i,显示1*1=1,然后a++之后,a=2,此时a>1,循环结束,结束后回到上一个循环
#第四步,当i=2,此时进入嵌套内的又一个for,a=1的循环,再次执行a=1,此时1<=2,显示2*1=2,然后a++后,a=2,此时a依然<=2,显示2*2=4,然后后再次a++,此时a=3,3大于2,循环结束,回到上亿循环
for ((a=1;a<=i;a++))
do
#echo -n 的命令是不换行
#同时注意,这里方括号后面的"之前需要加一个空格,否则两个结果会连载一起
echo -n "$i*$a=$[i*a] "
done
#在a循环的结束之后,打echo,不输出任何信息,默认就是一个回车
echo
done
下面有一些脚本中代码不完全的图片
for小结
♦ for循环基本语法
for 变量 in 值列表
for ((变量初值;判断条件;步长))
无论什么样的for循环,最核心点的就是掌握语法结格式
for循环的两种格式,一种是for变量,然后通过in对值列表取值,
第二种是for先给变量赋初值,然后判断循环是否满足执行条件,只要满足条件就一直会循环下去,直到条件不满足时,循环结束
每次循环结束,变量会自增自减,每变化一次就判断条件,条件成功,就循环,直到最后条件不成功时候,循环结束
二、while循环
语法结构及特点
● 条件式循环
♦ 反复测试条件,只要能成立就执行
while 条件测试
do
命令序列
done
这里如果条件测试为真,就执行do和done之间的命令序列,不仅是执行命令序列,在执行完后,整个语句会返回到while再次判断条件测试,如果条件测试为真,则继续执行do和done之间的命令,并且在执行完之后再次返回,再次判断条件测试是否为真,以此类推,如果这个条件测试一直为真,那么命令序列就会一直反复执行,直到有次判断条件为假的时候循环结束
示例1:死循环
#!/bin/bash
#首先先设置一个变量i=1
i=1
#while判断,$i是否小于等于10,i定义的变量是1,1肯定是小于10的,所以条件成立,
while [ $i -le 10 ]
#条件成立则就会执行do和done之间的命令
do
#这里$i,i=1,也就会显示1,当执行完之后,会再返回while判断,
echo $i
done
#因为设置的变量永远等于1,1永远都小于等于5.所以这个循环永远不会结束
根据上图可以看到该脚本执行后会无限循环输出1,直至CTRL+C
扩展:如果真的要写一个死循环的脚本的话可以用以下格式
#!bin/bash
#while后面跟冒号这种,冒号后面永远为真
while :
do
echo a
done
示例2:while循环
#!/bin/bash
#首先先设置一个变量i=1
i=1
#while判断,$i是否小于等于10,i定义的变量是1,1肯定是小于10的,所以条件成立,
#当i=2时,2小于10,所以条件成立,一次类推,直至i=11,此时11大于10,条件不成立,循环结束
while [ $i -le 10 ]
#条件成立则就会执行do和done之间的命令
do
#这里$i,i=1,也就会显示1,当执行完之后,会再返回while判断,
echo $i
#这里let i++,i就会自加1,就变成了2,再返回while判断,
let i++
done
示例3:while循环批量创建用户
#!/bin/bash
#定义两个变量,a是前缀,i是后缀
a=b
i=1
#循环判断i是否小于等于6,如果i<=6则执行命令
while [ $i -le 6 ]
do
useradd $a$i
echo "123123" | passwd --stdin $a$i &>/dev/null
let i++
done
~
根据图片可以看到,运行脚本后批量创建了b1-b6用户
示例4:猜数字while循环
#!/bin/bash
#用RANDOM做一个1-100之间的随机数字定义为"num"
num=$[RANDOM%100+1]
#while:做一个死循环
while :
do
read -p "请输入1-100的整数:" x
if [ $x -eq $num ];then
echo "恭喜你,猜对了,就是$num"
#因为是做了一个死循环,所以这里有一个exit,只要你猜对了,就会执行退出,如果猜不对,就会>进入下面的命令,直至猜对
exit
elif [ $x -le $num ];then
echo "猜小了"
else
echo "猜大了"
fi
done
小结
● for一般用于固定次数循环
● while一般用于非固定次数循环