【Linux脚本篇】循环语句-for

news2024/9/29 13:20:01

目录

🍁for的语法格式

🍁for循环案例

🍃案例一:循环创建文件

🍃案例二:应用引号或转义符

🍃案例三:从变量中取值

🍃案例四:从命令中取值

🍃案例五:for循环自增自减

🍃案例六:批量创建用户

🍃案例七:批量探测主机

🍃案例八:随机点名


  🦐博客主页:大虾好吃吗的博客

  🦐专栏地址:Linux从入门到精通

        前面讲的判断语句if和case只能做判断,可以说只能做一些判断。如果判断结果为假,将执行最后的命令(一般是exit退出脚本),如果不想退出,继续选从零开始小于10以内的次数,择正确的选项,就需要继续回到上面选择,这时就需要循环语句。循环语句可以做类似于一级菜单、二级菜单的选项,直到选择正确的选项,最后可以退出脚本,这就是一个完整的程序。而循环语句有for和while两种,本章讲解的是for语句。

for的语法格式

for 变量名 in [取值列表]
do
    循环命令语句
done

        语法格式上来看,还是很简单的,我们在来几个简单的案例,让我们更加理解。

for循环案例

案例一:循环创建文件

        目的是在根下filedir目录创建100个文件;在执行前先确定有没有该目录,所以就需要用到判断语句,如果没有这个目录则创建,有则不执行,

[root@daxia sh]# vim for1.sh 
#!/bin/bash
​
text=/filedir
​
[ ! -d $text ] && mkdir $text
​
for I in {1..100}
do
        touch ${text}/hehe$I
done
​
[root@daxia sh]# sh for1.sh 
[root@daxia sh]# ls /filedir/

案例二:应用引号或转义符

        for循环的取值比较复杂,我们可以使用引号或转义符。比如说下面的file1需要用单引号引起来,但是如果不使用转义符,系统会以为引起来的内容是一起的,不会打印出来单引号。而后面的hello beijing不用引号引起来,系统会以为是两个值,分开打印。

[root@daxia sh]# vim for2.sh 
#!/bin/bash
for F in \'file1\' "hello beijing" file4 "hello world"
do
        echo the text is $F
done
[root@daxia sh]# sh for2.sh 
the text is 'file1'
the text is hello beijing
the text is file4
the text is hello world

案例三:从变量中取值

在循环里,取值列表可以是变量,先定一个变量,里面添加值,在for里面引用。

[root@daxia sh]# vim for3.sh
#!/bin/bash
List="file1 file2 file3"
for I in $List
do
        echo "the text is ${I}"
done
[root@daxia sh]# sh for3.sh
the text is file1
the text is file2
the text is file3

案例四:从命令中取值

在命令中取值默认以空格为分隔符,可以使用IFS自定义分隔符。

[root@daxia sh]# vim for4.sh
#!/bin/bash
for H in $(cat /etc/hosts)
do
        echo "$H"
done
[root@daxia sh]# sh for4.sh
127.0.0.1
localhost
localhost.localdomain
localhost4
localhost4.localdomain4
::1
localhost
localhost.localdomain
localhost6
localhost6.localdomain6

#以冒号做分隔符 IFS=: #以分号做分隔符 IFS=";" #以换行符做字段分隔符 IFS=$'\n'

        我们可以看到上面,执行后,原本两行的文本,打印出了很多行。这就很不合理,我们后面把分隔符改成换行作为分隔符。

[root@daxia sh]# vim for4.sh
#!/bin/bash
​
IFS=$'\n'
for H in $(cat /etc/hosts)
do
        echo "$H"
done
[root@daxia sh]# sh for4.sh 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6  

案例五:for循环自增自减

        我们来感受下自增的变化吧,根据上面几个案例,我们可以在值中写入多个用户,然后再循环创建。但是如果使用自增的话可以指定创建多少,并且不用写那么多的值。下面for语句中的i=1表示初始值为1,i<=10则是表示最多等于10或小于10,i++则是每次循环加一。这样我们就可以创建出十个不同数字的用户了,试想一下,自增还能给我们带来哪些便利呢?

[root@daxia sh]# vim for5.sh
#!/bin/bash
for (( i=1;i<=10;i++ ))
do
        useradd sc$i
done
[root@daxia sh]# sh for5.sh 
[root@daxia sh]# tail -10 /etc/passwd
sc1:x:1000:1000::/home/sc1:/bin/bash
sc2:x:1001:1001::/home/sc2:/bin/bash
sc3:x:1002:1002::/home/sc3:/bin/bash
sc4:x:1003:1003::/home/sc4:/bin/bash
sc5:x:1004:1004::/home/sc5:/bin/bash
sc6:x:1005:1005::/home/sc6:/bin/bash
sc7:x:1006:1006::/home/sc7:/bin/bash
sc8:x:1007:1007::/home/sc8:/bin/bash
sc9:x:1008:1008::/home/sc9:/bin/bash
sc10:x:1009:1009::/home/sc10:/bin/bash

同时输出1-9的升序和降序,注意:多个值之间是用逗号分隔,结束用分号分隔。

[root@daxia sh]# vim for5_1.sh
#!/bin/bash
for (( a=1,b=9;a<=10;a++,b-- ))
do
        echo "num is $a $b"
done
[root@daxia sh]# sh for5_1.sh 
num is 1 9
num is 2 8
num is 3 7
num is 4 6
num is 5 5
num is 6 4
num is 7 3
num is 8 2
num is 9 1
num is 10 0

用另外一种方式来实现升序和降序

[root@daxia sh]# vim for5_2.sh
#!/bin/bash
a=0
b=10
for i in {1..9}
do
        let a++
        let b--
        echo "num is $a $b"
done
[root@daxia sh]# sh for5_2.sh 
num is 1 9
num is 2 8
num is 3 7
num is 4 6
num is 5 5
num is 6 4
num is 7 3
num is 8 2
num is 9 1

案例六:批量创建用户

        我们先看看RANDOM随机数生成命令,100表示最大生成的随机数,然后+1表示从1开始,如果不+1则随机数可能是0。

[root@daxia sh]# echo $((RANDOM % 100 + 1))

这次脚本写一个批量创建用户,提示用户输入前缀、数量,指定root用户才能执行脚本,密码随机(使用RANDOM命令),前缀不能为空。

[root@daxia sh]# vim for6.sh 
#!/bin/bash
if [ ! $UID -eq 0 ] && [ $USER != "root" ];then
        echo "你不是管理员,执行失败"
        exit
fi
read -p "请输入你的用户前缀:" User_a
if [ -z $User_a ];then
        echo "请输入有效的前缀"
        exit
fi
read -p "请输入你的用户数量:" User_b
if [[ ! $User_b =~ ^[0-9]+$ ]];then
        echo "请输入整数"
        exit
fi

read -p "是否创建用户【y|n】:" yn
case $yn in
        y)
                for i in $(seq $User_b)
                do
                        user=${User_a}$i
                        id $user &> /dev/null
                        if [ $? -eq 0 ];then
                                echo "useradd:user $user already exists"
                        else
                                user_pass=$(echo $((RANDOM)) | md5sum | cut -c 2-10 )
                                useradd $user
                                echo "$user_pass" | passwd --stdin $user &> /dev/null
                                echo "用户:$user 密码:$user_pass " >> /tmp/user.txt
                                echo "useradd:user $user add successfull,密码在/tmp/user.txt" 
                        fi
                done
                ;;
        n)
                exit
                ;;
        *)
                echo "error:请输入【y|n】:"
esac

[root@daxia sh]# sh for6.sh
请输入你的用户前缀:zhang
请输入你的用户数量:3
是否创建用户【y|n】:y
useradd:user zhang1 add successfull,密码在/tmp/user.txt
useradd:user zhang2 add successfull,密码在/tmp/user.txt
useradd:user zhang3 add successfull,密码在/tmp/user.txt
[root@daxia sh]# cat /tmp/user.txt 
用户:zhang1 密码:29a106702 
用户:zhang2 密码:6ded89b39 
用户:zhang3 密码:b984e2b01 

        自行测试吧,切换用户测试非root用户(非0用户),执行脚本测试是否执行。然后修改脚本成批量删除用户,测试是否成功。

案例七:批量探测主机

        批量检查主机(以8.0网段为例),并检查主机22端口是否开启。检查22端口需要使用nmap命令,需要提前安装。为了节省时间,这里就扫描三台主机了。

[root@daxia sh]# vim for7.sh
#!/bin/bash
for i in {100..102}
do
        Ip=192.168.8.$i
        ping -c 1 -w 1 $Ip &> /dev/null
        if [ $? -eq 0 ];then
                echo "$Ip is ok"
                echo "$Ip" >> /tmp/ip.log
        else
                echo "$Ip is down"
        fi
done
        wait
        echo "scan host ip is done"
        echo "scan ssh port is starting"

for i in $(cat /tmp/ip.log)
do
        nmap $i |grep "22" &> /dev/null

        if [ $? -eq 0 ];then
                echo "$i 22端口已开启"
                echo "$i 22端口已开启" >> /tmp/port.log
        fi
done

[root@daxia sh]# sh for7.sh 
192.168.8.100 is ok
192.168.8.101 is down
192.168.8.102 is down
scan host ip is done
scan ssh port is starting
192.168.8.100 22端口已开启
192.168.8.100 22端口已开启
192.168.8.100 22端口已开启

案例八:随机点名

        在一个文档中写入人名,通过过滤筛选出一个。先用wc命令过滤出student.txt中有几个人,来决定循环几次。在通过随机数计算出第几位,并使用sed命令确定人名,循环外面则是计算出的人名高亮显示。

[root@daxia sh]# cat student.txt 
张三
李四
王五
马六
朱七
[root@daxia sh]# vim for8.sh
#!/bin/bash
num=$(wc -l student.txt|awk '{print $1}')
for i in {1..$num}
do
	stu_num=$(( RANDOM % $num + 1 ))
	sed -n "${stu_num}p" student.txt
	sleep 0.1
done 
	name_stu=$(sed -n "${stu_num}p" student.txt)
	echo -e "就是你了:\033[32m $name_stu \033[0m"
	
[root@daxia sh]# sh for8.sh
李四
就是你了: 李四 
[root@daxia sh]# sh for8.sh
朱七
就是你了: 朱七 
案例九:随机猜数字

[root@daxia sh]# vim for9.sh
#!/bin/bash
num=$(echo $(( RANDOM % 100 )))
​
i=0
while true
do
        read -p "请输入一个随机数字【1-100】:" sz
        if [[ ! $sz =~ ^[0-9]+$ ]];then
                echo "请输入有效的整数"
                continue
        fi
​
        if [ $sz -gt $num ];then
                echo "你的数字过大"
        elif [ $sz -lt $num ];then
                echo "你的数字过小"
        else
                echo "恭喜,你猜对了!!!"
                break
        fi
        let i++
done
        echo "你总共猜了 $(( $i + 1 )) 次。"
[root@daxia sh]# sh for9.sh
请输入一个随机数字【1-100】:50
你的数字过小
请输入一个随机数字【1-100】:80
你的数字过大
请输入一个随机数字【1-100】:70
你的数字过大
请输入一个随机数字【1-100】:60
你的数字过小
请输入一个随机数字【1-100】:65
你的数字过大
请输入一个随机数字【1-100】:63
你的数字过大
请输入一个随机数字【1-100】:62
你的数字过大
请输入一个随机数字【1-100】:61
恭喜,你猜对了!!!
你总共猜了 8 次。
[root@daxia sh]# 

                                创作不易,求关注,点赞,收藏,学习,谢谢~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vulkan入门精要

Vulkan入门精要 (fuxiii.github.io)https://fuxiii.github.io/Essentials.of.Vulkan/

开始在适用于 Linux 的 Windows 子系统上使用 Git

目录 Git 可以安装在 Windows 和 WSL 上安装 GitGit 配置文件设置Git 凭据管理器设置使用 SSH 的 GitAzure 的其他配置添加 Git Ignore 文件Git 和 VS CodeGit 行尾其他资源 Git 是最常用的版本控制系统。 使用 Git&#xff0c;可以跟踪对文件所做的更改&#xff0c;以便记录已…

java使用aspose.pdf或者spire.pdf 将pdf文件转word,实测

1. aspose.pdf aspose.pdf不是破解版的只能转3页&#xff0c;所以我弄了个破解版&#xff0c; aspose.pdf破解版在网上都有破解方法也比较简单&#xff0c;这里就不说了&#xff0c;直接引入破解版的jar包&#xff0c;在这里我用的是aspose-pdf-21.11.jar版本&#xff0c;代码…

【电路】电路与电子技术基础 课堂笔记 第9章 集成运算放大器基础

本章的研究对象是集成运算放大器的应用&#xff0c; 主要关注如何利用理想运放的特点&#xff0c;分析放大电路&#xff0c; 不讨论继承运放的工作原理和内部结构。 9.3 集成运放的主要参数与选择 9.4 集成运放的应用 集成运放应用于信号运算&#xff0c;信号处理&#xff…

调用阿里API实现手机号归属地查询

调用阿里API实现手机号归属地查询 1&#xff0e;作者介绍2&#xff0e;号码归属地介绍2.1 什么是手机号码归属地&#xff1f;2.2 为什么需要手机号码归属地&#xff1f;2.3 手机号码归属地查询对个人的运用 3&#xff0e;调用阿里API实现手机号归属地查询3.1阿里API调用3.2补充…

BYC30W-600P-ASEMI代理NXP快恢复二极管BYC30W-600P

编辑&#xff1a;ll BYC30W-600P-ASEMI代理NXP快恢复二极管BYC30W-600P 型号&#xff1a;BYC30W-600P 品牌&#xff1a;NXP/恩智浦 封装&#xff1a;TO-247-2L 最大漏源电流&#xff1a;30A 漏源击穿电压&#xff1a;600V 引脚数量&#xff1a;2 恢复时间&#xff1a;2…

JavaScript:获取当前日期、星期、时间 | Data对象

文章目录 1 Date对象2 代码示例3 获取 yyyy-MM-dd 格式的日期 1 Date对象 JavaScript 中的 Date 对象表示日期和时间。Date 对象基于自 1970 年 1 月 1 日 00:00:00 UTC&#xff08;协调世界时&#xff09;以来的毫秒数。以下是 Date 对象的一些常用方法和属性。 getFullYear…

H5页面这样测,业务方反馈 0 Bug!

部门最近的H5相关项目挺多的&#xff0c;由于团队之前接触的大多是Web项目&#xff0c;很少涉及H5&#xff0c;想着给团队成员培训下&#xff0c;减少漏测率&#xff0c;于是整理了一个文档。 别说&#xff0c;效果还挺不错的&#xff0c;连着上线6个版本&#xff0c;都没有收…

Python3数据分析与挖掘建模(10)多因子:复合分析-交叉分析与实现示例

1. 复合分析 1.1 概述 复合分析&#xff08;Factorial Analysis&#xff09;是一种统计分析方法&#xff0c;用于研究多个因素对观测结果的影响&#xff0c;并探究各个因素之间的相互作用效应。 在复合分析中&#xff0c;研究者会选择多个因素&#xff08;也称为处理变量或独…

路由器WiFi密码怎么设置?这样做可以快速设置!

案例&#xff1a;我在外面租房&#xff0c;买了一个路由器&#xff0c;为了不让别人使用&#xff0c;我想设置一个密码。但我不知道如何操作。路由器怎么设置密码&#xff1f;求方法分享&#xff01; 如今&#xff0c;Wi-Fi已成为日常生活中不可或缺的一部分。为了保障个人和家…

4. LockSupport与线程中断

4.1 线程中断机制 4.1.1 从阿里蚂蚁金服面试题讲起 Java.lang.Thread下的三个方法: ● 如何中断一个运行中的线程&#xff1f; ● 如何停止一个运行中的线程&#xff1f; 4.1.2 什么是中断机制 ● 首先&#xff0c;一个线程不应该由其他线程来强制中断或停止&#xff0c;而是应…

排水管网监测,万宾排水管网在线监测系统

城市排水管网是保障城市环境卫生的重要基础设施。然而&#xff0c;传统的排水管网管理方式存在许多问题.通过排水管网在线监测系统的建设&#xff0c;可以实现对管网上窨井井盖状态、管网液位、管网流量、管网水质等数据采集&#xff0c;实时掌握排水管网运行状况&#xff0c;为…

@足智多谋的你,联网智能门锁试卷(2023高考版)正式发布!

千淘万漉虽辛苦&#xff0c;吹尽狂沙始到金。2023年的高考已于上周正式结束。湖南省高考成绩和录取控制分数线将在6月25日正式公布。广大学子历经一千多个日夜的努力&#xff0c;即将在这一天见证结果。 其实&#xff0c;当我们真正走出校园才发现&#xff0c;学无止境&#x…

敏捷项目管理

在了解敏捷项目管理之前&#xff0c;我们先看下敏捷和传统项目管理有什么区别。 传统项目管理&#xff1a;阶段式项目管理模式。 制定详细的计划和步骤&#xff0c;按计划执行&#xff0c;直到所有的计划执行全部结束。 敏捷项目管理模式&#xff0c;从愿景和高价值的目标出发…

V5.0.X版本 EMQX安装、卸载 以及使用

V5.0.X版本 EMQX安装、卸载 以及使用 一、卸载二、下载安装2.1 下载2.2 安装2.2.1 rpm安装2.2.2 tar安装 2.3 测试启动 三、EMQX使用 回到目录    回到末尾 EMQX为大规模分布式物联网 MQTT 消息服务器。提供高效可靠连接海量物联网设备&#xff0c;实时处理分发消息与事件流数…

高级信息系统项目管理师资料分享

&#x1f495;&#x1f495; 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 文章目录 1. 高级信息系统项目管理师资料分享2023年5月12日2023年4月10日2023年3月28日2023.5高项精讲 2023备考高级信息系统项目管理师资料 1. 高级信息系统项目管理师资料分…

超级实用!Python 3.6帮您提升编码效率的一个新的小特性 ——f{}

Python3.6 格式化字符串的新用法 在python 3.6格式化字符串时&#xff0c;增加了一个非常实用的新特性&#xff0c;文本以“f”或者“F”为前缀加上{}&#xff0c;可以实现类似于%和str.format的功能&#xff0c;但与他们相比更加易读和不易不错。使用也非常方便&#xff0c;以…

3分钟教你怎样搭建属于你的私有仓库

上一节我们讲了实战项目&#xff1a;docker部署springboot项目&#xff0c;我介绍了镜像的基本操作和镜像的原理以及如何利用docker部署springboot项目&#xff0c;那么有了镜像&#xff0c;我们应该如何更好地存储和分发镜像呢&#xff1f;答案就是今天的主角——Docker 的镜像…

如何能够系统的自学网络安全(黑客)?

一、自学网络安全学习的误区和陷阱 1.不要试图以编程为基础的学习开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键知识并不多 一…

ResultMap使用

要解决的问题&#xff1a;属性名和字段名不一致 1.1 查询为null问题 查看之前的数据库的字段名 Java中的实体类设计 public class User { private int id; //id private String name; //姓名 private String password; //密码和数据库不一样&#xff01; //构造 //set/get /…