ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

『忘了再学』Shell流程控制 — 37、for循环应用与练习

2022-06-22 13:32:57  阅读:151  来源: 互联网

标签:test1 再学 ip 37 sh Shell txt root 255


目录

1、应用:判断合法IP地址脚本

准备:ip.txt文件中存放着一些IP地址,我们用脚本来判断其中的合法IP地址。

[root@localhost sh]# cat ip.txt
192.168.1.200
202.106.0.20
300.36.190.5
222222222222
192.168.1.300
200.2.2
192.168.100.100

方式一:

#/bin/bash 

# 先通过正则,进行粗过滤。
# 把明显不符合规则的ip过滤掉,把初步符合的结果保存在ip_test1.txt临时文件中,
# 粗过滤0-999的1到3位数。
grep "^[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}$"	/root/sh/ip.txt>/root/sh/ip_test1.txt


# 创建一个ip_test.txt文件,用于保存最终合法的IP地址
# 下面这条命令是创建并清空一个文件,
# 也就是如果存在ip_test.txt文件,就清空,没有则创建。
echo "" > /root/sh/ip_test.txt

# 开始对每一个IP地址的合法性进行判断
for i in $(cat /root/sh/ip_test1.txt)
    do
        # 1.分别把IP地址的四个数值分别读入变量a,b,c,d
        a=$(echo "$i" | cut -d "." -f 1)
        b=$(echo "$i" | cut -d "." -f 2)
        c=$(echo "$i" | cut -d "." -f 3)
        d=$(echo "$i" | cut -d "." -f 4)

        # 2.依次判断四个IP数值是否超出范围,如果超出,退出本次循环。
        # ip中的每一个字段是否在0-255之间。
        # 第一个字段是1-255之间。
        # 如果第一个数值小于1或大于255.
        if [ "$a" -lt 1 -o "$a" -gt 255 ]
            then
                # 则退出本次循环
                continue

        fi

        # 如果第二个数值小于0或大于255.
        if [ "$b" -lt 0 -o "$b" -gt 255 ]
            then
                # 则退出本次循环
                continue

        fi

        # 如果第三个数值小于0或大于255.
        if [ "$c" -lt 0 -o "$c" -gt 255 ]
            then
                # 则退出本次循环
                continue

        fi

        # 如果第四个数值小于0或大于255.
        if [ "$d" -lt 0 -o "$d" -gt 255 ]
            then
                # 则退出本次循环
                continue

        fi

        # 3.把合法IP地址写入/root/sh/ip_test.txt文件。
        echo "$i" >> /root/sh/ip_test.txt

    done

# 删除临时文件
rm -rf /root/sh/ip_test1.txt

方式二:

#/bin/bash 

# 先通过正则,粗过滤。
# 把明显不符合规则的ip过滤,把符合的结果保存在ip_test1.txt临时文件中
# 粗过滤,过滤0-999的1到3位数
grep "^[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}$"	/root/sh/ip.txt>/root/sh/ip_test1.txt

# 统计ip_test1.txt文件中有几个IP。
# 为什么还要执行awk '{print $1}'命令:
# 因为wc -l命令执行完后统计结果出来后,还会跟有该文件的文件名如果:
# [root@localhost sh]# wc -l /root/sh/ip_test1.txt
# 8 ip.txt
# 所以要通过awk命令截取第一列数据。
line=$(wc -l /root/sh/ip_test1.txt | awk '{print $1}')

# 提示:用 line=$(cat /root/sh/ip_test1.txt | wc -l)的方式写,
# 就不需要用awk命令截取第一列数据了。


# 创建一个ip_test.txt文件,用于保存最终合法的IP地址
# 下面这条命令是创建并清空一个文件,
# 也就是如果存在ip_test.txt文件,就清空,没有则创建。
echo "" > /root/sh/ip_test.txt

# 对每一个IP地址的合法性进行判断
# 有几行IP,循环几次
for(( i=1 ; i<=$line ; i=i+1 ))
    do
        # 1.先分别获取到IP地址的四个数字
        # 第几次循环,就把第几行读入ip_test2.txt文件(此文件中只有一行IP)
        cat /root/sh/ip_test1.txt | awk 'NR=='$i'{print}' >/root/sh/ip_test2.txt

        # 分别把IP地址的四个数值分别读入变量a,b,c,d
        a=$(cat /root/sh/ip_test2.txt|cut -d '.' -f 1)
        b=$(cat /root/sh/ip_test2.txt|cut -d '.' -f 2)
        c=$(cat /root/sh/ip_test2.txt|cut -d '.' -f 3)
        d=$(cat /root/sh/ip_test2.txt|cut -d '.' -f 4)

        # 2.依次判断四个IP数值是否超出范围,如果超出,退出本次循环。
        # ip中的每一个字段是否在0-255之间。
        # 第一个字段是1-255之间。
        # 如果第一个数值小于1或大于255.
        if [ "$a" -lt 1 -o "$a" -gt 255 ]
           then
                # 则退出本次循环
                continue

        fi

        # 如果第二个数值小于0或大于255.
        if [ "$b" -lt 0 -o "$b" -gt 255 ]
            then
                # 则退出本次循环
            continue

        fi

        # 如果第三个数值小于0或大于255.
        if [ "$c" -lt 0 -o "$c" -gt 255 ]
            then
                # 则退出本次循环
                continue

        fi

        # 如果第四个数值小于0或大于255.
        if [ "$d" -lt 0 -o "$d" -gt 255 ]
            then
                # 则退出本次循环
                continue

        fi


        # 3.如果四个IP数值都符合要求,则把合法IP记录在ip_test.txt文件中。
        cat /root/sh/ip_test2.txt>>/root/sh/ip_test.txt

    done

# 删除临时文件
rm -rf /root/sh/ip_test1.txt
rm -rf /root/sh/ip_test2.txt

总结:

还是方式一的for循环格式书写脚本比较方便。

2、应用:批量添加指定数量的用户

Shell脚本批量添加的用户必须是有规律的,如user1user2user3等以此类推。

但是你不能批量添加如张三、李四、王二麻子等这样无规律的用户名称。

# 创建脚本文件useradd.sh
[root@localhost ~]# vim useradd.sh


# 批量添加指定数量的用户
# 开始编写脚本文件

#!/bin/bash

# 1.接收三个输入信息
# 1.1让用户输入用户名,把输入保存到变量name
read -p "Please input user name:" -t 30 name

# 1.2让用户输入添加用户的数量,把输入保存到变量num
# 用户前缀一样,后缀数字递增。
read -p "Please input the number of users:" -t 30 num

# 1.3让用户输入初始密码,把输入保存到变量pass
# 统一密码。
read -p "Please input the password of users:" -t 30 pass

# 2.进行添加用户
# 2.1判断三个变量不为空
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
    then
        # 2.2判断$num是否为纯数字
        y=$(echo $num | sed 's/[0-9]//g')


        # 说明:
        # 就是通过sed命令,把变量num值中的每一个字符,只要是0-9的内容,就替换为空。
        # 最后如果y的值最后为空,证明num变量中的内容全部为数字,因为全部被替换了。
        # 如果y的值最后不为空,证明num变量中的内容有非数字,即num非纯数字。


        # 如果变量y的值为空,证明num变量是数字
        if [ -z "$y" ]
            then
                # 2.3循环num变量指定的次数,添加用户
                for((i=1;i<=$num;i=i+1))
                    do
                        # 2.3.1添加用户,用户名为变量name的值加变量i的数字
                        /usr/sbin/useradd $name$i &>/dev/null
                        # 2.3.2给用户设定初始密码为变量pass的值
                        echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
                        # 2.3.3强制用户登录之后修改密码
                        chage -d 0 $name$i &>/dev/null

                    done
        fi
fi

3、应用:批量删除用户

需求:删除系统中所有的普通用户。

# 创建脚本文件userdel.sh
[root@localhost ~]# vim sh/userdel.sh

# 批量删除普通用户
# 开始编写脚本文件

#!/bin/bash

# 1.获取所有普通用户的用户名
# 读取用户信息文件,提取可以登录用户,
# 取消root用户,截取第一列用户名
user=$(cat /etc/passwd | grep "/bin/bash" | grep -v "root" | cut -d ":" -f 1)

# 2.删除普通用户
# 执行循环,有多少个普通用户,循环多少次
for i in $user
    do
        #每次循环,删除指定普通用户
        userdel -r $i &>/dev/null
    done

标签:test1,再学,ip,37,sh,Shell,txt,root,255
来源: https://www.cnblogs.com/liuyuelinfighting/p/16400143.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有