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

news2024/10/7 17:36:49

目录

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

二、十进制转二进制

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

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

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

六、检查httpd服务并开启

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

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

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

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


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

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

二、十进制转二进制

[root@localhost2 ~]#vim numchange.sh
#依次减数法
#!/bin/bash
read -p "请输入一个0~255的整数:" num
for i in 128 64 32 16 8 4 2 1
do
  NUM=$[num - i]
  if [ $NUM -lt 0 ];then
    echo -n 0
  else
    echo -n 1
    num=$[num - i]
  fi
done
echo ""
​
#取余倒排法
#!/bin/bash
sum=''
read -p "请输入一个0~255的整数:" num
for i in {1..8}
do
  NUM=$[num % 2]
  sum=$NUM$sum
  let num/=2
​
done
echo $sum
​
[root@localhost2 ~]#bash numchange.sh 
请输入一个0~255的整数:231
11100111
[root@localhost2 ~]#bash numchange.sh 
请输入一个0~255的整数:54 
00110110
[root@localhost2 ~]#bash numchange.sh 
请输入一个0~255的整数:83 
01010011

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

[root@localhost2 ~]#vim changeip.sh 
#!/bin/bash
read -p "请输入您的ip地址:" ip
b=0
IFSb=$IFS
IFS=$IFS'.'     #为$IFS添加字段分隔符'.'
for i in `echo $ip`
do
  for a in 128 64 32 16 8 4 2 1    #依次减数法将十进制转二进制
  do
    NUM=$[$i - $a]
    if [ $NUM -lt 0 ];then
      echo -n 0
    else
      echo -n 1
      i=$[$i - $a]
    fi
  done
  let b++
  if [ $b -eq 4 ];then    #第四次循环不输出'.',否则格式不对
    break
  fi
  echo -n '.'
done
echo " "
​
[root@localhost2 ~]#bash changeip.sh 
请输入您的ip地址:192.156.34.166
11000000.10011100.00100010.10100110 
​
[root@localhost2 ~]#bash changeip.sh 
请输入您的ip地址:192.168.13.11
11000000.10101000.00001101.00001011 

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

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

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

#创建 users.txt 用户列表文件
[root@localhost1 ~]#cd /data
[root@localhost1 data]#vim users.txt
#需要创建的用户列表
zhangsan
lisi
wangwu
zhaoliu
qianqi
zhuba
​
#编写 checkuser.sh 脚本
[root@localhost1 data]#vim checkuser.sh
#!/bin/bash
#用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码;若该用户不存在,则建立用户并提示用户设置密码
​
for user in `cat /data/users.txt`     #指定循环范围(用户列表文件users.txt)
do
  grep "^$user" /etc/passwd &> /dev/null  #判断用户是否存在
  if [ $? -eq 0 ];then     #用户存在
    echo "用户${user}已存在!"
​
    #检查存在的用户密码是否为空
    checkpd=`cat /etc/shadow | grep "^${user}" | awk -F: '{print $2}'`
    if [ $checkpd = "!!" ] || [ -z ${checkpd} ];then  #存在用户密码为空
    while true  #一直循环提示用户输入密码
    do
      read -p "用户${user}尚未输入密码,请创建密码:" passwd1
      read -p "再次输入确认密码:" passwd2
      if [ ${passwd1} = ${passwd2} ];then    #只有当两次密码相同时,设置密码并退出循环
        echo ${passwd1} | passwd --stdin $user
        break
      fi
    done
    fi
  else  #用户不存在
    useradd ${user}  #创建用户
    echo "用户${user}不存在,已为您创建${user}!"
    while true    #一直循环提示用户输入密码
    do
      read -p "用户${user}尚未输入密码,请创建密码:" passwd3
      read -p "再次输入确认密码:" passwd4
      if [ ${passwd3} = ${passwd4} ];then    #只有当两次密码相同时,设置密码并退出循环
        echo ${passwd3} | passwd --stdin $user
        break
      fi
    done
  fi
done
​
#测试 checkuser.sh
[root@localhost1 data]#bash checkuser.sh
#zhangsan存在且有密码
用户zhangsan已存在!
​
#lisi存在但无密码,需要设置
用户lisi已存在!
用户lisi尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
​
#wangwu存在但无密码,需要设置
用户wangwu已存在!
用户wangwu尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 wangwu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
​
#zhaoliu存在且有密码
用户zhaoliu已存在!
​
#qianqi不存在且无密码,需要设置
用户qianqi不存在,已为您创建qianqi!
用户qianqi尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 qianqi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
​
#zhuba不存在且无密码,需要设置
用户zhuba不存在,已为您创建zhuba!
用户zhuba尚未输入密码,请创建密码:123123
再次输入确认密码:123123
更改用户 zhuba 的密码 。
passwd:所有的身份验证令牌已经成功更新。

六、检查httpd服务并开启

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

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

​
[root@localhost1 ~]#vim judgerace.sh
#!/bin/bash
#提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;
#进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
​
read -p "请输入您的100米赛跑成绩(s):" time
if [ $time -gt 0 -a $time -le 10 ] ;then
  echo "恭喜您,进入选拔赛!"
  read -p "请输入您的性别(男/女):" sex
    case $sex in
    男)
      echo "请您进入男生组!"
      ;;
    女)
      echo "请你进入女生组!"
      ;;
    *)
      echo "输入有误,请重新输入!"
      ;;
    esac
elif [ $time -gt 10 ];then
  echo "很遗憾,您没有进入选拔赛!"
else
  echo "输入有误,请重新输入!"
fi
​
[root@localhost1 ~]#bash judgerace.sh
请输入您的100米赛跑成绩(s):8
恭喜您,进入选拔赛!
请输入您的性别(男/女):男
请您进入男生组!


​

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

​
[root@localhost1 data]#bash guessprice.sh
#!/bin/bash
#获取0~999的随机数
num=$[RANDOM % 1000]
i=1 #定义i为循环条件
a=0 #定义a为猜测次数变量
while [ $i -eq 1 ]
do
read -p "请输入你猜测的价格(0~999):" price
  if [ $price -eq $num ];then
    echo "恭喜你猜对了!"
    let a++
    let i+=1
  elif [ $price -gt $num ];then
    echo "你猜高了,请继续!"
    let a++
  elif [ $price -lt $num ];then
    echo "你猜低了,请继续!"
    let a++
  fi
done
echo "你一共猜了${a}次。"
​
[root@localhost1 data]#bash guessprice.sh
请输入你猜测的价格(0~999):600
你猜高了,请继续!
请输入你猜测的价格(0~999):400
你猜高了,请继续!
请输入你猜测的价格(0~999):200
你猜高了,请继续!
请输入你猜测的价格(0~999):100
你猜低了,请继续!
请输入你猜测的价格(0~999):150
你猜高了,请继续!
请输入你猜测的价格(0~999):120
你猜低了,请继续!
请输入你猜测的价格(0~999):134
你猜低了,请继续!
请输入你猜测的价格(0~999):140
你猜高了,请继续!
请输入你猜测的价格(0~999):135
你猜低了,请继续!
请输入你猜测的价格(0~999):137
你猜高了,请继续!
请输入你猜测的价格(0~999):136
恭喜你猜对了!
你一共猜了11次。


​

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

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


​

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

​
[root@localhost2 ~]#vim findxfile.sh 
#!/bin/bash
IFSb=$IFS
IFS=$IFS':'    #为$IFS添加字符分隔符'.'
for i in `echo $PATH`
do
  echo ---------${i}----------    #每个文件用此条分割
  find $i -type f -a -executable    #查找可执行文件
done
​
[root@localhost2 ~]#bash findxfile.sh 
---------/usr/local/bin----------
---------/usr/local/sbin----------
---------/usr/bin----------
/usr/bin/cpio
/usr/bin/less
/usr/bin/catchsegv
/usr/bin/gencat
/usr/bin/getent
/usr/bin/plistutil
...    #文件太多这里省略


​

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

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

相关文章

栈和队列(数据结构刷题)[一]-python

文章目录 前言一、原理介绍二、用栈实现队列1.操作2.思路 三、关于面试考察栈里面的元素在内存中是连续分布的么&#xff1f; 前言 提到栈和队列&#xff0c;大家可能对它们的了解只停留在表面&#xff0c;再深入一点&#xff0c;好像知道又好像不知道的感觉。本文我将从底层实…

Django----------模板、静态文件、案例(城市天气预报)、请求和响应

目录 1.templates模板 2.静态文件 1.static目录 2.引用静态文件 1.方式一&#xff1a;直接引用 2.方式二&#xff1a;头部及内部引用 3. 模板语法 1.取内容 2.取下标 3.for循环 4.利用字典 5.列表里套字典 6.if条件语句 7.总结 4.案例&#xff08;城市天气预…

CH573-01-GPIO-LED——RISC-V内核BLE MCU快速开发教程

1. 新建工程 1) NEW Project 点击“File->New->MounRiver Project”&#xff1a; 2) finish 选择CH573F的裸机开发工程模板&#xff0c;如下图&#xff0c;然后点击“finish” 3) 编译检查 4) 精简代码 打开工程目录下的./src/main.c文件&#xff0c;修改删掉生成的串口测…

动态规划III (买股票-121、122、123、188)

CP121 买股票的最佳时机 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利…

Vue 中的几种动画效果

Vue 中的动画效果 在 Vue 中&#xff0c;动画效果是非常常见的交互方式。它可以为用户提供更加生动的交互体验&#xff0c;增强用户的参与感和满意度。在本文中&#xff0c;我们将探讨 Vue 中的动画效果的基本原理和用法&#xff0c;并给出一些实例代码来帮助读者更好地理解。…

『手撕 Mybatis 源码』06 - Mapper 代理方式初始化

Mapper 代理方式初始化 首先修改一下 SqlSession 获取代理对象方式&#xff0c;即通过 getMapper() 来拿到动态代理对象 public class MybatisTest {/*** 问题1&#xff1a;<package name"com.itheima.mapper"/> 是如何进行解析的&#xff1f;* 解答&#xf…

算法刷题-数组-有序数组的平方

977.有序数组的平方 力扣题目链接 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#…

clang到底是什么?gcc和clang到底有什么区别?

最近发现自己对 GNU GCC 和 Clang 的区别不太清楚&#xff0c;影响到一些实现和学习&#xff0c;所以趁这两天有空好好研究了一下。 在这个研究过程中&#xff0c;我发现很多问题其实源自于语言&#xff08;不是指编程语言&#xff0c;而是中文和英文翻译的失真&#xff09;和…

前端前端学习不断

卷吧卷吧...&#xff0c;这东西什么时候是个头啊……

智能指针(2)

智能指针&#xff08;2&#xff09; shared_ptr(共享型智能指针)基础知识特点引用计数器共享型智能指针结构理解 shared_ptr仿写删除器类计数器类shared_ptr类使用以及仿写代码的理解 循环引用_Weaks 初始化智能指针的方法 shared_ptr(共享型智能指针) 基础知识 在java中有一…

chatgpt赋能python:Python如何判断输入的字符——基础教程与实例

Python如何判断输入的字符——基础教程与实例 时至今日&#xff0c;互联网已经成为人们获取信息的重要途径&#xff0c;而搜索引擎优化&#xff08;SEO&#xff09;则是网站重要的推广手段之一。而Python作为一种高级编程语言&#xff0c;在实现SEO时也有很大的优势&#xff0…

chatgpt赋能python:Python如何进行升序和降序排列

Python如何进行升序和降序排列 Python是一种非常流行的编程语言&#xff0c;由于其在数据科学、机器学习和人工智能等领域的强大表现&#xff0c;越来越多的人开始学习和使用Python。在Python中&#xff0c;排序是一项非常常见的操作。在这篇文章中&#xff0c;我将向您介绍如…

stable diffusion webui 登录接口(login)api接口调用(使用C#)

唠嗑 本次将跟读者讲一下如何通过C#请求sd webui api【login】接口&#xff0c;如果读者觉得文章有用&#xff0c;请给【点个赞】吧&#xff0c;有问题可以评论区提问。 实战 1.配置api启用参数 启动webui时&#xff0c;需加上【–api】 、【–api-auth 账号:密码】 和【–…

chatgpt赋能python:Python字符类型判断:如何判断字符是字母或数字

Python字符类型判断&#xff1a;如何判断字符是字母或数字 在Python编程中&#xff0c;经常需要判断一个字符是字母还是数字。本文将介绍如何在Python中判断字符类型&#xff0c;并给出几个示例。 判断字符类型的方法 在Python中&#xff0c;可以使用以下方法来判断字符类型…

chatgpt赋能python:Python中如何删除变量中的字符

Python中如何删除变量中的字符 在Python编程中&#xff0c;我们有时需要清除变量中的字符。删除字符可以是去掉字符串中的某些字符&#xff0c;也可以是从列表或元组中删除某些元素。本文将介绍Python中如何删除变量中的字符。 删除字符串中的字符 Python使用字符串的切片操…

网络安全入门学习第十五课——PHP基础

文章目录 一、WEB技术1、什么是web2、B/S架构3、C/S架构 二、PHP概述1、PHP是什么2、PHP受欢迎的原因3、基于MVC模式的PHP框架4、常用编译工具5、PHP环境搭建6、开发工具 三、PHP基本语法格式1、标记2、输出语句3、注释4、标识符 四、数据与运算1、常量1.1、常量定义1.2、预定义…

前端vue实现页面加水印文字 单个页面所有页面加水印 水印颜色

前端vue实现页面加水印文字, 可以实现系统所有页面加水印,也可以单个页面加水印, 可更改水印颜色, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id12889 效果图如下: #### 使用方法 使用方法 /* 给系统所有页面加水印*/ // 第一个参数:水印…

Shell脚本函数简介及运用

目录 一、函数的作用 二、定义函数 三、调用函数 1.在脚本中调用函数 2.在函数中调用函数 四、函数传参 五、函数的返回值 六、函数的递归 七、函数及其变量的作用范围 八、外部脚本调用函数 一、函数的作用 语句块定义成函数约等于别名&#xff0c;定义函数&#xf…

【云原生网关】Apache ShenYu 使用详解

目录 一、前言 二、Apache ShenYu 介绍 2.1 为什么叫ShenYu 2.2 ShenYu特点 2.3 ShenYu架构图 2.4 shenyu数据同步原理 2.4.1 Zookeeper数据同步原理 三、Apache ShenYu 安装部署 3.1 部署流程 3.1.1 创建 Docker Network 3.1.2 拉取Apache ShenYu Admin镜像 3.1.3…

C语言之函数栈帧的创建与销毁(2)

上一篇博客我们讲到了函数栈帧的创建与销毁&#xff08;1&#xff09;今天我们来讲解Add函数的函数栈帧相关知识 在开始本章博客之前&#xff0c;大家可以把上一篇博客的主要内容仔细复习一下 看图 第一个mov&#xff1a;把b的值放到eax里面去 第二个mov&#xff1a;把a的…