• shell脚本小题狂练之循环(升级版)


     前言

    《道德经》第二十五章:“有物混成,先天地生。寂兮寥兮,独立不改,周行而不殆,可以为天下母。吾不知其名,字之曰道,强为之名曰大。大曰逝,逝曰远,远曰反。故,道大,天大,地大,人亦大。城中有四大,而人居其一焉。人法地,地法天,天法道,道法自然。” 

    内容预知

     小题一:随机生成密码

     小题二:将一个文件拆分两个或多个文件

     小题三:将十进制的IP地址转化为二进制的IP地址

     小题四:检测重要文件是否发生改变

     脚本需求

     假设/opt/test/ 目录中有多个重要文件,编写脚本使用 md5sum 命令一次性判别目录中的文件是否有发生过改动

     脚本设计思路

    脚本操作过程

     实验测试

     1. 在/opt目录下新创几个文件,并对其输入一些数据

    2. 执行自动生成校验码脚本 

     3. 修改/opt目录下的内容

    4. 启用文件检测脚本 

     小题五:购物商场的编写


     小题一:随机生成密码

    需求:编写能够自动生成一个6位随机密码的脚本 

    1. [root@localhost xunhuan2]#vim demo1.sh
    2. #!/bin/bash
    3. str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPKRSTUVWXYZ0123456789"
    4. for i in {1..6}
    5. do
    6. num=$[RANDOM%${#str}]
    7. key=${str:num:1}
    8. passwd=$key$passwd
    9. done
    10. echo "随机生成的六位数密码为:"$passwd

    测试结果:

     

     小题二:将一个文件拆分两个或多个文件

     需求:编写能够按照每100行分割文件的脚本,满一百行后,自动创建下一个文件进行保存

    1. [root@localhost xunhuan3]#vim demo1.sh
    2. IFS=$'\n'
    3. #定义a变量充当为行计数器
    4. a=0
    5. #定义b变量充当自动分配给文件的累加序号
    6. b=1
    7. #使用$()获取cat命令查看的文件内容
    8. for line in $( cat /xunhuan3/abc )
    9. do
    10. #每读一行,行计数器加一
    11. let a++
    12. #定义c变量来判断行数是否满足一百行
    13. c=$[a%100]
    14. #每满足一百行,b变量值加1,即会更换文件序号,后面再追加写入的内容会保存到新的文件当中
    15. if [ $c -eq 0 ];then
    16. echo $line >> /xunhuan3/test"$b".txt
    17. let b++
    18. else
    19. echo $line >>/xunhuan3/test"$b".txt
    20. fi
    21. done
    22. #还原默认分隔符
    23. IFS=$IFS_BAK

    分割文件abc的测试:

     

     小题三:将十进制的IP地址转化为二进制的IP地址

     需求:将一个点分十进制格式的IP地址转换成点分二进制格式

    1. #!/bin/bash
    2. read -p "请输入一个ip地址:" ip
    3. a=1
    4. b=0
    5. while [ $a -le 4 ]
    6. do
    7. #取IP地址的“.”前面的首字段
    8. num=${ip%%.*}
    9. for i in {1..8}
    10. do
    11. var=$[num % 2]
    12. sum=$var$sum
    13. num=$[num / 2]
    14. done
    15. #除去IP地址的首个字段,并将(除去首个字段的IP)重新赋值给变量
    16. ip=${ip#*.}
    17. let a++
    18. echo -n ${sum:0:8}
    19. let b++
    20. if [ $b -lt 4 ];then
    21. echo -n '.'
    22. else
    23. break
    24. fi
    25. done
    26. echo ""

    测试结果:

    进化版:

     

     小题四:检测重要文件是否发生改变

     知识拓展:在Linux中存在着一些重要文件,处于安全运维的着想,我们需要经常了解这些重要文件是否发生变动,来确保我们能在第一时间掌握!所以我们可以启用 md5sum 对重要文件提前做好校验对。到后面想验证文件是否变动,就可以再次对该文件生成校验码,然后进行比对,校验码发生改变,则该文件一定发生了改变。

     脚本需求

     假设/opt/test/ 目录中有多个重要文件,编写脚本使用 md5sum 命令一次性判别目录中的文件是否有发生过改动

     脚本设计思路

     针对需求,做出两个脚本。

    第一个脚本自动读取/opt 目录下的文件,并将其路径添加到一个新生成文件中,并且用循环为每一个文件生成md5校验码保存到md5.txt文件中

    第二个脚本:生成新的md5校验码,与之前的检验码进行比对,发生改变则输出该文件。

    脚本操作过程

    自动生成md5校验码的脚本 

    1. vim md5.sh
    2. #!/bin/bash
    3. ls /opt/* >/xunhuan2/jilu.txt
    4. cat /xunhuan2/jilu.txt|while read line
    5. do
    6. md5sum $line >>/xunhuan2/md5.txt
    7. done

    用来检查文件变动的脚本 

    1. vim md5test.sh
    2. #!/bin/bash
    3. cat /xunhuan2/jilu.txt|while read line
    4. do
    5. key1=$(cat /xunhuan2/md5.txt | grep "$line")
    6. key2=$(md5sum "$line" )
    7. if [ "$key1" = "$key2" ];then
    8. echo "$line 文件没有发生改变"
    9. else
    10. echo "$line 文件发生改变!"
    11. fi
    12. done

     

     实验测试

     1. 在/opt目录下新创几个文件,并对其输入一些数据

     

    2. 执行自动生成校验码脚本 

     

     3. 修改/opt目录下的内容

    4. 启用文件检测脚本 

     

    精炼版:

     小题五:购物商场的编写

      需求:编写一个逛商场选购商品脚本,每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),每次选购完或不买都会提示用户是否继续逛下一家商店,如果不再继续逛的话进行购物车结算总额。

    1. [root@localhost xunhuan2]#vim shoppingtest.sh
    2. #!/bin/bash
    3. a=0
    4. i=1
    5. sum=0
    6. while [ $a -eq 0 ]
    7. do
    8. echo "欢迎来到第 $i 家店"
    9. read -p "是否要进店选购?(yes/no)" DO
    10. while [ $DO = "yes" ]
    11. do
    12. echo "1:衣服¥500"
    13. echo "2:裤子¥400"
    14. echo "3:鞋子¥350"
    15. echo "4:帽子¥150"
    16. echo "5:袜子¥50"
    17. echo "6或其他:放弃选购"
    18. read -p "请选择你需要的商品序号:" num
    19. case $num in
    20. 1)
    21. echo "选购衣服成功"
    22. let sum+=500
    23. ;;
    24. 2)
    25. let sum+=400
    26. ;;
    27. 3)
    28. echo "选购鞋子成功"
    29. let sum+=350
    30. ;;
    31. 4)
    32. echo "选购帽子成功"
    33. let sum+=150
    34. ;;
    35. 5)
    36. echo "选购袜子成功"
    37. let sum+=50
    38. ;;
    39. *)
    40. echo "放弃购买"
    41. esac
    42. read -p "是否再继续选购(yes/no)" DO
    43. done
    44. read -p "是否继续逛下一个店家(yes/no)" GO
    45. if [ $GO = "yes" ];then
    46. let i++
    47. else
    48. echo "您一共逛了 ${i} 家商店"
    49. echo "您一共消费了${sum} 元 "
    50. break
    51. fi
    52. done

     

     测试结果:

  • 相关阅读:
    Python网络爬虫项目开发实战:怎么解决表单交互
    你评论,我赠书~【TFS-CLUB社区 第8期赠书活动】〖Python从入门到精通(微课精编版)〗等你来拿
    springbooy+求职招聘网站 毕业设计-附源码301914
    GBase8s数据库SET Database Object Mode 语句
    CSS基础-嵌套规范(拓展),居中方法,CSS 特性
    Day743.CPU结构影响Redis的性能问题 -Redis 核心技术与实战
    Springboot 使用 Dubbo3 并以 zookeeper 为注册中心
    王道 第三章数据链路层
    Leetcode Hot 100之四:283. 移动零+11. 盛最多水的容器
    机器学习第8天:SVM分类
  • 原文地址:https://blog.csdn.net/qq_62462797/article/details/126584788