循环应用
一.循环介绍
重复
for,while,until,
循环:
1.循环的开始条件
2.循环的操作
3.循环的结束条件
二.for循环的使用
注意:for循环读取文件区分行时,会按照换行符,空白字符区分行。
语法1:
for 变量 in 取值列表;do
执行的操作
执行的操作
done
语法2:
for 变量 in 取值列表
do
执行的操作
执行的操作
done
这里的取值列表可以是多个数字,多个IP地址,等多个数据
多个数据之间用空格隔开
在shell脚本中使用循环的目的。
第一个是执行相同的操作,一定的次数。
第二个是在执行循环的时候,将变量在取值列表中获取的值,代入到执行的操作。
在取值列表中不同的数字可以用空格隔开
在取值列表中连续的数字可以使用seq命令来获取连续的数字。
如上图所示,是seq工具获取1到5的连续数字
如上图所示,使用seq工具,然后写一个起始数字,一个结束数字,
如上图所示,使用seq工具,起始数字,步长,结尾数字。(步长即数字的间隔)
如上图所示,就是在shell脚本中使用seq工具来提供取值列表的中数据的操作。
案例1:创建测试文件的脚本
脚本名称 目录名称
在指定目录中创建20个随机数命名的文件
即touch命令重复执行20次。
如上图所示,在Linux操作系统中可以使用openssl rand -hex 10来获取随机数。
如上图所示,首先我们统计用户执行脚本的时候所使用的参数个数,-ne是不等于的意思。
随后当用户所引用的参数个数不等于1的时候,执行if语句,退出脚本
当用户所引用的参数等于1的,条件为假,不执行if语句,
随后使用if语句判断目录是否存在,
如果用户输入的目录存在则条件为假,不创建目录
随后使用for 循环,取值列表由seq命令提供的1-20
创建$1目录下的20个文件,文件名称是10位的随机数。
如上图所示,是创建测试文件的脚本。
案例2:批量创建用户user1……user20
如上图所示,就是shell脚本中批量创建用户的脚本。
案例3:批量创建用户user01---user20
如上图所示,这是shell脚本中批量创建用户的操作,
创建的用户是user01到user20
如上图所示,seq命令加上-w的选项,就会出现如上的数字。
案例4:批量创建用户
fou循环读取文件内容的时候,一个是按照换行符区分行,一个是按照空白字符区分行。
如上图所示,也可以把一个文件的内容作为for循环的取值列表来使用。
如果某一行中有空白的话,那么这一行数据,就会被划分成多个部分。
如上图所示,就是将一个文件内容作为for循环取值列表的操作。
案例5:检测在线主机(启动多线程加快脚本执行速度。)
如上图所示,获取所有在线的IP地址,即使用ping 命令,当能ping通的时候,主机就在线。
如上图所示,为了加快脚本的执行效率,-c的意思是发送一次请求,-w的意思是等待一秒。
如上图所示,这是检测同一网段内,有那些IP在线。
如上图所示,对于一个脚本,我们可以使用CTRL+z将这个脚本扔到后台去,然后使用jobs -l来查看当前机器的后台有那些进程正在停止,可以使用kill 加上进场的PID把这个进程杀掉。
如上图所示,为了加快脚本的执行速度,可以在shell脚本中启动多线程的方式。即这254个IP地址交给254个线程,然后同时去ping,最后的wait的意思是等待的意思,即必须等这254个IP地址都ping完以后,这个脚本才能结束。
案例6:实现文件批量重命名
如上图所示,我现在有一个需求,要把这个目录中所有以.txt结尾的文件修改成以.mp3结尾的文件。
如上图所示,可以使用find命令来查看目录中需要操作的文件名称,并且find命令中一个结果占用一行,可以将find命令的结果,作为for循环的取值列表。
对于这个文件名重命名的操作可以做字符串截取也可以做字符串替换。
如上图所示,就是shell中的字符串截取的效果。
如上图所示,就是shell中的字符串替换。首先把变量名/旧的字符串/新的字符串
如上图所示,就是shell脚本中字符串的替换操作,将变量中的/旧字符串/新字符串
完成变量中字符串的替换。
如上图所示,将find命令的结果当作取值列表。
如上图所示,就是在脚本中对字符串进行替换。即对文件重命名的操作。
如上图所示,就是变量名/旧字符串/新字符串
进而完成字符串的替换。
案例7:在进行cp操作之后,检测文件差异(要么是少文件,要么是文件中的内容有差异)
如上图所示,需要根据bj目录为原版,检测sh目录中的文件是否有差异。
如上图所示,可以使用md5sum 文件名称
出来的效验码
来检测两个文件内容是否有差异。
三.中断循环的语句(肯定是满足一定的条件之后,才会触发中断循环的语句。也就是说中断循环的语句必须要和条件判断一起使用。)
continue
中断本次循环,立即开始下一次循环
如上图所示,就是关于continue的一个使用。即跳过满足特定条件的循环,直接进入下一次循环。
break
中断整体循环
如上图所示,就是当满足特定条件的时候,执行break语句,直接跳出循环。
案例:获取在线的同网段主机的IP地址及MAC地址
当遇到192.168.183.10的IP地址的时候,直接continue把这个IP地址跳过,因为这个IP地址是本地机器的IP地址。
如上图所示,可以使用arp命令在检测能否于指定IP的机器进行通信的同时,还能返回这台机器的正在通信的网卡的MAC地址。
如上图所示,是arp命令的帮助。
如上图所示,是使用arp命令去于IP地址为192.168.183.1的机器通信,并获取这个机器这个IP的网卡的MAC地址。
是在于指定IP机器通信成功之后,去获取这个机器的MAC地址。
如上图所示,就是对脚本的编写,这个脚本可以实现对192.168.183.0这个网段中的IP地址挨个通信,并且获取能通信的机器的网卡的MAC地址。