• Shell脚本练习题(附详细解题过程)


    目录

    一、利用for循环打印99乘法表 

    二、十进制转二进制 

    三、将十进制ip地址转换为二进制格式

    四、检测某个网段中存活的主机并输出其ip地址

    五、检查文件中用户名是否存在并提示创建用户和设置密码

    六、检查httpd服务并开启

    七、根据百米赛跑成绩判断结果

    八、随机数实现猜数字游戏

    九、随机数生成6位随机密码

    十、查看$PATH指定目录下的可执行文件 


    一、利用for循环打印99乘法表 

    1. [root@localhost2 ~]#vim chengfabiao.sh
    2. #!/bin/bash
    3. for ((i=1;i<=9;i++))
    4. do
    5. for ((j=1;j<=i;j++))
    6. do
    7. m=$[ $i * $j ] #乘积值赋给m
    8. echo -ne "$i*$j=${m} " #指定输出样式
    9. done
    10. echo -e '\n' #每行输出完后换行
    11. done
    12. [root@localhost2 ~]#bash chengfabiao.sh
    13. 1*1=1
    14. 2*1=2 2*2=4
    15. 3*1=3 3*2=6 3*3=9
    16. 4*1=4 4*2=8 4*3=12 4*4=16
    17. 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
    18. 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
    19. 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
    20. 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
    21. 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

    二、十进制转二进制 

    1. [root@localhost2 ~]#vim numchange.sh
    2. #依次减数法
    3. #!/bin/bash
    4. read -p "请输入一个0~255的整数:" num
    5. for i in 128 64 32 16 8 4 2 1
    6. do
    7. NUM=$[num - i]
    8. if [ $NUM -lt 0 ];then
    9. echo -n 0
    10. else
    11. echo -n 1
    12. num=$[num - i]
    13. fi
    14. done
    15. echo ""
    16. #取余倒排法
    17. #!/bin/bash
    18. sum=''
    19. read -p "请输入一个0~255的整数:" num
    20. for i in {1..8}
    21. do
    22. NUM=$[num % 2]
    23. sum=$NUM$sum
    24. let num/=2
    25. done
    26. echo $sum
    27. [root@localhost2 ~]#bash numchange.sh
    28. 请输入一个0~255的整数:231
    29. 11100111
    30. [root@localhost2 ~]#bash numchange.sh
    31. 请输入一个0~255的整数:54
    32. 00110110
    33. [root@localhost2 ~]#bash numchange.sh
    34. 请输入一个0~255的整数:83
    35. 01010011

    三、将十进制ip地址转换为二进制格式

    1. [root@localhost2 ~]#vim changeip.sh
    2. #!/bin/bash
    3. read -p "请输入您的ip地址:" ip
    4. b=0
    5. IFSb=$IFS
    6. IFS=$IFS'.' #为$IFS添加字段分隔符'.'
    7. for i in `echo $ip`
    8. do
    9. for a in 128 64 32 16 8 4 2 1 #依次减数法将十进制转二进制
    10. do
    11. NUM=$[$i - $a]
    12. if [ $NUM -lt 0 ];then
    13. echo -n 0
    14. else
    15. echo -n 1
    16. i=$[$i - $a]
    17. fi
    18. done
    19. let b++
    20. if [ $b -eq 4 ];then #第四次循环不输出'.',否则格式不对
    21. break
    22. fi
    23. echo -n '.'
    24. done
    25. echo " "
    26. [root@localhost2 ~]#bash changeip.sh
    27. 请输入您的ip地址:192.156.34.166
    28. 11000000.10011100.00100010.10100110
    29. [root@localhost2 ~]#bash changeip.sh
    30. 请输入您的ip地址:192.168.13.11
    31. 11000000.10101000.00001101.00001011

    四、检测某个网段中存活的主机并输出其ip地址

    1. [root@localhost2 ~]#vim checkalivedhosts.sh
    2. #!/bin/bash
    3. for ip in 192.168.116.{1..254} #指定ip范围
    4. do
    5. {
    6. ping -c 3 -i 0.5 -w 2 $ip &> /dev/null #每0.5秒ping目标主机3个包
    7. if [ $? -eq 0 ];then -- 判断上条命令执行结果
    8. echo "$ip is online" > /root/alive_hosts.txt #执行成功将在线的主机名重定向输入文件
    9. else
    10. echo "$ip is outline"
    11. fi
    12. }& #将命令程序段放入后台执行(实现多线程,加快执行效率)
    13. done
    14. wait
    15. echo "存活主机统计:"
    16. cat /root/alive_hosts.txt #将存活主机ip统计显示出来
    17. [root@localhost2 ~]#bash checkalivedhosts.sh
    18. 192.168.116.14 is outline 192.168.116.3 is outline 192.168.116.5 is outline
    19. 192.168.116.11 is outline 192.168.116.7 is outline 192.168.116.6 is outline
    20. 192.168.116.10 is outline 192.168.116.15 is outline 192.168.116.9 is outline
    21. 192.168.116.17 is outline 192.168.116.18 is outline 192.168.116.16 is outline
    22. 192.168.116.19 is outline 192.168.116.4 is outline 192.168.116.21 is outline
    23. ... #输出结果太多,这里省略
    24. 192.168.116.242 is outline 192.168.116.241 is outline 192.168.116.243 is outline
    25. 192.168.116.244 is outline 192.168.116.245 is outline 192.168.116.247 is outline
    26. 192.168.116.246 is outline 192.168.116.248 is outline 192.168.116.249 is outline
    27. 192.168.116.251 is outline 192.168.116.252 is outline 192.168.116.250 is outline
    28. 192.168.116.254 is outline 192.168.116.253 is outline
    29. 存活主机统计:
    30. 192.168.116.20 is online

    五、检查文件中用户名是否存在并提示创建用户和设置密码

    1. #创建 users.txt 用户列表文件
    2. [root@localhost1 ~]#cd /data
    3. [root@localhost1 data]#vim users.txt
    4. #需要创建的用户列表
    5. zhangsan
    6. lisi
    7. wangwu
    8. zhaoliu
    9. qianqi
    10. zhuba
    11. #编写 checkuser.sh 脚本
    12. [root@localhost1 data]#vim checkuser.sh
    13. #!/bin/bash
    14. #用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码;若该用户不存在,则建立用户并提示用户设置密码
    15. for user in `cat /data/users.txt` #指定循环范围(用户列表文件users.txt)
    16. do
    17. grep "^$user" /etc/passwd &> /dev/null #判断用户是否存在
    18. if [ $? -eq 0 ];then #用户存在
    19. echo "用户${user}已存在!"
    20. #检查存在的用户密码是否为空
    21. checkpd=`cat /etc/shadow | grep "^${user}" | awk -F: '{print $2}'`
    22. if [ $checkpd = "!!" ] || [ -z ${checkpd} ];then #存在用户密码为空
    23. while true #一直循环提示用户输入密码
    24. do
    25. read -p "用户${user}尚未输入密码,请创建密码:" passwd1
    26. read -p "再次输入确认密码:" passwd2
    27. if [ ${passwd1} = ${passwd2} ];then #只有当两次密码相同时,设置密码并退出循环
    28. echo ${passwd1} | passwd --stdin $user
    29. break
    30. fi
    31. done
    32. fi
    33. else #用户不存在
    34. useradd ${user} #创建用户
    35. echo "用户${user}不存在,已为您创建${user}!"
    36. while true #一直循环提示用户输入密码
    37. do
    38. read -p "用户${user}尚未输入密码,请创建密码:" passwd3
    39. read -p "再次输入确认密码:" passwd4
    40. if [ ${passwd3} = ${passwd4} ];then #只有当两次密码相同时,设置密码并退出循环
    41. echo ${passwd3} | passwd --stdin $user
    42. break
    43. fi
    44. done
    45. fi
    46. done
    47. #测试 checkuser.sh
    48. [root@localhost1 data]#bash checkuser.sh
    49. #zhangsan存在且有密码
    50. 用户zhangsan已存在!
    51. #lisi存在但无密码,需要设置
    52. 用户lisi已存在!
    53. 用户lisi尚未输入密码,请创建密码:123123
    54. 再次输入确认密码:123123
    55. 更改用户 lisi 的密码 。
    56. passwd:所有的身份验证令牌已经成功更新。
    57. #wangwu存在但无密码,需要设置
    58. 用户wangwu已存在!
    59. 用户wangwu尚未输入密码,请创建密码:123123
    60. 再次输入确认密码:123123
    61. 更改用户 wangwu 的密码 。
    62. passwd:所有的身份验证令牌已经成功更新。
    63. #zhaoliu存在且有密码
    64. 用户zhaoliu已存在!
    65. #qianqi不存在且无密码,需要设置
    66. 用户qianqi不存在,已为您创建qianqi!
    67. 用户qianqi尚未输入密码,请创建密码:123123
    68. 再次输入确认密码:123123
    69. 更改用户 qianqi 的密码 。
    70. passwd:所有的身份验证令牌已经成功更新。
    71. #zhuba不存在且无密码,需要设置
    72. 用户zhuba不存在,已为您创建zhuba!
    73. 用户zhuba尚未输入密码,请创建密码:123123
    74. 再次输入确认密码:123123
    75. 更改用户 zhuba 的密码 。
    76. passwd:所有的身份验证令牌已经成功更新。

    六、检查httpd服务并开启

    1. [root@localhost1 ~]#vim checkhttpd.sh
    2. #!/bin/bash
    3. systemctl is-active httpd &> /dev/null #判断httpd服务是否开启
    4. if [ $? -eq 0 ];then
    5. echo 'httpd is active!' #如果开启输出已开启
    6. else #如果未开启进行如下操作
    7. rpm -q httpd &> /dev/null #检查httpd是否下载
    8. if [ $? -ne 0 ];then #如果未下载,进行以下操作
    9. yum -y install httpd &> /dev/null #联网且有在线源可直接下载,如果不行,进行以下操作
    10. df -hT | grep /dev/sr0 &> /dev/null #检查光盘是否挂载
    11. if [ $? -ne 0 ];then
    12. mount /dev/sr0 /mnt &>/dev/null #未挂载则挂载
    13. fi
    14. yum -y install httpd &> /dev/null #本地镜像源下载(需要有本地yum源配置文件)
    15. fi
    16. systemctl start httpd &> /dev/null #启动httpd服务
    17. echo 'httpd is starting...'
    18. if systemctl is-active httpd &> /dev/null #再次判断httpd服务是否开启
    19. then
    20. echo 'httpd was stated succesfully!' #如果开启输出启动成功
    21. else
    22. echo 'fail to start httpd!' #如果关闭输出启动失败
    23. fi
    24. fi
    25. [root@localhost1 ~]#bash checkhttpd.sh
    26. httpd is starting...
    27. httpd was stated succesfully!

    七、根据百米赛跑成绩判断结果

    1. [root@localhost1 ~]#vim judgerace.sh
    2. #!/bin/bash
    3. #提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;
    4. #进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
    5. read -p "请输入您的100米赛跑成绩(s):" time
    6. if [ $time -gt 0 -a $time -le 10 ] ;then
    7. echo "恭喜您,进入选拔赛!"
    8. read -p "请输入您的性别(男/女):" sex
    9. case $sex in
    10. 男)
    11. echo "请您进入男生组!"
    12. ;;
    13. 女)
    14. echo "请你进入女生组!"
    15. ;;
    16. *)
    17. echo "输入有误,请重新输入!"
    18. ;;
    19. esac
    20. elif [ $time -gt 10 ];then
    21. echo "很遗憾,您没有进入选拔赛!"
    22. else
    23. echo "输入有误,请重新输入!"
    24. fi
    25. [root@localhost1 ~]#bash judgerace.sh
    26. 请输入您的100米赛跑成绩(s):8
    27. 恭喜您,进入选拔赛!
    28. 请输入您的性别(男/女):男
    29. 请您进入男生组!

    八、随机数实现猜数字游戏

    1. [root@localhost1 data]#bash guessprice.sh
    2. #!/bin/bash
    3. #获取0~999的随机数
    4. num=$[RANDOM % 1000]
    5. i=1 #定义i为循环条件
    6. a=0 #定义a为猜测次数变量
    7. while [ $i -eq 1 ]
    8. do
    9. read -p "请输入你猜测的价格(0~999):" price
    10. if [ $price -eq $num ];then
    11. echo "恭喜你猜对了!"
    12. let a++
    13. let i+=1
    14. elif [ $price -gt $num ];then
    15. echo "你猜高了,请继续!"
    16. let a++
    17. elif [ $price -lt $num ];then
    18. echo "你猜低了,请继续!"
    19. let a++
    20. fi
    21. done
    22. echo "你一共猜了${a}次。"
    23. [root@localhost1 data]#bash guessprice.sh
    24. 请输入你猜测的价格(0~999):600
    25. 你猜高了,请继续!
    26. 请输入你猜测的价格(0~999):400
    27. 你猜高了,请继续!
    28. 请输入你猜测的价格(0~999):200
    29. 你猜高了,请继续!
    30. 请输入你猜测的价格(0~999):100
    31. 你猜低了,请继续!
    32. 请输入你猜测的价格(0~999):150
    33. 你猜高了,请继续!
    34. 请输入你猜测的价格(0~999):120
    35. 你猜低了,请继续!
    36. 请输入你猜测的价格(0~999):134
    37. 你猜低了,请继续!
    38. 请输入你猜测的价格(0~999):140
    39. 你猜高了,请继续!
    40. 请输入你猜测的价格(0~999):135
    41. 你猜低了,请继续!
    42. 请输入你猜测的价格(0~999):137
    43. 你猜高了,请继续!
    44. 请输入你猜测的价格(0~999):136
    45. 恭喜你猜对了!
    46. 你一共猜了11次。

    九、随机数生成6位随机密码

    1. [root@localhost1 data]#vim randompasswd.sh
    2. #!/bin/bash
    3. #指定随机字符的范围
    4. STR="ABCDRFGHIJKLMNOPQRSTUVWXTZabcdrfghijklmnopqrstuvwxtz0123456789"
    5. sum=''
    6. for ((i=1; i<=6; i++)) #指定循环6次(实现输出6位字符)
    7. do
    8. length=${#STR} #获取字符范围的长度
    9. num=$[RANDOM % length] #在指定长度中生成随机数(作为取字符的索引)
    10. value=${STR:num:1} #截取指定索引字符
    11. sum+=$value #字符追加到sum变量中
    12. done
    13. echo $sum #输出$sum(即6位随机密码)
    14. [root@localhost1 data]#bash randompasswd.sh
    15. 3qCkpA
    16. [root@localhost1 data]#bash randompasswd.sh
    17. CtdDOG
    18. [root@localhost1 data]#bash randompasswd.sh
    19. nTuF0G

    十、查看$PATH指定目录下的可执行文件 

    1. [root@localhost2 ~]#vim findxfile.sh
    2. #!/bin/bash
    3. IFSb=$IFS
    4. IFS=$IFS':' #为$IFS添加字符分隔符'.'
    5. for i in `echo $PATH`
    6. do
    7. echo ---------${i}---------- #每个文件用此条分割
    8. find $i -type f -a -executable #查找可执行文件
    9. done
    10. [root@localhost2 ~]#bash findxfile.sh
    11. ---------/usr/local/bin----------
    12. ---------/usr/local/sbin----------
    13. ---------/usr/bin----------
    14. /usr/bin/cpio
    15. /usr/bin/less
    16. /usr/bin/catchsegv
    17. /usr/bin/gencat
    18. /usr/bin/getent
    19. /usr/bin/plistutil
    20. ... #文件太多这里省略
  • 相关阅读:
    node.js--web开发框架fastify介绍
    真正靠谱的手机清理APP与方法,轻松帮你干掉几个G垃圾!
    (论文阅读51-57)图像描述3 53
    【ARM】MDK自动备份源文件
    如何快速搭建一个大模型?简单的UI实现
    吐血总结!50道Python面试题集锦
    使用llama.cpp实现LLM大模型的格式转换、量化、推理、部署
    数据库并发问题及四种隔离级别
    SpringBoot整合Thymeleaf
    CompletableFuture-链式语法和join方法介绍
  • 原文地址:https://blog.csdn.net/weixin_58544496/article/details/126538570