什么是shell脚本和简单shell脚本练习
文章目录
- 什么是shell脚本和简单shell脚本练习
- 什么是shell脚本
- 为什么要学习shell脚本
- 第一个脚本编写与执行
- 编写第一个脚本
- 简单的shell脚本练习
- 简单案例
- 交互式脚本:变量内容由用户决定
- 随日期变化:利用date建立文件
- 数值运算:简单的加减乘除
- 数值运算:通过bc计算Pi(圆周率)
- 脚本的执行方式差异(source、sh script、./script)
- 利用直接执行的方式来执行脚本
- 利用source来执行脚本:在父进程中执行
什么是shell脚本和简单shell脚本练习
什么是shell脚本
什么是shell脚本呢(shell script,程序化脚本)呢?就字面上的意义,我们将它分为两部分。对于【shell】部分,我们在这篇博客记录过:https://blog.csdn.net/qq_52089863/article/details/130296403
就是在命令行下面让我们与系统沟通的一个工具接口。那么【script】是啥?字面意思就是【脚本、剧本】的意思。整句话来说shell脚本就是利用shell的功能所写的一个【程序】,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令),写在里面,搭配正则表达式、管道命令与数据流重定向等功能,达到我们所想要处理的目的。
shell脚本可以简单地被看成批处理文件
,也可以被说成是一个程序文件,且这个程序语言由于都是利用shell与相关工具命令,所以不需要编译即可执行
。此外,它还拥有不错的除错(debug)工具,
能够帮助系统管理员快速地管理好主机
。
为什么要学习shell脚本
为什么要学习shell脚本呢,如果你不从事IT工作,只想要【会用】Linux而已,那么不需要学shell脚本也无所谓。但是,如果你是真的想要玩明白Linux,那么shell脚本肯定要学,因为shell脚本给我带来以下好处:
- ==自动化管理:==Shell脚本可以帮助管理员自动化管理一些重复性的任务,例如备份数据、批量修改文件、自动化部署等,从而提高工作效率和减少错误。
- ==系统管理:==Shell脚本可以帮助管理员进行系统管理,例如监测系统性能、管理进程、设置定时任务等。
- ==脚本编写:==Shell脚本是一种非常简单易懂的编程语言,掌握Shell脚本可以帮助开发人员快速编写一些小型脚本程序,例如数据处理、文本解析等。
- ==维护脚本:==在Linux系统中,很多应用程序都是通过脚本来启动和停止的,例如Apache、MySQL等,因此掌握Shell脚本可以帮助管理员更好地维护这些应用程序。
- ==调试程序:==Shell脚本是一种非常容易调试的编程语言,可以帮助开发人员快速定位程序中的错误并进行修复。
总之,学习Shell脚本对于Linux系统管理员和开发人员来说是非常重要的,可以帮助他们更好地进行系统管理和脚本编写,从而提高工作效率和减少错误。
第一个脚本编写与执行
shell脚本其实就是纯文本文件,我们可以编辑这个文件,然后让这个文件来帮我们一次执行多个命令,或是利用一些运算与逻辑判断来帮我们完成某些功能。在shell脚本的编写中需要注意下面的事项:
- 命令是从上而下、从左向右地分析执行
- 命令、选项与参数间的多个空格都会被忽略掉
- 空白行也将被忽略掉,并且【TAB】按键所产生的空白行视为空格键
- 如果读取到一个Enter符号,就尝试开始执行该行(或该串)命令
- 至于如果一行内容太多,则可以用【\Enter】来扩展至下一行
- 【#】可作为注释,任何加在#后面的数据将全部视为注释文字
这样一来,我写的脚本程序,就会被一行一行地执行,现在我们假设你写的这个程序文件名是/home/csq/shell.sh 那如何执行这个文件呢?
直接命令行执行:shell.sh 文件必须要具备可读与可执行的权限(rx),
然后:- 绝对路径:使用/home/csq/shell.sh 来执行命令
- 相对路径:假设工作目录在/home/csq下,则使用【./shell.sh】来执行
- 变量【PATH】功能:通过【bash shell.sh】或【sh shell.sh】来执行
重点就是让shell.sh文件必须要具备可读与可执行的权限才行
那么【sh shell.sh】也可以执行?这是因为/bin/sh其实就是/bin/bash(链接文件),使用sh shell.sh就是告诉系统,我想要直接以bash的功能来执行shell.sh 这个文件内相关命令的意思。所以说只要你shell.sh具有可读可执行的权限,就能用 sh 的参数。
如上图 sh 指向 bash,如果不懂链接文件,可以自行查阅软硬链接的使用。
编写第一个脚本
学过语言的都知道一开始学都是从输出【Hello World】开始的,我们可以编一个输出Hello world的shell脚本:
[root@localhost ~]# mkdir shelldir ; cd shelldir
[root@localhost shelldir]# vim hello.sh
#!/bin/bash
# 程序说明:
# 在屏幕上输入你好世界
# 时间:
# 2023/04/27 csq
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
echo -e "Hello World! \a \n"
exit=0
- 第一行 #!/bin/bash 在声明这个使用的shell名称
因为我们使用的是bash,所以,必须要以【#!/bin/bash】来声明这个文件内使用bash的语法。这样【#!】开头的行被称为shebang行。那么当这个程序被执行时,它就能够加载bash的相关环境配置文件(这个文件一般来说是~/.bashrc),并且执行bash来使我们下面的命令能够执行。这很重要,在很多错误的情况中,如果没有设置好这行,那么该程序可能会无法执行,因为系统可能无法判断该程序需要声明shell来执行。
- 程序说明内容
整个脚本当中,除了第一行【#!】是用来声明shell之外,其他的 # 都是【注释】用途。所以上面的程序当中,第二行以下就是用来说明整个程序的基本数据。一般来说,建议你一定要养成习惯,说明该脚本的:(1)内容与功能(2)版本信息(3)作者联络方式(4)建文件日期(5)历史记录等等,这样有助于未来程序的改写与调试。(建议大家注释使用英文注释主要原因是为了兼容性和可移植性),下面案例的注释部分我写成中文方便阅读
- 主要环境变量的声明
建议务必要将一些重要的环境变量设置好,PATH与LANG(如果有使用到输出相关的信息时)是当中最重要的。如此一来,我们这个程序在进行时,可以直接执行一些外部命令,而不必写绝对路径。
- 主程序部分
将主要的程序写好即可,在这个例子当中,就是echo 那一行
- 执行结果告知(定义返回值)
一个命令的成功与否,可以使用$?这个变量来观察?那么我们也可以利用exit这个命令来让程序中断,并且返回一个数值给系统。在此例中,使用exit 0,代表退出脚本并且返回一个0给系统,所以我执行完这个脚本后,若接着执行echo $? 则得到0的值。
接下来执行一下写的脚本
[root@localhost shelldir]# sh hello.sh
Hello World!
你会看到屏幕上已经输出了【Hello World!】 ,而且应该还会听到【咚】一声,这是因为\a 的这个转义字符,\a表示响铃字符,不过echo必须加上 -e的选项才行。
简单的shell脚本练习
练习会用到 date,echo,以及,bc命令如果不了解可以参考这篇博客
https://blog.csdn.net/qq_52089863/article/details/130422168?spm=1001.2014.3001.5501
简单案例
交互式脚本:变量内容由用户决定
很多时候我们需要用户输入一些内容,好让程序可以顺利运行。大家应该都有安装过软件的经验,安装的时候,它不是会问你【安装到哪个目录去】吗?那个让用户输入数据的操作,就是让用户输入变量内容。
请你以read命令的用途,编写一个脚本,它可以让用户输入:1. first name 2. last name 最后在屏幕上显示:【Your full name is】的内容:
[root@localhost shelldir]# vim showname.sh
#!/bin/bash
# 程序说明:
# 用户输出自己的外号和全名,程序会输出用户的外号和全名是什么
# 时间:
# 2023/04/27 csq
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
read -p "Please input your nickname:" nickname
read -p "Please input your full name:" fullname
echo -e "\nYour nickname is:${nickname}\nYour full name is:${fullname} \a "
执行结果如下,你能够发现用户自己输入的变量可以让程序所使用,并且将它显示到屏幕上。
[root@localhost shelldir]# sh showname.sh
Please input your nickname:xiaopang
Please input your full name:csqYour nickname is:xiaopang
Your full name is:csq
随日期变化:利用date建立文件
假设我的服务器内有数据库,数据库每天的数据都不太一样,因此当我备份时,我希望每天的数据备份成不同的文件名,这样才能让旧的数据也能够保存下来不被覆盖。应该怎么做呢?
考虑到每天的【日期】并不相同,所以将文件取成类似backup.2023-04-27.data,就可以每天一个不同的文件名了,那么2023-04-27怎么来呢?这就是重点。接下来出一个相关的例子:假设我想要建立三个空文件(通过touch),文件名最开头由用户输入决定,假如用户输入filename,而今天的日期是2023/04/27,我想要以前天、昨天、今天的日期来建立这些文件,即filename_2023/04/25、filename_2023/04/26、filename_2023/04/27,那该如何是好?
[root@localhost shelldir]# vim create_3_filename.sh
#!/bin/bash
# 程序说明:
# 程序创建三个文件,根据用户输入和日期命令命名
# 时间:
# 2023/04/27 csq
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
# 1.让使用者输入文件名称,并取得fileuser这个变量
echo "I will use 'touch' command to create three files" # 显示信息
read -p "Please input your filenames:" fileuser # 提示使用者输入
# 2.为了避免使用者随意按Enter,利用变量功能分析文件名是否设置?
filename=${fileuser:-"filename"} # 开始判断有否配置文件
# 3.利用date命令来取得所需要的文件名了
date1=$(date --date='2 days ago' +%Y%m%d) # 前两天的日期
date2=$(date --date='1 days ago' +%Y%m%d) # 前一天的日期
date3=$(date +%Y%m%d) # 今天的日期
file1=${filename}${date1} # 下面三行配置文件名
file2=${filename}${date2}
file3=${filename}${date3}
touch "${file1}" # 下面三行创建文件
touch "${file2}"
touch "${file3}"
echo -e "\n"
ls -al "\n${fileuser}"* # 查看创建的文件
echo -e "\a"
执行结果如下
[root@localhost shelldir]# sh create_3_filename.sh
I will use 'touch' command to create three files
Please input your filenames:lll-rw-r--r--. 1 root root 0 4月 27 18:06 lll20230425
-rw-r--r--. 1 root root 0 4月 27 18:06 lll20230426
-rw-r--r--. 1 root root 0 4月 27 18:06 lll20230427
数值运算:简单的加减乘除
我们在之前的博客中写过declare来定义变量类型,当变量定义成为整数后才能够进行加减运算。此外我们也可以利用【$((计算式))】来进行数值运算。可惜的是bash shell里面默认仅支持到整数的数据而已。例如:我们要让用户输入两个变量,然后将两个变量的内容相乘,最后输出相乘的接管,那可以怎么做呢?
[root@localhost shelldir]# vim chengfa.sh
#!/bin/bash
# 程序说明:
# 用户输入2个整数;计算两个数字的乘积
# 时间:
# 2023/04/27 csq
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
read -p "Please input No.1 int:" onenumber
read -p "Please input NO.2 int:" twonumber
product= $((${onenumber}*${twonumber}))
echo -e "\nproduct is ${product} \a"
执行结果
[root@localhost shelldir]# sh chengfa.sh
Please input No.1 int:999
Please input NO.2 int:888product is 887112
在数值运算上面可以使用【declare -i product=${onenumber}*${twonumber}】,也可以使用上面的方式来进行。比较建议使用这种方法
var=$((运算内容))
这种方法很容易记忆。未来你可以使用这种方式来计算。至于数值运算上的处理,则有+、-、*、/、%等。%是取余的,举例来说,15对7取余数,结果就是15=2*7+1,所以余数就是1
[root@localhost shelldir]# echo $((15 % 7))
1
如果你要计算含有小数点的数据时,其实可以通过bc这个命令的协助
[root@localhost shelldir]# echo "123.456*789.123" | bc
97421.969
数值运算:通过bc计算Pi(圆周率)
其实计算Pi,小数点以下位数可以无限地扩展下去,而bc提供了一个运算Pi的函数,要使用该函数必须通过bc -l来调用才行。也因为这个小数点的位数可以无限扩展运算的特性存在,所以我们可以通过下面这个小脚本来让用户输入一个【小数点位】,让Pi能够更准确
[root@localhost shelldir]# vim cal_pi.sh
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/shelldir
export PATH
echo -e "This program will calculate pi value.\n"
echo -e "Your should input a float number to calculate pi value.\n"
read -p "The scale number (10~10000) ?" checking
num=${checking:-"10"} # 判断是否有输入数值,如果没有默认输入10
echo -e "Starting calcuate pi value . Be patient.\n"
time echo "scale=${num}; 4*a(1)" | bc -lq
上述数据中,那个4*a(1) 是bc主动提供的一个计算Pi的函数,至于scale就是要bc计算几个小数点位数的意思。scale的数值越大,代表Pi要被计算得越精确,当然用掉的时间就会越多。因此,你可以尝试输入不同的数值看看,不过最好不要超过5000,因为会算很久。会让COU达到高负载的状态。
脚本的执行方式差异(source、sh script、./script)
不同的脚本执行方式会造成不一样的结果,尤其对bash的环境影响很大。脚本的执行除了前面使用的【sh script】 以外还可以利用 【source 】或小数点【.】来执行。那么这些执行方式有何不同呢?
利用直接执行的方式来执行脚本
当使用直接命令执行(不论是绝对路径/相对路径还是${PATH}内),或是利用bash(或sh)来执行脚本时,该脚本都会使用一个新的bash环境来执行脚本内的命令。也就是说,使用这种执行方式时,其实脚本是在子进程的bash内执行的。在之前的博客写过 export 功能,在里面写过子进程和父进程概念性的问题,重点在于【当子进程完成后,在子进程内的各项变量或操作会结束而不会传回到父进程中】
我们使用上面缩写的showname.sh脚本做个实验,这个脚本可以让用户设置两个变量,分别是firstname与lastname。想一想,如果你直接执行该行命令,该命令帮你设置的firstname会不会生效呢?
[root@localhost shelldir]# echo ${nickname} ${fullname}<==两个变量并不存在
[root@localhost shelldir]# sh showname.sh
Please input your nickname:xiaopang # 这里是用户自己输入的变量
Please input your full name:csqYour nickname is:xiaopang # 脚本运行成功,这两个变量有效
Your full name is:csq
[root@localhost shelldir]# echo ${nickname} ${fullname}<== 事实上,这两个变量在父进程的bash中还是不存在的
上面的结果很奇怪,怎么我已经利用showname.sh设置号的变量竟然在bash环境下面无效。我们以下图说明
当你使用直接执行的方法来处理时,系统会给予一个新的bash让我们来执行showname.sh 里面的命令,因此你的nickname和fullname等变量其实是在下图的子进程bash内执行的,当showname.sh执行完毕后,子进程bash内的所有数据便被删除,因此【echo ${nickname} ${fullname}】时,就看不到任何东西了。
利用source来执行脚本:在父进程中执行
如果你使用source 来执行命令那就不一样了,同样的脚本我们来执行看看
[root@localhost shelldir]# source showname.sh
Please input your nickname:xiaopang
Please input your full name:csqYour nickname is:xiaopang
Your full name is:csq
[root@localhost shelldir]# echo ${nickname} ${fullname}
xiaopang csq # 有数据产生了!
竟然生效了,没错因为source对脚本的执行方式可以使用下面的图例来说明,showname.sh会在父进程中执行,因此各项操作都会在原本的bash内生效。这也是为啥你不注销系统而要让某些写入~/.bashrc的设置生效时,需要使用【source ~/.bashrc】而不能使用【bash ~/.bashrc】。
相关文章:

什么是shell脚本和简单shell脚本练习
文章目录 什么是shell脚本和简单shell脚本练习什么是shell脚本为什么要学习shell脚本第一个脚本编写与执行编写第一个脚本 简单的shell脚本练习简单案例交互式脚本:变量内容由用户决定随日期变化:利用date建立文件数值运算:简单的加减乘除数值…...
MySQL MyBatis
MySQL从表中随机查一条数据 SELECT * FROM address ORDER BY RAND() LIMIT 1MySQL查询表是否存在 select count(*) from information_schema.TABLES where table_name #{tableName}插入数据插入随机的uuid <insert id"insertComment" parameterType"com.…...

Leetcode力扣秋招刷题路-0802
从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 802. 找到最终的安全状态 有一个有 n 个节点的有向图,节点按 0 到 n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示, graph[i]是与节点 i 相邻的节…...

编程中最难的就是命名?这几招教你快速上手
作者:陈立(勤仁) 你可不能像给狗狗取名字那样给类、方法、变量命名。仅仅因为它很可爱或者听上去不错。 在写代码的时候,你要经常想着,那个最终维护你代码的人可能将是一个有暴力倾向的疯子,并且他还知道你住在哪里。 01 为什么…...

NUXT规范及常见问题
props中不要使用Web环境才有的对象,服务端渲染的时候会失败 使用<Nuxt/>组件代替<router-view/>,使用<NuxtLink/>代替<router-link/>static目录下的资源是静态资源,不应该通过import或../static/img/logo.png等方式…...

2023年Q1天猫空调品牌销量排行榜
如今,空调的普及水平较高,空调行业进入存量换新为主的发展阶段。 根据鲸参谋数据分析平台的相关数据显示,2023年Q1在天猫平台上,空调的销量将近100万件,销售额将近30亿,同时,空调产品的产品均价…...

如何在比特币系统内创造人工生命
信息来源:coingeek.com 自2015年以来,关于比特币能否进行复杂计算以及比特币是否“图灵完备”的争论一直在持续。不幸的是,现在存在着一种流传甚广的谬论,有人说比特币并非图灵完备的,它不能像以太坊区块链那样进行复杂…...

除了Figma,再给你介绍10款好用的协同设计软件
组织结构越来越复杂,团队中的每个人都有独特的技能、经验和专业知识。我们怎样才能让团队更好地合作?在这种情况下,协同设计应运而生。 UI的未来是协同设计!如果你想把握未来的设计趋势,不妨从使用高效的协同设计软件…...

信息安全复习五:数据加密标准(DES)
一、本章梗概 1.主要内容:分组密码、分组密码用到的关键技术和结构、对称密钥密码典型算法DES 2.思考问题: ①按照明文被处理的形式,DES属于标准的分组密码 ②根据密钥的使用数量,DES属于标准的对称密码 3.内容回顾: …...

Java ---包装类
(一)包装类概念 官方说法: Java是面向对象的语言,但是为了便于开发者的使用,Java中却沿用了C语言的基本数据类型,在进行基本的数据计算时,开发者可以直接使用基础类。但是当需要和Java其他对象…...

Baumer工业相机中偏振相机如何使用Baumer堡盟GAPI SDK来进行偏振数据的计算转换输出(C#)
项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具…...
MSVC(Microsoft Visual C++) 中运行库的链接方式MD和MT的区别
问题描述 MSVC(Microsoft Visual C) 中运行库的链接方式MD和MT的区别 问题解答 在MSVC编译器中,运行库(Runtime Library)有两种链接方式:MD(Multithread-DLL)和MT(Multithread)。这两种链接方式的主要区…...

设计模式之解释器模式(C++)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、解释器模式是什么? 解释器模式是一种行为型的软件设计模式,定义了一个解释器,来解释给定语…...
基于MATLAB编程的粒子群算法优化BP神经网络风电功率预测,基于PSO-BP的风电功率预测
目录 摘要 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 粒子群算法的原理及步骤 基于粒子群算法改进优化BP神经网络的风电功率 matlab代码 代写下载链接:https://download.csdn.net/download/a…...
开心档之C++ 字符串
C 字符串 目录 C 字符串 C 风格字符串 实例 实例 C 中的 String 类 实例 C 提供了以下两种类型的字符串表示形式: C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 …...

Java Collection源码分析(JDk corretto 11)
文章目录 Collection 系列源码分析 (JDK Amazon corretto 11)Collection接口Iterable接口 子接口 QueueQueue的子接口 Deque双端队列 子接口ListArrayList 实现类序列化与反序列化(后续解决)获取Calss对象的方式 主要有三种:Arrays工具类System类 LinkedList实现类t…...

13种权重的计算方法
权重计算方法有很多种,不同的方法有不同的特点和适用情况。AHP层次分析法和熵值法在权重计算中属于比较常用的方法。除此之外,还有一些与权重计算相关的方法,今天一文总结了13种与权重计算相关的方法,大家可以对比选择使用。 一、…...

Devops和Gitops区别
一. 什么是devops DevOps 是一种开发(Dev)和运维(Ops)之间协作和沟通的文化、流程和工具的实践方法。它强调迭代、快速交付和持续集成/持续交付,旨在加速软件交付的速度、质量和稳定性。 DevOps 的核心目标是通过自动…...

拿下多家车企定点!4D毫米波雷达「域」系统首发出道
从1R、2R、3R到整车360感知方案,毫米波雷达的前装市场需求量依然保持着快速增长的态势。 高工智能汽车研究院监测数据显示,2022年中国市场(不含进出口)前装标配搭载ADAS毫米波雷达(前向后向盲区)交付1795.…...

【FATE联邦学习】FATE联邦学习使用GPU、指定cuda下标
问题 FATE框架1.x支持GPU训练吗? 寻找 先看了官网,搜官网,发现还是有的。 打开第一个后,里面可以用training param指定各个client的训练GPU,但是好像都是在large language model的。 而在文档中搜寻到的gpu…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...