【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(二)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(二)

练习5:写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小

点击此文章查看代码

练习6: 用Shell实现,把一个文本文档中只有一个数字的行给打印出来

[root@Shell test]# cat print_num.sh
#!/bin/bash
filename="your_text_file.txt"
while read -r line; do
  # 使用正则表达式匹配只有一个数字的行
  if [[ $line =\~ ^[0-9]+$ ]]; then
    echo "$line"
  fi
done < "$filename"

练习7:写一个Shell脚本通过curl命令返回的状态码来判定所访问的网站是否正常,比如当前状态码200,才算正常

[root@Shell test]# cat curl.sh
#!/bin/bash
# 设置要访问的网站URL
website="https://www.baidu.com"
# 发送GET请求并获取状态码
status_code=$(curl -s -o /dev/null -w "%{http_code}" "$website")
# 判断状态码是否为200
if [ "$status_code" -eq 200 ]; then
  echo "Website is accessible!"
else
  echo "Website is not accessible! Status code: $status_code"
fi

四、循环

练习1:使用while循环使1加到100

[root@Shell test]# cat add.sh
#!/bin/bash
sum=0
counter=1
while [ $counter -le 100 ]
do
    sum=$((sum + counter))
    counter=$((counter + 1))
done
echo "1加到100的和为: $sum"

练习2:查看磁盘、当前使用状态,如果使用率超过80%则把结果输出到/var/log/disk.err

[root@Shell test]# cat disk.sh
#!/bin/bash
# 设置磁盘使用率阈值
threshold=80
# 执行df命令获取磁盘使用状态,并使用awk过滤出使用率超过阈值的行
df_output=$(df -h | awk '$5 > threshold')
# 检查是否有超过阈值的行
if [ -n "$df_output" ]; then
  echo "$df_output" >> /var/log/disk.err
  echo "Disk usage exceeded the threshold and logged to /var/log/disk.err"
else
  echo "Disk usage is within the threshold"
fi

练习3:脚本批量创建10个用户,密码统一为123,需要对用户输入是否为数字和输入的名字是否为空做判断

[root@Shell test]# cat useradd.sh
#!/bin/bash
count=1
while [ $count -le 10 ]
do
    echo "请输入第 $count 个用户的名字:"
    read username
    # 判断用户名是否为空
    if [ -z "$username" ]; then
        echo "用户名不能为空,请重新输入!"
        continue
    fi
    echo "请输入第 $count 个用户的密码:"
    read password
    # 判断密码是否为数字
    if ! [[ $password =\~ ^[0-9]+$ ]]; then
        echo "密码必须为数字,请重新输入!"
        continue
    fi
    # 创建用户并设置密码
    sudo useradd -m $username
    echo "$username:$password" | sudo chpasswd
    count=$((count + 1))
done

练习4:使用case语句编写nginx启动脚本

点击此文章查看代码

练习5:抓阄程序,执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能再出现相同数字;第一个同学输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出,继续等待别的学生输入。

点击此文章查看代码

练习6:打印一个菜单如下,然后使用循环加case语句输出用户输入菜单选项的结果

h 显示命令帮助

f 显示登陆信息

d 显示磁盘挂载

m 查看内存使用

u 查看系统负载

q 退出程序

点击此文章查看代码

五、控制与数组

练习1:生成0-100之间的随机数,并相加,直到大于1000,输出相加的结果

[root@Shell test]# cat addnum.sh
#!/bin/bash
sum=0
while [ $sum -le 1000 ]
do
    # 生成0-100之间的随机数
    random_number=$((RANDOM % 101))
    sum=$((sum + random_number))
done
echo "和大于1000的结果为: $sum"

练习2:生成0-100之间的随机数,并相加,直到大于1000,并判断最后一个随机数字能否被3整除

[root@Shell test]# cat 3.sh
#!/bin/bash
sum=0
last_random_number=0
while [ $sum -le 1000 ]
do
    # 生成0-100之间的随机数
    random_number=$((RANDOM % 101))
    sum=$((sum + random_number))
    last_random_number=$random_number
done
echo "和大于1000的结果为: $sum"
# 判断最后一个随机数字是否能被3整除
if [ $((last_random_number % 3)) -eq 0 ]; then
    echo "最后一个随机数字 $last_random_number 能被3整除"
else
    echo "最后一个随机数字 $last_random_number 不能被3整除"
fi

练习3:判断/tmp/目录下是否有大于4K的文件,如果有则输出该文件的大小与创建时间

[root@Shell test]# cat 4K.sh
#!/bin/bash
path="/tmp/"
# 使用find命令查找/tmp/目录下大于4K的文件,并使用-printf选项输出文件大小和创建时间
find "$path" -type f -size +4k -printf "文件:%p,大小:%s字节,创建时间:%TY-%Tm-%Td %TH:%TM:%TS\n"

练习4:数组array=(1 2 3 4 5 6)使用脚本打印出每个元素,每行显示一个元素

[root@Shell test]# cat array.sh
#!/bin/bash
array=(1 2 3 4 5 6)
# 使用for循环遍历数组
for element in "${array[@]}"
do
    echo "$element"
done

练习5:使用数组判断 I am koten welcome to my hometown 中字母数大于6的单词

[root@Shell test]# cat array_6.sh
#!/bin/bash
sentence="I am koten welcome to my hometown"
words=($sentence)
# 使用for循环遍历数组中的每个单词
for word in "${words[@]}"
do
    # 统计单词中的字母数
    length=${#word}
    # 判断字母数是否大于6
    if [ $length -gt 6 ]; then
        echo "$word"
    fi
done

六、实战进阶

练习1:检测服务器中重要的文件是否被修改,如果修改则报警(使用指纹)

[root@Shell test]# cat fingerprint.sh
#!/bin/bash
# 定义重要文件的路径和对应的指纹
declare -A important_files=(
    ["/path/to/file1"]="fingerprint1"
    ["/path/to/file2"]="fingerprint2"
    ["/path/to/file3"]="fingerprint3"
)
# 检测文件是否被修改
for file in "${!important_files[@]}"; do
    # 计算当前文件的指纹
    current_fingerprint=$(md5sum "$file" | awk '{print $1}')
    # 比较当前指纹和预设的指纹
    if [[ "$current_fingerprint" != "${important_files[$file]}" ]]; then
        echo "警报!文件 $file 已被修改!"
        # 在此处添加触发报警的操作,比如发送邮件或短信通知管理员
    fi
done

练习2:计算nginx日志中访问最多的10个IP使用的流量综合

[root@Shell test]# cat ip.sh
#!/bin/bash
logfile="access.log"
# 使用awk命令提取日志中的IP和流量信息,并按照IP统计流量总和
ip_traffic=$(awk '{ ip[$1] += $10 } END { for(i in ip) print i, ip[i] }' "$logfile")
# 使用sort命令对流量进行降序排序
sorted_ip_traffic=$(echo "$ip_traffic" | sort -k2 -rn)
# 使用head命令获取前10个IP和对应的流量
top_10_ip_traffic=$(echo "$sorted_ip_traffic" | head -n 10)
# 输出结果
echo "访问最多的10个IP使用的流量综合:"
echo "$top_10_ip_traffic"

练习3:防止DOS攻击,检测nginx日志,若某个IP短时间的PV过大则使用防火墙将其禁掉

[root@Shell test]# cat iptables.sh
#!/bin/bash
logfile="access.log"
threshold=100  # 设置阈值,表示短时间内的页面访问量上限
ban_time=60    # 设置禁用时间,单位为秒
# 使用awk命令提取日志中的IP信息,并统计每个IP的页面访问量
ip_pv=$(awk '{ ip[$1]++ } END { for(i in ip) print i, ip[i] }' "$logfile")
# 使用while循环遍历PV统计结果
while IFS= read -r line; do
    ip=$(echo "$line" | awk '{print $1}')
    pv=$(echo "$line" | awk '{print $2}')
    # 判断页面访问量是否超过阈值
    if [ "$pv" -gt "$threshold" ]; then
        echo "警报!IP $ip 的短时间内页面访问量过大!"
        # 使用防火墙命令禁用IP
        iptables -A INPUT -s "$ip" -j DROP
        # 等待一段时间后解禁IP
        sleep "$ban_time"
        iptables -D INPUT -s "$ip" -j DROP
    fi
done <<< "$ip_pv"

练习4:实时监控服务器CPU使用率大于80%,磁盘使用率大于80%,内存使用率大于80%时报警

[root@Shell test]# cat cpu_disk.sh
#!/bin/bash
# 配置监控阈值
cpu_threshold=80
disk_threshold=80
memory_threshold=80
# 检查CPU使用率
check_cpu() {
    cpu_usage=$(sar -u 1 1 | grep Average | awk '{print 100 - $NF}')
    if [ "$cpu_usage" -gt "$cpu_threshold" ]; then
        echo "警报!CPU使用率超过 $cpu_threshold%!"
        # 在此处添加触发报警的操作,比如发送邮件通知管理员
    fi
}
# 检查磁盘使用率
check_disk() {
    disk_usage=$(df -h | awk '/\/$/ {print $5}' | sed 's/%//')
    if [ "$disk_usage" -gt "$disk_threshold" ]; then
        echo "警报!磁盘使用率超过 $disk_threshold%!"
        # 在此处添加触发报警的操作,比如发送邮件通知管理员
    fi
}
# 检查内存使用率
check_memory() {
    memory_usage=$(free | awk '/Mem/ {printf "%.2f", $3/$2 * 100}')
    if (( $(echo "$memory_usage > $memory_threshold" | bc -l) )); then
        echo "警报!内存使用率超过 $memory_threshold%!"
        # 在此处添加触发报警的操作,比如发送邮件通知管理员
    fi
}
# 持续监控
while true; do
    check_cpu
    check_disk
    check_memory
    sleep 5
done

练习5:使用二进制安装nginx,要求脚本可以重复执行

[root@Shell test]# cat nginx.sh
#!/bin/bash
nginx_version="1.18.0"  # 设置nginx版本号
nginx_install_dir="/usr/local/nginx"  # 设置nginx安装目录
# 下载nginx源码包
wget http://nginx.org/download/nginx-$nginx_version.tar.gz
# 解压源码包
tar -zxvf nginx-$nginx_version.tar.gz
# 进入解压后的目录
cd nginx-$nginx_version
# 配置编译参数
./configure --prefix=$nginx_install_dir
# 编译和安装
make && make install
# 清理临时文件
cd ..
rm -rf nginx-$nginx_version
rm nginx-$nginx_version.tar.gz

练习6:数据库分库分表备份到/tmp下。

[root@Shell test]# cat mysql.sh
#!/bin/bash
# 定义数据库连接信息
host=localhost
port=3306
user=root
password=123456
# 定义要备份的数据库和表
db_list=(db1 db2)
table_list=(table1 table2 table3)
# 遍历数据库
for db in ${db_list[@]}; do
  # 遍历表
  for table in ${table_list[@]}; do
    # 构建备份文件名
    bak_file=/tmp/${db}_${table}.sql
    # 执行备份命令
    mysqldump -h$host -P$port -u$user -p$password $db $table > $bak_file
    # 检查备份是否成功
    if [ $? -eq 0 ]; then
      echo "备份 $db.$table 成功"
    else
      echo "备份 $db.$table 失败"
    fi
  done
done

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
318 3
|
12天前
|
存储 弹性计算 运维
云端问道 7 期实践教学-使用操作系统智能助手 OS Copilot 轻松运维与编程
使用操作系统智能助手 OS Copilot 轻松运维与编程
37 14
|
2月前
|
运维 监控 应用服务中间件
自动化运维的利器:Ansible实战应用
【10月更文挑战第41天】在现代IT运维领域,自动化已成为提高效率、减少错误的关键。Ansible作为一种简单而强大的自动化工具,正被越来越多的企业采纳。本文将通过实际案例,展示如何使用Ansible简化日常运维任务,包括配置管理和批量部署等,旨在为读者提供一种清晰、易懂的自动化解决方案。
36 1
|
2月前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
79 4
|
2月前
|
消息中间件 运维 UED
消息队列运维实战:攻克消息丢失、重复与积压难题
消息队列(MQ)作为分布式系统中的核心组件,承担着解耦、异步处理和流量削峰等功能。然而,在实际应用中,消息丢失、重复和积压等问题时有发生,严重影响系统的稳定性和数据的一致性。本文将深入探讨这些问题的成因及其解决方案,帮助您在运维过程中有效应对这些挑战。
45 1
|
2月前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
108 1
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
3月前
|
运维 监控 jenkins
运维自动化实战:利用Jenkins构建高效CI/CD流程
【10月更文挑战第18天】运维自动化实战:利用Jenkins构建高效CI/CD流程
|
3月前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
75 3
|
3月前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。