7.shell for循环

news/2024/4/27 23:05:52/文章来源:https://blog.csdn.net/Wangjiachenga/article/details/137015108

shell 循环

  • for循环
      • 案例1:
      • 案例2:
      • 案例3:
      • 案例4:
      • 案例5:
      • 案例6:
      • 案例7:
      • 案例8:
      • 案例9:
      • 案例10:
      • 案例11:

for循环

什么是循环
重复执行一段代码

  • 比如批量创建100个用户,可以用到循环。
    循环的目的是为了简化代码,提高代码的重复利用率,提高程序效率。

  • 什么是for循环

    • for循环->条件循环,
    • for循环 循环的次数和给予的条件是成正比的,比如给了5个条件,那么循环就只会循环5次

  • for循环的语法

  • for 变量名  in  取值列表
    do循环体需要执行的动作
    done

示例

  for i in  1 2 3 4 5doecho 12345done

脚本执行效果

在这里插入图片描述


类C语言风格的写法

  for ((i=0;i<9;i++))doecho  "num is $i"done

脚本执行效果

在这里插入图片描述


案例1:

输出1-到15之间的数字

#!/bin/bashfor i in {1..15}
doecho num is $i
done

脚本执行效果

在这里插入图片描述


案例2:

第一列输出1-9之间的升序,然后第二列输出9-1的降序

整数运算:let
+ - * / % , **次方
例:let sum=2**4 ;echo $sum

自增自减:let i++ 常用来进行运算统计

a=$[ $a -1 ]	#让a变量进行自减	let a--
b=$[ $b +1 ]	#让b变量进行自增	let b++
#!/bin/basha=9
b=1for i in {1..9}
doecho "num is $b $a"let a--let b++
done

脚本执行效果

在这里插入图片描述


案例3:

批量探测某个网段的主机存活状态,将存活的主机存入ipok.txt文件中,不存活的主机存入ipnok.txt。

{程序}&表示将程序放到后台并行执行,如需等待程序执行完毕再进行下面内容,需要加wait

#!/bin/bashfor ip in {1..254} #设定IP地址的主机位范围
do
{ip_addr=192.168.3.$ip #设定一个变量用于接收每个IP地址ping -c1 -w1 $ip_addr &>/dev/null #检测主机的存活if [ $? -eq 0 ];then #上一条命令执行返回的结果为0,说明地址存活,存活主机IP输入到ipok.txtecho "${ip_addr} is ok" >>ipok.txtelse  #不存活主机IP输入到ipnok.txtecho "${ip_addr} not ok" >>ipnok.txtfi
}&done

脚本执行效果

查看存活的主机IP地址
在这里插入图片描述

查看不存活的主机IP地址
在这里插入图片描述


案例4:

判断主机存活状态,判断三次,如果三次失败则失败。

思路梳理:
ping网段内所有的主机
如果通,则不管
如果不通,则进入另一个循环,而另一个循环需要循环3次。
如果在第二次循环时通了,则退出第二层循环,回到第一层循环中。

#!/bin/bashfor ip in {1..254}  #第一层循环
do{ip_addr=192.168.3.$ipping -c1 -w1 $ip_addr &>/dev/nullif [ $? -eq 0 ];then #如果第一次ping通了,就输入到ipok1.txtecho "$ip_addr is ok">> ipok1.txtelse #第一次ping不通,就进入第二层循环for i in {1..3}doping -c1 -w1 $ip_addr &>/dev/nullif [ $? -eq 0 ];then #第二次ping通就跳出循环echo "探测 $ip_addr $i 次成功,IP存活" >> ipok1.txtbreakelse #echo "探测 $ip_addr $i 次失败,IP不存活">> ipnok1.txtfidonefi}&
done

脚本执行效果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


案例5:

现在有一个ip.txt的文件,里面有很多IP地址。
还有一个port.txt的文件,里面有很多端口号。
现在希望对ip.txt的每个IP地址进行端口的探测,探测的端口号来源于port.txt文件中,最后将开放的端口和IP保存到一个ipportok.txt文件。

这里用到一个工具 nc

nc可以支持测试linux的tcp和udp端口,而且也经常被用于端口扫描
1) -l
用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。2) -p
暂未用到(老版本的nc可能需要在端口号前加-p参数)3) -s
指定发送数据的源IP地址,适用于多网卡机4) -u
指定nc使用UDP协议,默认为TCP5) -v
输出交互或出错信息,新手调试时尤为有用6)-w
超时秒数,后面跟数字7)-z
表示zero,表示扫描时不发送任何数据

ip.txt

在这里插入图片描述

port.txt

在这里插入图片描述

#!/bin/bashfor ip in $(cat ip.txt) #第一层循环,先获取到IP地址
dofor port in $(cat port.txt) #获取到一个IP地址后,进入第二层循环,对该IP端口逐个扫描donc -zv -w 1 $ip $port &>/dev/null if [ $? -eq 0 ];thenecho "$ip $port is ok" >> ipportok.txtfidone
done

脚本执行效果
在这里插入图片描述


案例6:

获取系统的所有用户并输出。
效果如下:

This is 1 user: root
This is 2 user: bin
This is 3 user: daemon
This is 4 user: adm

#!/bin/bash
num=1for user in $(cat /etc/passwd|awk -F ":" '{print $1}')
do echo "this is $num user: $user"let num++
done

脚本执行效果
在这里插入图片描述


案例7:

批量创建10个用户,比如输入tst则会创建tst1-10。
1.提示用户输入名称,判断用户是否已存在,不存在再进行创建操作
2.需要循环10次。

#!/bin/bashread -p "输入用户名前缀:" userfor i in {1..10}
do id ${user}$i &>/dev/nullif [ $? -eq 0 ];thenecho "$user$i already exists"else useradd ${user}$i && \echo "${user}$i 创建成功"fi 
done

脚本执行效果:
在这里插入图片描述
在这里插入图片描述


案例8:

批量创建用户脚本,需要用户输入创建的用户数量,以及需要用户输入创建的前缀。
例如:前缀wang,个数10,代表创建wang1~wang10,总共10个用户。
1.提示用户要创建的前缀。(英文)
2.提示用户需要创建的个数(整数)
3.询问是否创建这个用户。
yes:开始通过循环创建用户
no:退出程序。


#!/bin/bashsource /etc/init.d/functionsread -p "输入纯英文用户前缀:" qz
if [[ ! $qz =~ ^[a-z]+$ ]];thenecho "输入纯英文"exit
firead -p "输入纯数字用户个数:" nu
if [[ ! $nu =~ ^[0-9]+$ ]];thenecho "输入纯数字"exit
firead -p "是否创建 ${qz}1 ~ ${qz}$nu [ yes | no ]" actioncase $action inyes)for i in $(seq $nu)doid ${qz}$i &>/dev/nullif [ $? -eq 0 ];thenaction "${qz}$i 已存在"	/bin/falseexitelseuseradd ${qz}$i && \action "${qz}$i 创建成功"	/bin/truefidone;;no)exit;;
esac

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


案例9:

批量创建用户脚本,需要用户输入创建的用户数量(必须是整数),同时还需要用户输入前缀(前缀不能为空)。例如:前缀qq,个数6,代表创建qq1~qq6,总共6个用户。

其实就是在上一个案例的基础之上,添加一个不能为空的判断

#!/bin/bashsource /etc/init.d/functionsread -p "输入纯英文用户前缀:" qzif [ -z $qz ];then #-z字符串长度为0则为真echo "输入不能为空"exit
fiif [[ ! $qz =~ ^[a-z]+$ ]];thenecho "输入纯英文"exit
firead -p "输入纯数字用户个数:" nu
if [[ ! $nu =~ ^[0-9]+$ ]];thenecho "输入纯数字"exit
firead -p "是否创建 ${qz}1 ~ ${qz}$nu [ yes | no ]" actioncase $action inyes)for i in $(seq $nu)doid ${qz}$i &>/dev/nullif [ $? -eq 0 ];thenaction "${qz}$i 已存在"	/bin/falseelseuseradd ${qz}$i && \action "${qz}$i 创建成功"	/bin/truefidone;;no)exit;;
esac

脚本执行效果
在这里插入图片描述


案例10:

循环批量创建用户,需要填入用户的数量、用户的前缀、用户的统一密码(使用read、case、for语句)

在上一个案例的基础上,添加了创建密码的操作

#!/bin/bashsource /etc/init.d/functionsread -p "输入纯英文用户前缀:" qzif [ -z $qz ];thenecho "输入不能为空"exit
fiif [[ ! $qz =~ ^[a-z]+$ ]];thenecho "输入纯英文"exit
firead -p "输入纯数字用户个数:" nu
if [[ ! $nu =~ ^[0-9]+$ ]];thenecho "输入纯数字"exit
firead -p "是否创建 ${qz}1 ~ ${qz}$nu [ yes | no ]" actioncase $action inyes)for i in $(seq $nu)doid ${qz}$i &>/dev/nullif [ $? -eq 0 ];thenaction "${qz}$i 已存在"	/bin/falseelseuseradd ${qz}$i && \echo "123456" |passwd --stdin ${qz}$i &>/dev/nullaction "${qz}$i 创建成功"	/bin/truefidone;;no)echo "拜拜!"exit;;
esac

脚本执行效果:

在这里插入图片描述

输入用户名密码进行登录测试
在这里插入图片描述


案例11:

现在需要随机密码。然后将创建的用户名以及对应的密码,写到一个username.txt文件中。

思路梳理:
1.随机密码如何弄?
mkpasswd -l 8 -d 2 -c 2 -C 2 -s 2

2.将创建的用户名称与密码写入对应的文件中即可。


随机密码获取:
mkpasswd命令

默认是没有安装mkpasswd的,mkpasswd命令使用前需要安装expect包,
yum install -y expect

然后就可以使用mkpasswd命令了

语法格式:mkpasswd [参数] [用户]常用参数:-c	定义在密码中小写字母字符的最小数目,默认值是2
-C	定义在密码中大写字母字符的最小数目,默认值是2
-s	定义在密码中特殊字符的最小数目,默认值是1
-p	指定程序来设置密码。默认情况下,如果存在使用/etc/yppasswd,否则使用/bin/passwd
-d	定义密码的最小数目,默认值是2
-l	定义口令的长度,默认值为9
-v	导致密码设置互动可见例如:
为用户更改随机密码
echo mkpasswd -l 8 | passwd --stdin test

在这里插入图片描述

echo 
-n:不输出换行符,而是连续输出多个消息-e:启用转义字符,可以使用一些特殊的字符序列来输出一些特殊的字符\n:换行符\t:制表符\:反斜线\b:退格符-E:禁用转义字符-s:将空格当成分隔符,去掉多余的空格
#!/bin/bashsource /etc/init.d/functionsread -p "输入纯英文用户前缀:" qzif [ -z $qz ];thenecho "输入不能为空"exit
fiif [[ ! $qz =~ ^[a-z]+$ ]];thenecho "输入纯英文"exit
firead -p "输入纯数字用户个数:" nu
if [[ ! $nu =~ ^[0-9]+$ ]];thenecho "输入纯数字"exit
firead -p "是否创建 ${qz}1 ~ ${qz}$nu [ yes | no ]" actioncase $action inyes)for i in $(seq $nu)douserpasswd=$(mkpasswd -l 8 -d 2 -c 2 -C 2 -s 2) #按照要求生成随机密码id ${qz}$i &>/dev/nullif [ $? -eq 0 ];thenaction "${qz}$i 已存在"	/bin/falseelseuseradd ${qz}$i && \echo $userpasswd |passwd --stdin ${qz}$i &>/dev/nullaction "${qz}$i 创建成功"	/bin/trueecho -e "${qz}$i \t $userpasswd" >>user_passwd.txt #echo -e:启用转义字符 \t制表符fidone;;no)echo "拜拜!"exit;;
esac

脚本执行效果:

在这里插入图片描述

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026893.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity学习笔记 9.2D射线

下载源码 UnityPackage 1.Ray2D 让小球向右发射射线&#xff1a; Ray2D ray;void Start() {// Ray2D(起点&#xff0c;终点)ray new Ray2D(this.transform.position, Vector2.right);// Debug.DrawLine(起点&#xff0c;终点&#xff0c;颜色&#xff0c;显示时间)Debug.DrawL…

Matlab高光谱遥感分析:提升植被监测的精度

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

【Web前端】CSS基本语法规范和引入方式常见选择器用法常见元素属性

一、基本语法规范 选择器 {一条/N条声明} 选择器决定针对谁修改 (找谁) 声明决定修改什么.。(干什么) 声明的属性是键值对.。使用 &#xff1a; 区分键值对&#xff0c; 使用 &#xff1a; 区分键和值。 <!DOCTYPE html> <html lang"en"> <head>&…

【鸿蒙HarmonyOS开发笔记】使用@Preview装饰器预览组件

概述 ArkTS应用/服务支持组件预览&#xff0c;要求compileSdkVersion为8或以上。组件预览支持实时预览&#xff0c;不支持动态图和动态预览。组件预览通过在组件前添加注解Preview实现&#xff0c;在单个源文件中&#xff0c;最多可以使用10个Preview装饰自定义组件。 Preview…

41-Vue-webpack基础

webpack基础 前言什么是webpackwebpack的基本使用指定webpack的entry和output 前言 本篇开始来学习下webpack的使用 什么是webpack webpack: 是前端项目工程化的具体解决方案。 主要功能&#xff1a;它提供了友好的前端模块化开发支持&#xff0c;以及代码压缩混淆、处理浏览…

构建vue3项目以及bem架构

构建vue3vite项目 &#xff08;1&#xff09;使用vite初始化一个项目 npm init vitelatest &#xff08;2&#xff09;构建cli项目 vue create <project> bem架构 src下新建文件bem.scss $namespace: "xc" !default; $block-sel: "-" !defaul…

Spark-Scala语言实战(5)

在之前的文章中&#xff0c;我们学习了如何在scala中定义与使用集合和元组。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&#xff08;…

国内外主要气象卫星介绍

NOAA AVHRR介绍 美国NOAA极轨卫星从1970年12月第一颗发射以来&#xff0c;近40年连续发射了18颗&#xff0c;最新的NOAA-19也将在2009年发射升空。NOAA卫星共经历了5代&#xff0c;目前使用较多的为第五代NOAA卫星&#xff0c;包括NOAA-15—NOAA-18&#xff1b;作为备用的第四…

MySQL语句(补充)

目录 一、子查询 1.1.select 语句 1.1.1.相同表查询 1.1.2.多表查询 1.1.3.NOT 1.1.4. insert 1.1.5. update 1.1.6.delete 1.1.7.exists 1.1.8.as别名 二、MySql视图 2.1.视图与表的区别和联系 2.2.建立视图 2.3.修改视图表数据 三、NULL值 四、连接查询 4…

常见的数学方法

Math类表示数学类&#xff0c;其中的数学方法都被定义成为static形式&#xff0c;所以可以直接通过Math类的类名调用某个数学方法。语法格式&#xff1a; Math.xxx(参数)&#xff1b; 例题 输入n个整数a1,a2,a3,......an,求这n个数的最大值max&#xff0c;最小值min&#xff0…

MongoDB高可用架构涉及常用功能整理

MongoDB高可用架构涉及常用功能整理 1. mongo架构和相关组件1.1. Master-Slave主从模式1.2. Replica Set 副本集模式1.3. Sharding 分片模式 2. Sharding 分片模式2.1. Hashed Sharding方式2.2. Range Sharding方式 3. 事务性4. 疑问和思考4.1. 怎么保证数据的高可靠&#xff1…

网约车APP小程序源码代驾顺风拼车货运司乘端安卓苹果源码可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的&#xff0c;全开源未加密&#xff0c;这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍&#xff1a; 车主实名认证&#xff0c;驾驶证认证&#xff0c;车…

计算机组成原理 — 指令系统

指令系统 指令系统指令的概述指令的格式指令的字长取决于 操作数类型和操作种类操作数的类型数据在存储器中的存放方式操作类型 寻址方式指令寻址数据寻址立即寻址直接寻址隐含寻址间接寻址寄存器寻址寄存器间接寻址基址寻址变址寻址堆栈寻址 RISC 和 CISC 技术RISC 即精简指令…

入门指南|营销中人工智能生成内容的主要类型 [新数据、示例和技巧]

由于人工智能技术的进步&#xff0c;内容生成不再是一项令人头疼的任务。随着人工智能越来越多地接管手动内容制作任务&#xff0c;营销人员明智的做法是了解现有的不同类型的人工智能生成内容&#xff0c;以及哪些内容从中受益最多。这些工具可以帮助我们制作对您的受众和品牌…

vue项目报这个错是 Same `value` exist in the tree: 0008E3000E1A?

警告 "Same value exist in the tree: 0008E3000E1A" 表示在树形选择器中存在相同的值。这通常是由于树形选择器的数据中存在重复的值造成的。就是返回的值中&#xff0c;有俩个id相同

利用python搭建临时文件传输服务

场景 如果想从一台服务器上传输文件又多种方法&#xff0c;其中常见的是利用scp进行传输&#xff0c;但是需要知道服务器的账号密码才能进行传输&#xff0c;但有时候我们并不知道账号密码&#xff0c;这个时候我们就可以通过python -m SimpleHTTPServer 命令进行传输文件 启…

computed计算属性、watch侦听器、生命周期

计算属性 点击查看 Vue文档 基础语法 多次使用计算属性&#xff0c;计算属性方法也只执行一次&#xff0c; 调用计算属性的方法不能加() 直接修改计算数学的值 计算属性不能通过双向绑定修改&#xff08;默认不能改&#xff09; 想要修改计算属性&#xff0c;就必须使用计…

mfc140.dll文件丢失我们该怎么去解决?教你最便捷的5种mfc140.dll方法

如果在使用计算机的过程中&#xff0c;系统突然提示“mfc140.dll文件丢失”&#xff0c;这实际上是一种常见的问题。对于频繁使用电脑的用户来说&#xff0c;可能会不时地遇到DLL文件缺失的情况。今天&#xff0c;我将为大家提供详细的说明&#xff0c;并指导如何修复mfc140.dl…

安全上网,防止上网被记录(v2ray实现加密通信)

近期听一位亲威说&#xff0c;她在公司休闲的时候上了哪个网站&#xff0c;浏览了过的网站IT部门的人都会知道&#xff0c;这是因为现在大多数网络设备&#xff0c;像路由与交换机都有记录访问网站地址记录功能&#xff0c;涉及还可以设置成记录到交互的内容。要想保密&#xf…

鸿蒙OS开发实例:【手撸服务卡片】

介绍 服务卡片指导文档位于“开发/应用模型/Stage模型开发指导/Stage模型应用组件”路径下&#xff0c;说明其极其重要。 本篇文章将分享实现服务卡片的过程和代码 准备 请参照[官方指导]&#xff0c;创建一个Demo工程&#xff0c;选择Stage模型 鸿蒙OS开发更多内容↓点击…