Linux入门攻坚——4、shell编程初步、grep及正则表达式
bash的基础特性(续):
1、提供了编程环境:
编程风格:过程式:以指令为中心,数据服务于执行;对象式:以数据为中心,指令服务于数据
shell编程,编译执行。基本结构:数据存储:变量、数组,表达式,语句。(命令的堆砌)
shell脚本:文本文件
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shebang,告诉cpu解释器是什么,由谁来解释其后的内容。
magic number:魔数 :#!
第一个shell脚本:first.sh
#!/bin/bash
#
cat /etc/fstab
wc -l /etc/fstab
shell脚本就是一个文本文件,如何运行呢?就靠第一行,来告诉cpu使用/bin/bash来执行。所以下面的命令都是bash运行的。就像我们在bash交互界面输入cat,然后输入wc命令一样,顺序执行,将结果输出。
运行:在当前目录下直接运行first.sh:提示![]()
linux不像window,默认会先找当前目录,而是根据PATH环境变量的值,顺序查找first.sh。其值:
因为并没有当前目录,我的当前目录是~/myscripts/,所以要给定明确的路径,如:./firsht.sh或绝对路径:~/myscripts/first.sh
上一篇学过文件权限时,提到过,创建的文件权限默认是没有执行权限x的,所以这里提示没有权限执行。增加执行权:
执行:

也可以不为文件赋执行权限,而是手动启动,即执行:bash first.sh,即不使用shebang,而是我们手动指定了解释器。

变量:命名的内存空间。
变量类型:数据存储格式、存储空间大小、能参与的运算、数据的表示范围。字符和数值——整型、浮点型
编程语言:强类型---定义变量时必须指定类型、弱类型---shell是弱类型,类型隐式转换,变量无需事先定义可直接调用。
逻辑运算:结果true、false。与&&、或||、非!、异或
短路运算:
与:第一个为0,结果必为0,第一个为1,第二个必须参与运算。
或:第一个为1,结果必定为1,第一个为0,第二个必须参与运算。


Linux上文本处理三剑客:
grep:文本过滤(模式:pattern)工具 grep、egrep、fgrep
sed:stream editor,文本编辑工具
awk:Linux上的实现gawk,文本报告生成器。
grep:Global search REgular expression and Print out theline
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查:打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能。
分两类:基本正则表达式:BRE;扩展正则表达式:ERE,grep -E,egrep
正则表达式引擎:
grep [OPTIONS] PATTERN [FILE...]
--color=auto:对匹配到的文本着色显示
-v : 反向匹配,显示不匹配的行
-i : 匹配时忽略大小写
-o : 仅显示匹配的字串
-q : 静默模式,不输出任何信息
-A #: after,匹配行及后#行
-B # :before,匹配行及前#行
-C # :context,前后各#行
-E : 使用ERE



基本正则表达式元字符:
字符匹配:
. :匹配任意单位字符;[] :匹配指定范围内的任意单个字符;[^]:匹配指定范围外的任意单个字符;[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]、
匹配次数:用在要指定次数的字符后面,指定前面的字符要出现的次数;工作于贪婪模式。
* :匹配前面的字符任意次,仅表示次数。grep “x*y” ——abxy,xay,都可以匹配
.* : 任意长度的任意字符
\? :匹配其前面的字符0或1次。
\+ :匹配前面字符至少1次。
\{m\} : 匹配前面的字符m次。grep '[:alpha:]\{3\}y'
\{m,n\} : 匹配前面的字符至少m次,至多n次。
\{0,n\},匹配前面字符至多n次;\{m,\},匹配前面字符至少m次。
位置锚定:
^ : 行首锚定。用于模式的最左侧 ^root
$ : 行尾锚定。用于模式的最右侧 root$
^PATTERN$ :用于模式匹配整行, ^$:空行,^[[:space:]]*$:空白行
\< 或 \b: 词首锚定,用于单词模式的左侧:
\> 或 \B: 词尾锚定,用于单词模式的右侧:
\<PATTERN\> : 匹配整个单词
分组:
\(\) : 将一个或多个字符捆绑在一起,作为一个整体进行处理;
注意:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量命名方式为:\1,\2,\3...
\1 :从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身。
egrep及扩展的正则表达式:
egrep [OPTIONS] PATTERN [FILE...]
扩展正则表达式的元字符:
字符匹配:. 、[]、 [^]
次数匹配:*:任意次、?:0或1次、+:1次或多次、{m}:m次、{m,n}:至少m,至多c次。
锚定:^、$、\< 或\b、\>或\b、
分组:();后向引用,\1,\2\3...
或者:a|b 如: C|cat : C或cat,(C|c)at:Cat或cat
fgrep:不支持正则表达式搜素。
bash基础特性(续)
变量类型:
bash中的变量的种类:
根据变量的生效范围等标准:
本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效。
环境变量:生效范围为当前shell进程及其子进程。declare -x name=value
局部变量:生效范围为当前shell进程中某代码片段(通常指函数)。
位置变量:$1,$2,$3...来表示,用于让脚本在脚本代码中调用通过命令行传递给他的参数。
特殊变量:$?,$0,$*,$@,$#
本地变量:
变量赋值:name='value'
value:1)可以是直接字串---name="username" ;2)变量引用---name="$username";3)命令引用---name=`COMMAND`,注意是反引号,name=$(COMMAND)
变量引用:${name},$name
" ":弱引用,其中的变量引用会被替换为变量值;
' ' :强引用,其中的变量引用不会被替换为变量值,保持原字符串。
显示已定义的变量:set
销毁变量:unset name
环境变量:
变量声明、赋值:
export name=value
declare -x name=value
变量引用:$name,${name}
显示所有环境变量:export 、 env、 printenv
销毁:unset name
bash有许多内建的环境变量:PATH、SHELL、UID、HISTSIZE、HOME、PWD、OLD、HISTFILE、PS1、
变量命名法则:不能使用关键字;只能使用字母、数字及下划线,且不能以数字开头;见名知义;
只读变量:readonly name ; declare -r name ;不能修改不能unset销毁
位置变量:接收参数。
$* :传递给脚本的所有参数;
$@:传递给脚本的所有参数;
$#:传递给脚本的所有参数的个数;
shift #: 换岗操作
bash的配置文件:
按生效范围划分,两类:
全局配置:
/etc/profile ,以及/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
按功能划分,两类:并不绝对
profile类:为交互式登录的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
个人:~/.bash_profile
功用:1)用于定义环境变量;2)运行命令或脚本;
bashrc类:为非交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:1)定义命令别名;2)定义本地变量;
shell登录:
交互式登录:直接通过终端输入账号密码登录;使用“su - UserName”或“su -l UserName”
读取顺序: /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录:su UserName;图形界面下打开的终端;执行脚本;
读取顺序: ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
bash中的算术运算:+、-、*、/、%、**
实现算术运算:1)let var=算术表达式;2)var=$[算术表达式] ;3)var=$((算术表达式));4)var=$(expr arg1 arg2 arg3 ...) ,注意有些符号要转义;
bash内建的随机数生成器:$RANDOM
增强型赋值:*=,/=,%=,+=,-+ 如:let count+=1;自增、自减:let var++,let var--
条件测试:专用的测试表达式需要由测试命令辅助完成测试过程:
测试命令:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION前后必须有空白字符。
bash的测试类型:
数值测试:-gt:大于; -ge:大于等于; -eq:等于; -ne:不等于; -lt:小于; -le:小于等于
字符串测试:==/=:等于; >:大于;<:小于; !=:不等于; =~:左侧字符串能否被右侧的PATTERN所匹配; -z “STRING”:测试字符串是否为空,空为真;-n “STRING”:测试字符串是否不空,不空为真;
注意:用于字符串比较时用到的操作数都应该使用引号。
文件测试:man bash
存在性测试
-a FILE:文件存在
-e FILE :文件存在则为真,不存在为假
存在性及类别测试:
-b FILE:存在且为块设备
-c FILE:存在且为字符设备
-d FILE:存在且为目录
-f FILE:存在且为普通文件
-h FILE或-l:存在且为符号链接
-p FILE:存在且为命名管道
-S FILE:存在且为套接字
文件权限测试:
-r FILE:存在且可读
-w FILE:存在且可写
-x FILE:存在且可执行
文件特殊权限测试:
-g FILE:存在且拥有sgid权限
-u FILE:存在且拥有suid权限
-k FILE:存在且拥有sticky权限
文件大小测试:
-s FILE:存在且非空
文件打开性测试:
-t fd:fd表示的文件描述符是否已经打开且与终端相关
-N FILE:文件自上一次被读取之后是否被修改过
-O FILE:当前用户是否为文件属主
-G FILE:当前有效用户是否为文件的属组
双目测试:
FILE1 -ef FILE :1与2是否指向同一个设备上的相同inode
FILE1 -nt FILE :1是否新于2
FILE1 -ot FILE :1是否旧于2
组合测试条件:
逻辑运算:两种方式:
1)CMD1&&CMD2 、CMD1||CMD2、 !CMD ;
2)EXPRESION1 -a EXPRESION2、EXPRESION1 -o EXPRESION2、
bash自定义退出状态码:exit [n]
注意:脚本中一旦遇到exit命令,脚本会立即终止,终止退出状态取决于exit命令后面的数字;如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码。
vim编辑器
vi:Visual Interface:文本编辑器:行编辑器--sed、全屏编辑器--nano
vi是一个模式化的编辑器:
基本模式:编辑模式---命令模式 ; 输入模式: ;末行模式:内置的命令行接口 ;
打开文件:vim [option] file... ;
+# :打开文件后,直接让光标处于第#行的行首;
+/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首;
模式转换:
编辑模式 --> 输入模式
i :insert,在光标所在处输入;
a:append,在光标所在处后面输入;
o:在当前光标所在行的下方打开一个新行;
I:在当前光标所在行行首输入
A:在当前光标所在行行尾输入
O:在当前光标所在行上方打开一个新行输入
c:改变命令,删空并输入
C:
输入模式 --> 编辑模式 : ESC
编辑模式 --> 末行模式 : :
末行模式 --> 编辑模式 : ESC
关闭文件:
:q :退出; :q!:强制退出,丢弃做出的修改; :qw :保存退出;:x : 保存退出
:w /PATH/TO/SOMEWHERE :另存为; ZZ:保存退出;
光标跳转:
字符间跳转:h左,j下,k上,l右
#COMMAND:跳转由#指定的个数的字符;如7j,向下7行
单词间跳转:
w:下一个单词词首;e:当前或下一个单词的词尾;b:当前或前一个单词词首;
#COMMAND:由#指定一次跳转的单词数
行首行尾跳转:
^:行首第一个非空白字符; 0:行首; $:行尾
行间跳转:
#G:跳转至#行; G:最后一行; 1G,gg:第一行
句间移动: ) ; (
段落间移动:};{
vim的编辑命令:
字符编辑:
x:删除光标处的字符; #x:删除光标处起始的#个字符;
xp:交换光标所在处及其后面字符的位置。
替换命令:r,replace
r:替换光标所在处的字符; #r:替换光标开始后的#个字符
删除命令:
d:删除命令,可结合光标跳转字符,实现范围删除,如的d$,删到行尾
d$、d^、d0、dw、de、db、#COMMAND
dd:删除光标所在的行; #dd,删多行
粘贴命令:p,put,paste
p:缓冲区中存储的如果为整行,则粘贴至当前光标所在行的下方;否则,粘贴至当前光标所在处后面;
P:缓冲区中存储的如果为整行,则粘贴至当前光标所在行的上方;否则,粘贴至当前光标所在处前面;
复制命令:y,yank
y:复制,工作行为类似于d命令:
y$、y0、y^、 ye、yw、yb、 #COMMAND
yy:复制行; #yy:复制多行;
改变命令:c,change
c:修改,编辑模式-->输入模式
c$、c0、c^、 ce、cw、cb、 #COMMAND
cc:删除并输入新内容; #cc:删除多行并输入新内容
可视化模式:
v:按字符选定; V:按行选定; 经常结合编辑命令:d ,c, y
撤销此前的编辑:
u(undo):撤销此前的操作; #u:撤销此前#次操作
撤销此前的撤销:Ctrl + r
重复前一个编辑操作:. 点号
翻屏操作:
Ctrl+f : 向尾部翻一屏;
Ctrl+b:向首部翻一屏;
Ctrl+d :向尾部翻半屏;
Ctrl+u:向首部翻半屏;
vim中的末行模式:
(1)地址定界; —— :start_pos,end_pos
#:具体第#行
#,#:从左侧#表示行起始,到右侧#表示行结尾
#,+#:从左侧#表示行起始,加上右侧#表示的行数
.:当前行
$:最后一行 .,$-1
%:全文,相当于1,$
/pat1/, /pat2/ : 从第一次被pat1模式匹配的行开始,到第一次被pat2模式匹配的行结尾
使用方式:
后跟一个编辑命令: d、y、w 、r
w /PATH/TO/SOMEWHERE :将范围内的行另存至指定文件;
r /PATH/TO/SOMEWHERE :在指定位置插入指定文件中的所有内容
(2)查找
/PATTERN :从当前光标所在处向文件尾部查找;
?PATTERN :从当前光标所在处向文件首部查找;
n、N,同方向、反方向跳转
(3)查找并替换
s:在末行模式下完成查找替换操作
s/要查找的内容/替换为的内容/修饰符:要查找的内容可使用模式;替换的内容不能使用模式,但可以使用\1,\2,...等向后引用符号,还可以使用“&”引用前面查找时查找到的整个内容;
修饰符:i:忽略大小写;g:全局替换,默认情况下,每行只替换第一次出现;
:.,$s/r\(..\)t/R\1T/g
查找替换中的分隔符/可替换为其他字符,如:s@@@、s###
多文件模式:
vim FILE1 FILE2 FILE3 ...
:next 下一个文件; :prev 前一个; : first,第一个; :last,最后一个
:wall 保存所有; :qall,退出所有。
窗口分隔模式:
vim -o|-O FILE1 FILE2 FILE3 ... :-o,水平分隔;-O,垂直分隔
在窗口间切换:Ctrl+w,Arrow
单文件窗口分割:Ctrl+w,s:split,水平分隔; Ctrl+w,v:vertical,垂直分隔
定制vim的工作特性:
配置文件:
全局:/etc/vimrc
个人:~/.vimrc
末行:当前vim进程有效
(1)行号:set number,set nu,显示行号;setnonumber,set nonu,取消行号
(2)括号匹配:set showmatch,set sm 匹配;set nosm,取消匹配
(3)自动缩进:set ai ,启用;set noai 取消
(4)高亮搜索:set hlsearch ,启用;set nohlsearch,取消
(5)语法高亮:syntax on,启用;syntax off,取消
(6)忽略字符的大小写:set ic,忽略;set noic,不忽略
相关文章:
Linux入门攻坚——4、shell编程初步、grep及正则表达式
bash的基础特性(续): 1、提供了编程环境: 编程风格:过程式:以指令为中心,数据服务于执行;对象式:以数据为中心,指令服务于数据 shell编程,编译执…...
TCP/IP(二十二)TCP 实战抓包分析(六)TCP 快速建立连接
一 TCP Fast Open 快速建立连接 说明: 之前讲解TCP 相关知识点遗漏了这个知识点,补充上 ① TFO简介 ② 请求 Fast Open Cookie过程 "原理图" ③ 真正开始 TCP Fast Open 重点: TFO 使 SYN包 可以包含payload 数据 ④ 抓包分析 1、…...
IDEA如何拉取gitee项目?
1.登录gitee 说明:打开idea,在设置上面搜索框输入gitee,然后登录gitee注册的账号。 2. 创建gitee仓库 说明:创建idea中的gitee仓库。 3.寻找项目文件 说明:为需要添加gitee仓库的项目进行添加。 4.项目右键 说明&a…...
视频编辑不求人,教你一招制胜批量添加封面
视频添加封面是一个相当简单的任务,您只需要一款专门的软件,就能轻松搞定!下面就是详细教程啦! 首先,您需要在浏览器中搜索“固乔智剪软件”,进入官网并下载这款软件。固乔智剪软件是一款非常专业的视频剪辑…...
产品的竞争力是什么
产品的竞争力归根到底是3点:功能,性能,容量。 功能 我这个产品完成了别人没有实现的功能,而且是用户需要的。解决了客户的痛点 性能 我这个产品的功能虽然别人有,但是我性能好,性能好意味着干同样的活给…...
vue3 拖拽插件 Vue3DraggableResizable
Vue3DraggableResizable 拖拽插件的官方文档 一、Vue3DraggableResizable 的属性和事件 1、Vue3DraggableResizable 的属性配置 属性类型默认值功能描述示例initWNumbernull设置初始宽度(px)<Vue3DraggableResizable :initW“100” />initHNumb…...
VUE父组件向子组件传递数据和方法
文章目录 1 父组件写法2 子组件写法 1 父组件写法 父组件参数和方法 data() {return {// 遮罩层loading: true,// 表格数据yfeList: []}}导入组件 import yfTable from "/views/yf/yfTable.vue";组件 components: {yfTabTable},传值使用 <yfTabTable :loadin…...
NPI加速器在烽火科技SMT车间的应用:贴片机程序制作效率的革新
烽火科技,一个在国内颇具知名度的高科技企业,坐落于武汉光谷的SMT车间中,机器嗡嗡作响,作业员们忙碌地进行着生产。工厂使用的是ASM的贴片机,使用Sipalce Pro作为其编程软件。然而,在高效的生产线背后&…...
如何给照片添加水印?请看下面3个简单教程
如何给照片添加水印?随着智能手机的普及和不断提升的拍摄技术,如今人们可以轻松使用手机进行高质量的照片拍摄。从老人到小孩,每个人都可以在日常生活中捕捉到美好瞬间,并将其记录下来。作为一种表达自己的方式,现在手…...
仿写知乎日报第一周
效果图 主要的逻辑 Manager封装网络请求 首先,对于获取网络请求,我是将这些方法封装成了一个类Manager,后续在获取以往的内容时又封装了一个beforeManager类用于网络请求。这里不多赘述,Manager封装网络请求的知识参考我的以往博…...
32二叉树——DFS深度优先遍历
目录 深度优先算法(Depth-First Search,DFS) LeetCode之路——102. 二叉树的层序遍历 分析 深度优先算法(Depth-First Search,DFS) DFS是一种用于遍历或搜索树状数据结构的算法,其中它首先探…...
华为昇腾NPU卡 ChatGLM2模型使用
参考:https://gitee.com/mindspore/mindformers/blob/dev/docs/model_cards/glm2.md#chatglm2-6b 1、安装环境: 昇腾NPU卡对应英伟达GPU卡,CANN对应CUDA底层; mindspore对应pytorch;mindformers对应transformers 本…...
【机器学习】集成模型/集成学习:多个模型相结合实现更好的预测
1. 概述 1.1 什么是集成模型/集成学习 "模型集成"和"集成学习"是相同的概念。它们都指的是将多个机器学习模型组合在一起,以提高预测的准确性和稳定性的技术。通过结合多个模型的预测结果,集成学习可以减少单个模型的偏差和方差&am…...
如何提高广告投放转化率?Share Creators 资产库与Appsflyer营销数据的全面结合
如何提高广告投放转化率?Share Creators 资产库与Appsflyer营销数据的全面结合 全球经济进入了低迷期。 营销成本越来越高, 营销需要更务实,注重投入产出比。众所周知,除了渠道、客群画像以外, 优秀的广告设计图&#…...
《软件方法》2023版第1章(11)1.4.3 具体工作步骤
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.4 应用UML的建模工作流 1.4.3 使用UML建模的工作流步骤 图1-17中“工件形式”一列所列出的图就是本书推荐的在建模工作流ABCD中的UML用法,我用活动图进一步表示建模的步…...
git将当前分支A强制推送远程分支pro上
前言 开发中基于线上分支pro创建了A分支,开发完成之后。又基于线上分支pro创建了B分支,都以此合并到测试分支,两个分支更改中都动用部分共同的文件,这就导致后续开发合并代码越来越乱,这时你想把本地开发的分支强推到…...
【计算机基础】存储器
目录 一.概念二.分类1.按存储介质分类2.按存储方式分类3.按存储器的读写功能分类4.按信息的可保存性分类5.按在计算机系统中的作用分类 三.主存区分SRAM、DRAM、Flash、DDR1.SRAM(静态随机存储器࿰…...
【LCR 159. 库存管理 III】
目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int getrandom(int left,int right,vector<int>& stock){return stock[rand()%(right-left1)left];}void qsort(int l,int r,vector<int>& s…...
Android ADB 常见问题和注意事项
Android ADB 常见问题和注意事项 在使用 ADB 过程中,可能会遇到一些常见问题和需要注意的事项: 1. USB 调试 要使用 ADB,你需要在设备上启用 USB 调试模式。这通常在设备的开发者选项中设置。如果你不能看到开发者选项,可以在设…...
TCP/IP五元组
什么是五元组规则? 五元组是通信术语,英文名称为five-tuple,或5-tuple,五元组包括源IP地址(source IP)、源端口(source port)、目的IP地址(destination IP)、目的端口(destination port) 和 传输层协议(the layer 4 protocol)的五个量集合。…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
