RHCE的学习(22)
第四章 流程控制之条件判断
条件判断语句是一种最简单的流程控制语句。该语句使得程序根据不同的条件来执行不同的程序分支。本节将介绍Shell程序设计中的简单的条件判断语句。
if语句语法
单分支结构
# 语法1:
if <条件表达式>
then指令
fi
#语法2:
if <条件表达式>;then指令
fi
双分支结构
if <条件表达式>
then指令序列1
else指令序列2
fiif id username;thenecho ""
elseecho " cunzai"
fi
多分支结构
语法:
if 条件表达式1;then命令序列1
elif 条件表达式2;then命令序列2
....
else命令序列n
fi
案例
-
例1:编写脚本choice1.sh,利用单分支结构实现输入2个整数,输出最大值
[root@server ~]# vim choice1.sh
#!/bin/bash
read -p "请输入第一个整数: " x
read -p "请输入第二个整数: " y
max=$x
if (($max<y))
thenmax=$y
fi
echo "最大值:$max"
-
例2:面试题,编写脚本choice2.sh,判断系统内存剩余容量大小,若低于100M则发送消息进行告警
#!/bin/bash
free_mem=$( free -m | grep Mem | tr -s " " | cut -d " " -f4 )
if (($free_mem<100))
thenecho "警告,剩余内存:$free_mem ,低于警戒线100MB"
elseecho "剩余内存:$free_mem,空间足够."
fi
# free -m :表示显示内存即虚拟内存的信息,-m以MB单位显示数字
# grep Mem:表示过滤包含Mem所在行
# tr -s " ": 压缩空格为一个
# cut -d " " -f4 :以空格为间隔符,取其第4部分
-
扩展:编写脚本,判断当前系统剩余内存大小,如果低于100M,邮件报警管理员,使用计划任务,每10分钟检查一次。
-
[root@locaklhost ~]# echo "邮件正文" | mail -s "邮件主题" alice
分析:核心是如何获取当前剩余内存大小
[root@localhost ~]# free -m | grep "Mem:" |tr -s " " | cut -d" " -f4
600
[root@localhost ~]# free -m | awk '/Mem:/ {print $4}'
600
vim mem.sh
mem=free -m |grep Mem | tr -s " " | cut -d “ ” -f 4
free -m | grep Mem | awk -F " " ‘{print }’
if test $mem \< 100 ;thenecho 内存严重不足 | mail -s 内存报警 lxx@163.com
elseecho 内存足够
fi
-
例3:编写脚本choice3.sh,判断当前脚本的执行者,若不是root账户则提示,并退出
# 检查当前账户的4种方法
[root@server ~]# whoami
root#使用环境变量
[root@server ~]# echo $USER
root
#id -u,结果为零则为root
[root@server ~]# id -u
0[root@server ~]# echo $UID
0
[root@server ~]# vim choice3.sh
#!/bin/bash
if [ "$USER" != "root" ] #或者if [ !$c_user == root ];then
then echo "please switch user root"
fi
[root@server ~]# bash choice3.sh # root账户下执行
[root@server ~]# pwd
/root
[root@server ~]# mv choice3.sh / # 让普通账户能访问脚本,需要移动到/
[root@server ~]# chmod +x /choice3.sh # 赋予执行权限
[root@server ~]# ll /choice3.sh
-rwxr-xr-x 1 root root 81 6月 18 10:10 /choice3.sh
[root@server ~]# tail -1 /etc/passwd # 查看普通账户名
fox:x:1000:1000::/home/fox:/bin/bash
[root@server ~]# su fox # 切换账户
[fox@server root]$ cd /
[fox@server /]$ bash choice3.sh
please switch user root
-
例4:编写脚本choice4.sh,实现闰年的判断
[root@server ~]# vim choice4.sh
#!/bin/bash
read -p "请输入4位数整数年份: " year
if [ -n "$year" ] # 非空测试
thenif ((year%4==0)) && ((year%100!=0)) || ((year%400==0))thenecho "闰年"elseecho "平年"fi
elseecho "请输入有效4位整数年份"
fi
-
例5:判断数字大于500则执行big.sh 小于等于500则退出脚本,并输出报错信息
read -p "s数字" num
if [ $num -gt 500 ] ;thenbash /big.sh
elseexit 0
fi
-
例6:编写脚本choice5.sh,判断sshd是否运行
分析:核心在于判断进程是否运行的方法?
方法1:查看进程 systemctl is-active sshd systemctl status sshd
[root@localhost ~]# ps -elf | grep sshd | grep -v grep | wc -l
4
方法2:查看端口
本地查看netstat、ss、lsof --- https://www.jianshu.com/p/644e75af4405
远程查看telnet、nmap、nc
[root@localhost ~]# netstat -lnupt | grep 22 | wc -l
2
[root@localhost ~]# ss -lnupt | grep 22 | wc -l
2
[root@localhost ~]# lsof -i:22
[root@localhost ~]# nmap -p 22 127.0.0.1 | grep open | wc -l
1
# 分析
# 根据进程数判断
[root@server ~]# ps -ef | grep sshd | grep -v grep | wc -l
# 根据端口号判断
[root@server ~]# netstat -lntup | grep 22 | wc -l
[root@server ~]# vim choice5.sh
#!/bin/bash
num=$(ps -ef | grep sshd | grep -v grep | wc -l)
if (($num>0))
thenecho "sshd is running"
elseecho "sshd is not running"
fi方法2:
read -p "请输入要判断的程序名称:" server_name
count=`ps -aux | grep -cw $server_name`if [ $count -gt 1 ];thenecho $server_name服务已运行
elseecho $server_name服务未运行
fi
-
例7:面试题,编写脚本choice6.sh,判断主机是否存活
[root@server ~]# vim choice6.sh
#!/bin/bash
read -p "请输入测试主机的IP地址:" ip
ping -c 2 -w 3 $ip &> /dev/null
# -c 2 表示发送2个数据包,-w 3 表示等待3秒结束,注意:不能等待1秒结束,有可能第二个数据包没有ping完就结束了,会返回错误的状态码
if [ $? -eq 0 ]
thenecho "主机$ip 已运行"
elseecho "主机$ip 未运行"
fi
# 上例修改,使用循环测试多台主机是否存活,设置显示颜色
[root@server ~]# vim choice6.sh
#!/bin/bash
for ip in 192.168.48.{125..135}
do
ping -c 2 -w 3 $ip &> /dev/nullif [ $? -eq 0 ]thenecho -e "\e[1;31m!!主机 $ip 已运行!!\e[0m" # 高亮、红色elseecho "主机$ip 未运行"fi
done
-
例8:编写脚本choice7.sh,输入百分制成绩,判断等级成绩
[root@server ~]# vim choice7.sh
#!/bin/bash
read -p "请输入百分制成绩: " score
if [ -z $score ]
thenecho "未输入,请重新输入"
elif [ $score -lt 0 -o $score -gt 100 ]
thenecho "成绩输入有误,请输入0-100间数字"
elif [ $score -ge 90 ]
thenecho "成绩优秀"
elif [ $score -ge 80 ]
thenecho "成绩良好"
elif [ $score -ge 60 ]
thenecho "成绩及格"
elseecho "补考"
fi
- 扩展:根据用户输入成绩,判断优良中差。85-100 优秀--A 70-84 良好--B 60-69 合格--C 60分以下不合格--D
read -p "Please enter your score (0-100): " gradeif [ $grade -ge 85 ]
thenecho "$grade, A"
elif [ $grade -ge 70 ]
thenecho "$grade, B"
elif [ $grade -ge 60 ]
thenecho "$grade, C"
elseecho "$grade, D"
fi更完善的:(多层嵌套)
grade=$1if [[ $1 =~ ^[0-9]*$ ]];then #判断是否是纯数值,有小数也不行if [ $grade -ge 85 -a $grade -le 100 ];thenecho "$grade, A"elif [ $grade -ge 70 -a $grade -le 84 ];thenecho "$grade, B"elif [ $grade -ge 60 -a $grade -le 69 ];thenecho "$grade, C"elif [ $grade -ge 0 -a $grade -le 60 ];thenecho "$grade, D"elseecho "输入的成绩不在(0-100)范围内"fi
elseecho "请输入正确成绩"
fi解释:$1 =~ ^[0-9]*$
=~:正则符匹配
^[0-9]:以0-9开头的任意一个
*:匹配前一个字符任意次(正则符)
$:结束符(保证数值结束前后没有其他信息)
-
例9:编写脚本,根据用户输入的内容,判断是数字、字母、其它字符
[root@server ~]# vim choice8.sh
#!/bin/bash
read -p "请输入数字、字母、符号: " str
if echo $str | grep [a-zA-Z] > /dev/null
thenecho "字母"
elif echo $str | grep [0-9] > /dev/null
thenecho "数字"
elseecho "符号"
fi
-
例10:编写脚本choice9.sh,判断当前主机cpu生产商
其信息在/proc/cpuinfo文件中vendor_id一行中。 如果其生产商为GenuineIntel,就显示其为Intel公司; 如果其生产商为AuthenticAMD,就显示其为AMD公司; 否则,就显示无法识别;
[root@server ~]# vim choice9.sh
#!/bin/bash
vendor=$(grep "vendor_id" /proc/cpuinfo | uniq | cut -d " " -f2)
if [ $vendor == GenuineIntel ]
then echo "Intel"
elif [ $vendor == AuthenticAMD ]
then echo "AMD"
else echo "other"
fi
- 例11:两个整数比较大小(if嵌套)
read -p "请输入整数" a
read -p "在次输入" b
if [ -n "$a" -a -n "$b" ];then[[ "$a" =~ ^[0-9]+$ ]] && [[ "$b" =~ ^[0-9]+$ ]]# echo "$a"|[ -n "`sed -n '/^[0-9]*$/p'`" ] && echo "$b" |[-n "`sed -n '/^[0-9]*$/p'`"]if [ $? -eq 0 ];thenif [[ "$a" -gt "$b" ]];thenecho 第一个数大于第二个数elif [[ "$a" -lt "$b" ]];thenecho 第一个数小于第二个数elseecho 两个数相等fielseecho 请输入数字fi
elseecho 输入信息不能为空
fi
exit退出程序 (复习)
- exit语句的基本作用是终止Shell程序的执行。
- 除此之外,exit语句还可以带一个可选的参数,用来指定程序退出时的状态码。
- exit语句的基本语法如下: exit status
- 其中,status参数表示退出状态,该参数是一个整数值,其取值范围为0~255。
- 与其他的Shell命令的一样,Shell程序的退出状态也储存在系统变量$?中,因此,用户可以通过该变量取得Shell程序返回给父进程的退出状态码。
case多条件判断
case可针对谋变量不同的值结果进行情景分析。
格式
case 变量名 in值1)指令1;;值2)指令2;;值3)指令3 ;;*)默认
esac也可以写在一行,例: 值1) 指令1 ;;
最后一个;;可以写也可以不写
执行过程
-
case语句会将该变量的值与 )括号中的值相比较,如果与某个值相等,则执行对应语句。
-
当遇到“;;”符号时,就跳出case语句,执行esac语句后面的语句。
-
如果没有与任何一个值相匹配,则执行*)后面的一组语句
示例
-
例1:编写脚本choice10.sh,对上例7的百分制成绩判断等级成绩进行改写
[root@server ~]# vim choice10.sh
#!/bin/bashread -p "请输入百分制成绩: " scorecase $score in9[0-9]|100)echo "成绩优秀";;8[0-9])echo "成绩良好";;6[0-9]|7[0-9])echo "成绩及格";;*)echo "补考"
esac
-
例2:判断今天是星期几,根据星期几来判断今天是工作日还是休息日
[root@server ~]# vim choice11.sh
#!/bin/bash
a=`date +%w` #将日期转换为星期几,用数字0-6表示
case $a in
[1-5])echo "今天是工作日,社畜没有休息日哦。";;
[06])echo "哦~今天是休息日呢,请好好休息哦~";;
esac
- 例3:由用户从键盘输入一个字符,并判断该字符是否为字母、数字或者其他字符, 并输出相应的提示信息
read -p "Please enter a character, press enter to continue: " -n 1 str
if echo "$str"|grep "[a-zA-Z]" >/dev/null
thenecho "Input is letter"
elif echo "$str"|grep "[0-9]" >/dev/null
thenecho "Input is number"
elseecho "Input is other"
firead -p "Please enter a character, press enter to continue: " -n 1 KEY
case "$KEY" in[[:alpha:]])echo "Input is letter";;[0-9])echo "Input is number";;*)echo "Input is other characters"
esac
- 例4:将判断分数范围多分支语句用case语句实现
read -p "Please enter your score (0-100): " grade
case "$grade" in8[5-9]|9[0-9]|100) #{85..100} [85-100]echo "$grade, A";;7[0-9]|8[0-4])echo "$grade, B";;6[0-9])echo "$grade, C";;*)echo "$grade, D"
esac
练习
-
开发rsync起停脚本
[root@server ~]# vim cc_rsync
#!/bin/bash
if [ "$#" -ne 1 ]; thenecho "Usage: $0 {start|stop|restart}"exit 1
fi
# 当用户选择是start
case "$1" in"start")/usr/bin/rsync --daemonsleep 1if [ `netstat -lntup | grep rsync | wc -l` -ge 1 ]; thenecho "rsync is started"exit 0fi;;"stop")killall rsync &>/dev/nullsleep 1if [ `netstat -lntup | grep rsync | wc -l` -eq 0 ]; thenecho "rsync is stopped"exit 0fi;;"restart")if [ `netstat -lntup | grep rsync | wc -l` -ge 1 ]; thenkillall rsync &>/dev/nullsleep 1fi/usr/bin/rsync --daemonsleep 1start_flag=`netstat -lntup | grep rsync | wc -l`#if [ "$stop_flag" -eq 0 -a "$start_flag" -ge 1 ]; then#if [ "$stop_flag" -eq 0 && "$start_flag" -ge 1 ]; thenif [ `netstat -lntup | grep rsync | wc -l` -ge 1 ]; thenecho "rsync is restarted"exit 0fi;;*)echo "Usage: $0 {start|stop|restart}"
esac
扩展远程端口监听 telnet nmap nc
-
nc:netcat 是一个简单的 Unix 工具,它使用 TCP 或 UDP 协议去读写网络连接间的数据。
-
nmap
:(“Network Mapper”)是一个用于网络探索和安全审计的开源工具,被设计用来快速地扫描大规模网络。 -
telnet
:被用来交互地通过 TELNET 协议与另一台主机通信。
1)nc
即 netcat
。netcat
是一个简单的 Unix 工具,它使用 TCP 或 UDP 协议去读写网络连接间的数据。
它被设计成为一个可信赖的后端工具,可被直接使用或者简单地被其他程序或脚本调用。
与此同时,它也是一个富含功能的网络调试和探索工具,因为它可以创建你所需的几乎所有类型的连接,并且还拥有几个内置的有趣功能。
netcat
有三类功能模式,它们分别为连接模式、监听模式和隧道模式。
nc
(netcat
)命令的一般语法:
$ nc [-options] [HostName or IP] [PortNumber]
在下面的例子中,我们将检查远程 Linux 系统中的 22 端口是否开启。
假如端口是开启的,你将获得类似下面的输出。
# nc -zvw3 192.168.1.8 22
Connection to 192.168.1.8 22 port [tcp/ssh] succeeded!
命令详解:
-
nc
:即执行的命令主体; -
z
:零 I/O 模式(被用来扫描); -
v
:显式地输出; -
w3
:设置超时时间为 3 秒; -
192.168.1.8
:目标系统的 IP 地址; -
22
:需要验证的端口。
当检测到端口没有开启,你将获得如下输出:
# nc -zvw3 192.168.1.95 22
nc: connect to 192.168.1.95 port 22 (tcp) failed: Connection refused
2)nmap
(“Network Mapper”)是一个用于网络探索和安全审计的开源工具,被设计用来快速地扫描大规模网络,尽管对于单个主机它也同样能够正常工作。
nmap
以一种新颖的方式,使用裸 IP 包来决定网络中的主机是否可达,这些主机正提供什么服务(应用名和版本号),它们运行的操作系统(系统的版本),它们正在使用的是什么包过滤软件或者防火墙,以及其他额外的特性。
尽管 nmap
通常被用于安全审计,许多系统和网络管理员发现在一些日常任务(例如罗列网络资产、管理服务升级的计划、监视主机或者服务是否正常运行)中,它也同样十分有用。
nmap
的一般语法:
$ nmap [-options] [HostName or IP] [-p] [PortNumber]
假如端口是开启的,你将获得如下的输出:
# nmap 192.168.1.8 -p 22
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-16 03:37 IST Nmap scan report for 192.168.1.8 Host is up (0.00031s latency).
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 13.06 seconds
假如端口没有开启,你将得到类似下面的结果:
# nmap 192.168.1.8 -p 80
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-16 04:30 IST
Nmap scan report for 192.168.1.8
Host is up (0.00036s latency).
PORT STATE SERVICE
80/tcp closed http
Nmap done: 1 IP address (1 host up) scanned in 13.07 seconds
3)telnet
命令被用来交互地通过 TELNET 协议与另一台主机通信。
telnet
命令的一般语法:
$ telnet [HostName or IP] 80
假如探测成功,你将看到类似下面的输出:
$ telnet 192.168.1.9 22
Trying 192.168.1.9...
Connected to 192.168.1.9.
Escape character is '^]'.
SSH-2.0-OpenSSH_5.3
^]
Connection closed by foreign host.
假如探测失败,你将看到类似下面的输出:
$ telnet 192.168.1.9 80
Trying 192.168.1.9...
telnet: Unable to connect to remote host: Connection refused
示例 2:检查主机是否存活,并输出结果
分析:最简单方式是通过ping命令检测ping -c 2 -W 1 192.168.95.16 &> /dev/null通过$?判断,也可以直接 if ping -c 2 -W 1 192.168.95.16 &> /dev/null测试
扩展:
[root@bogon day04]# dnf whatprovides nmap #查询命令nmap所能提供的安装包
相关文章:
RHCE的学习(22)
第四章 流程控制之条件判断 条件判断语句是一种最简单的流程控制语句。该语句使得程序根据不同的条件来执行不同的程序分支。本节将介绍Shell程序设计中的简单的条件判断语句。 if语句语法 单分支结构 # 语法1: if <条件表达式> then指令 fi #语法2&#x…...
【前端知识】简单讲讲什么是微前端
微前端介绍 一、定义二、背景三、核心思想四、基本要素五、核心价值六、实现方式七、应用场景八、挑战与解决方案 什么是single-spa一、核心特点二、核心原理三、应用加载流程四、最佳实践五、优缺点六、应用场景 什么是 qiankun一、概述二、特点与优势三、核心功能四、使用场景…...
AWS IAM
一、介绍 1、简介 AWS Identity and Access Management (IAM) 是 Amazon Web Services 提供的一项服务,用于管理 AWS 资源的访问权限。通过 IAM,可以安全地控制用户、组和角色对 AWS 服务和资源的访问权限。IAM 是 AWS 安全模型的核心组成部分,确保只有经过授权的用户和应…...

丹摩|丹摩助力selenium实现大麦网抢票
丹摩|丹摩助力selenium实现大麦网抢票 声明:非广告,为用户体验 1.引言 在人工智能飞速发展的今天,丹摩智算平台(DAMODEL)以其卓越的AI算力服务脱颖而出,为开发者提供了一个简化AI开发流程的强…...

基于Qt/C++/Opencv实现的一个视频中二维码解析软件
本文详细讲解了如何利用 Qt 和 OpenCV 实现一个可从视频和图片中检测二维码的软件。代码实现了视频解码、多线程处理和界面更新等功能,是一个典型的跨线程图像处理项目。以下分模块对代码进行解析。 一、项目的整体结构 项目分为以下几部分: 主窗口 (M…...
智慧理财项目测试文档
目录 幕布思维导图链接:https://www.mubu.com/doc/6xk3c7DzgFs学习链接:https://www.bilibili.com/video/BV15J4m147vZ/?spm_id_from333.999.0.0&vd_source078d5d025b9cb472d70d8fda1a7dc5a6智慧理财项目测试文档项目介绍项目基本信息项目业务特性系…...

R | 统一栅格数据的坐标系、分辨率和行列号
各位同学,在做相关性等分析时,经常会遇到各栅格数据间的行列号不统一等问题,下面的代码能直接解决这类麻烦。以某个栅格数据的坐标系、分辨率和行列号为准,统一文件夹内所有栅格并输出到新的文件夹。 代码只需要更改输入输出和ti…...
C++学习——编译的过程
编译的过程——预处理 引言预处理包含头文件宏定义指令条件编译 编译、链接 引言 C程序编译的过程:预处理 -> 编译(优化、汇编)-> 链接 编译和链接的内容可以查阅这篇文章(点击查看) 预处理 编译预处理是指&a…...

当你要改文件 但是原来的文件内容又不能丢失的时候,拷贝一份(备注原来的),然后添加后缀:.bak
当你要改文件 但是原来的文件内容又不能丢失的时候,拷贝一份(备注原来的),然后添加后缀:.bak !!!文件不要直接删除,若你以后要还原的话会找不到...

MATLAB神经网络(五)——R-CNN视觉检测
5.1 目标分类、检测与分割 在计算机视觉领域,目标分类、检测与分割是常用计数。三者的联系与区分又在哪呢?目标分类是解决图像中的物体是什么的问题;目标检测是解决图像中的物体是什么,在哪里的问题;目标分割时将目标和…...
mock.js:定义、应用场景、安装、配置、使用
前言:什么是mock.js? 作为一个前端程序员,没有mockjs你不感觉很被动吗?你不感觉你的命脉被后端那个男人掌握了吗?所以,我命由我不由天!学学mock.js吧! mock.js 是一个用于生成随机…...

【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
GRAPH ATTENTION NETWORKS 代码详解 前言0.引言1. 环境配置2. 代码的运行2.1 报错处理2.2 运行结果展示 3.总结 前言 在前文中,我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来,将开启一个新的阶段&#…...
Transformer中的Self-Attention机制如何自然地适应于目标检测任务
Transformer中的Self-Attention机制如何自然地适应于目标检测任务: 特征图的降维与重塑 首先,Backbone(如ResNet、VGG等)会输出一个特征图,这个特征图通常具有较高的通道数、高度和宽度(例如CHWÿ…...
2411rust,1.75.0
原文 Rust团队很高兴地声明推出Rust的新版本1.75.0. 如果你rustup安装了以前版本的Rust,你可如下取1.75.0: $ rustup update stable1.75.0稳定版中的功能 async fn和特征中的返回位置impl Trait. 指针字节偏移API 原始指针(*const T和*mutT)过去主要支持,T为单位的操作.如…...

远程办公新宠:分享8款知识共享软件
远程办公模式下,知识共享软件成为了团队协作和沟通的重要工具。以下是8款备受推崇的知识共享软件: 1、HelpLook AI知识库 简介:HelpLook是一款快速搭建AI知识库的系统,具备强大功能,如快速精准的知识检索、灵活定制的…...

3.9MayBeSomeAssembly
就是先从数组里,乘4得到正确地址 32(&s3),s3是基址,32是偏移量,就是先从数组里取出数到临时寄存器,然后再在临时寄存器上加上变量,最后再把临时寄存器上的变量存到数组里,偏移量࿰…...

i春秋-签到题
练习平台地址 竞赛中心 题目描述 题目内容 点击GUESS后会有辨识细菌的选择题 全部完成后会有弹窗提示 输入nickname后提示获得flag F12检查 元素中没有发现信息 检查后发现flag在控制台中 flag flag{663a5c95-3050-4c3a-bb6e-bc4f2fb6c32e} 注意事项 flag不一定要在元素中找&a…...
TypeScript 中扩展现有模块的用法
declare module 是 TypeScript 中用于扩展现有模块的特性。它允许开发者在已有模块的基础上,添加新的功能(比如扩展接口、添加类型声明等)。通过 declare module,可以将额外的声明合并到原模块中。以下是用法详解: 用…...

【报错记录】解决Termux中pulseaudio启动报错,报:E: [pulseaudio] main.c: Daemon startup failed.
前言 在尝试使用Termux-X11启动Minecraft过程中,不知道怎么回事原本好好的pulseaudio居然无法启动了,一直在报: E: [pulseaudio] main.c: Daemon startup failed. 重装了好几次也没用解决方案如下。 排除重复启动 如果pulseaudio之前已经…...
Java list
在 Java 中,链表(LinkedList)是一个非常重要的数据结构,它可以动态地插入和删除元素,因此比数组更灵活。Java 提供了 LinkedList 类,该类实现了 List 接口,并且是基于双向链表实现的,…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...