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,不忽略

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

墨迹天气商业版UTF-8模板,Discuz3.4灰白色风格(带教程)

1.版本支持&#xff1a;Discuzx3.4版本&#xff0c;Discuzx3.3版本&#xff0c;DiscuzX3.2版本。包括网站首页&#xff0c;论坛首页&#xff0c;论坛列表页&#xff0c;论坛内容页&#xff0c;论坛瀑布流,资讯列表页(支持多个)&#xff0c;产品列表页(支持多个)&#xff0c;关于…

Visual Components软件有哪些用途 衡祖仿真

Visual Components是一款用于制造业虚拟仿真的软件&#xff0c;主要用于工业自动化和制造领域。我们一起来看一下该软件有哪些功能吧&#xff01; 1、工厂仿真 Visual Components可以建立虚拟的工厂环境&#xff0c;模拟和优化生产流程。用户可以创建工厂布局、定义设备和机器人…

多年没有遇到如此流畅的面试了

美东一公司的面试&#xff0c;有多年没有遇到如此流畅的面试了。 本来说的面试时间是 30 分钟&#xff0c;这个还是第一轮处于电话面试那种&#xff0c;但是不知道为什么最后面试整个时间都延长到了快一个小时&#xff0c;貌似双方都还继续沟通下&#xff0c;有点意犹未尽的感觉…

【Java】正则表达式,校验数据格式的合法性。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 正则表达式 正则表达式&#xff1a; ①可以校…

“第四十五天” 数据结构基本概念

目前看的有关数据结构的课&#xff0c;估计这周就看完了&#xff0c;但感觉差很多&#xff0c;还是和c一样&#xff0c;这样过一下吧。但可能比较急&#xff0c;目前是打算争取寒假回家之前把四大件都先大致过一遍。 数据结构里面有很多新的定义和概念&#xff0c;学到现在&am…

R语言中fread怎么使用?

R语言中 fread 怎么用&#xff1f; 今天分享的笔记内容是数据读取神器fread&#xff0c;速度嘎嘎快。在R语言中&#xff0c;fread函数是data.table包中的一个功能强大的数据读取函数&#xff0c;可以用于快速读取大型数据文件&#xff0c;它比基本的read.table和read.csv函数更…

SELECT COUNT(*) 会造成全表扫描吗?

前言 SELECT COUNT(*)会不会导致全表扫描引起慢查询呢&#xff1f; SELECT COUNT(*) FROM SomeTable 网上有一种说法&#xff0c;针对无 where_clause 的 COUNT(*)&#xff0c;MySQL 是有优化的&#xff0c;优化器会选择成本最小的辅助索引查询计数&#xff0c;其实反而性能…

物联网_00_物理网介绍

1.物联网为什么会出现? 一句话-----追求更高品质的生活, 随着科技大爆炸, 人类当然会越来越追求衣来伸手饭来张口的懒惰高品质生活, 最早的物联网设备可以追溯到19世纪末的"在线可乐售卖机"和"特洛伊咖啡壶"(懒惰的技术人员为了能够实时看到物品的情况而设…

spring cloud Eureka集群模式搭建(IDEA中运行)

spring cloud Eureka集群模式搭建&#xff08;IDEA中运行&#xff09; 新建springboot 工程工程整体目录配置文件IDEA中部署以jar包形式启动总结 新建springboot 工程 新建一个springboot 工程&#xff0c;命名为&#xff1a;eureka_server。 其中pom.xml文件为&#xff1a; …

如何理解TCP/IP协议?

一、是什么 TCP/IP&#xff0c;传输控制协议/网际协议&#xff0c;是指能够在多个不同网络间实现信息传输的协议簇 TCP&#xff08;传输控制协议&#xff09; 一种面向连接的、可靠的、基于字节流的传输层通信协议 IP&#xff08;网际协议&#xff09; 用于封包交换数据网…

笔记本电脑Windows10安装

0 前提 安装windows10的电脑为老版联想笔记本电脑&#xff0c;内部没有硬盘&#xff0c;临时加装了1T的硬盘。 1u盘准备 准备u盘&#xff0c;大小大于16G。u盘作为系统盘时&#xff0c;需要将内部的其他文件备份&#xff0c;然后格式化。u盘格式化后&#xff0c;插入一款可以…

马赫数相关函数

1 函数 k是常数&#xff0c;Ma是变量 2应用程序 点击上方资源下载 3 计算 3.1 c语言 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h>#define k 1.4 // k为常数// 定义的函数 double T(double Ma) {return pow((1 (k - 1) / 2 * Ma …

SpringCloud 微服务全栈体系(二)

第三章 Eureka 注册中心 假如我们的服务提供者 user-service 部署了多个实例&#xff0c;如图&#xff1a; 思考几个问题&#xff1a; order-service 在发起远程调用的时候&#xff0c;该如何得知 user-service 实例的 ip 地址和端口&#xff1f;有多个 user-service 实例地址…

Cloud Studio连接MySQL,Access denied for一系列问题

官方文档有写如何安装Mysql $ apt update $ apt install mysql-server mysql-client -y$ service mysql start mysql -uroot -p123456进入MySQL命令行 问题出在连接数据库这一步&#xff0c;命令行能进去&#xff0c;但是数据库插件和代码都连不上 Access denied for 大概率…

mybatisplus开启sql打印的三种方式

1、在application.yml文件中添加mybatisplus的配置文件 使用mybatisplus自带的log-impl配置&#xff0c;可以在控制台打印出sql语句、执行结果的数据集、数据结果条数等详细信息&#xff0c;这种方法适合再调试的时候使用&#xff0c;因为这个展示的信息详细&#xff0c;更便于…

攻防世界web篇-cookie

看到cookie立马就会想到F12键看cookie的一些信息 我这个实在存储里面看的&#xff0c;是以.php点缀结尾&#xff0c;可以试一下在链接中加上.php 得到的结果是这样 这里&#xff0c;我就只能上csdn搜索一下了&#xff0c;看到别人写的是在get请求中可以看到flag值

如何使用VSCode将iPad Pro转化为功能强大的开发工具?

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7. ipad远…

网络协议--ARP:地址解析协议

4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址。数据链路如以太网或令牌环网都有自己的寻址机制&#xff08;常常为48 bit地址&#xff09;&#xff0c;这是使用数据链路的任何网络层都必须遵从的。一个网络如以太网可以同时被不同的网络层使用。例如&#…

短视频矩阵系统源码(搭建)

短视频矩阵源码的开发路径分享如下&#xff1a; 1、首先&#xff0c;确定项目需求和功能&#xff0c;包括用户上传、编辑、播放等。 2、其次&#xff0c;搭建开发环境&#xff0c;选择合适的开发工具和框架。 3、然后&#xff0c;进行项目架构设计和数据库设计&#xff0c;确…

【力扣周赛】第 367 场周赛(⭐二维数组当成一维数组,前后缀分解)

文章目录 竞赛链接Q1&#xff1a;100096. 找出满足差值条件的下标 I竞赛时代码——暴力双循环 Q2&#xff1a;100084. 最短且字典序最小的美丽子字符串竞赛时代码——双指针 Q3&#xff1a;100101. 找出满足差值条件的下标 II竞赛时代码——记录可用最大最小值下标 Q4&#xff…