当前位置: 首页 > news >正文

shell脚本基础详细学习(更新中)

shell简单介绍

Shell不仅仅是充当用户与UNIX或者localhost交互的角色,还可以作为一种程序设计
语言来使用。通过Shell编程,可以实现许多非常实用的功能,提高系统管理的自动化水平。
如果有一系列经常需要使用的命令,把它存储在一个文件里,shell可以读取这个文件
并顺序执行其中的命令,我们把这样的文件就叫shell脚本。shell脚本按行解释文件里的命令。

shell脚本的基本元素

对于一个基本的Shell程序来说,应该拥有以下基本元素:
1.声明:声明用哪个命令解释器来解释并执行当前脚本文件中的语句,一般写的解释器为
#!/bin/bash 。
2.命令:可执行语句,实现程序的功能。
3.注释:说明某些代码的功能,通过在代码中增加注释可以提高程序的可读性。

注释

1. 单行注释(#)

在 shell 脚本中,# 符号用于添加单行注释。从 # 开始,一直到这一行的末尾,所有内容都会被解释器忽略。其语法格式为:

# 这是一个单行注释
echo "Hello World"  # 这是行尾注释
2. 多行注释(: '...')

若要添加多行注释,可使用 : '注释内容' 这种形式。需要注意的是,这种注释方式不能嵌套使用。示例如下:

: '
这是一个多行注释
可以包含多行文本
'
echo "Hello World"

另外,还有一种利用未使用变量的替代方法:

if false; then
echo "第一行注释"
echo "第二行注释"
fi

单行注释是最常用的注释方式,而多行注释则适用于需要添加大块说明文字的场景。

3. 多行注释(:配合here document使用)

这是使用 Here Document( heredoc )创建注释块的方式,在 Shell 脚本中非常常见。以下是详细说明:

简单示例

:<<BLOCK
这是一个多行注释
可以包含任意文本,甚至包含 shell 命令、变量等
但不会被执行
BLOCK
  • ::是 Shell 内置命令,相当于 "空操作"(null command),不执行任何操作,仅返回状态码 0。
  • <<BLOCK:Here Document 标记,表示后续内容直到 BLOCK 结束都作为输入传递给 : 命令。
  • BLOCK:自定义的结束标记(可以使用任何合法标识符,如 EOFCOMMENT 等)。

关键点:

  1. 注释块可以包含任意内容

    :<<COMMENT
    这是有效的注释
    $变量不会被解析
    $(命令) 也不会被执行
    even if [ $x -eq 1 ]; then echo "not executed"; fi
    COMMENT
    
  2. 结束标记必须单独一行

    :<<EOF
    正确:EOF 在单独一行
    EOF:<<END
    错误:END 后面有空格或其他字符
    END  
    
  3. 标记名称建议大写:避免与变量名冲突(如 end 可能是已定义的变量)。

 shell脚本编写规范

(1)脚本文件名应见名知意,例如backup_mysql.sh
(2)文件开头指定脚本解释器 #!/bin/sh #!/bin/bash
(3)开头加版本特权等信息
# Date:创建日期
# Author:作者
# Mail:联系方式
# Function:功能
# Version:版本
(4)脚本中尽量不要用中文注释
  别吝啬添加注释,必要的注释方便自己别人理解脚本逻辑和功能;
  尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰;
  单行注释,可以放在代码行的尾部或代码行的上部;
  多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分。
(5)多使用内部命令
  常用的内部命令有:echo、eval、exec、export、read、shift、exit
1、echo是用于终端打印的基本命令,默认情况下,echo 在每次调用后会添加一个换行符
[root@kittod ~]# echo hehe
hehe
[root@kittod ~]# echo haha
haha
[root@kittod ~]# echo "Welcome to bash"
Welcome to bash
[root@kittod ~]# echo 'Welcome to bash'
Welcome to bash

2、上面的方法看起来效果一样,但是在某些场合会得到不一样的结果

[root@free ~]# echo 'the current directory is `pwd`'  单引号
the current directory is `pwd`
[root@free ~]# echo "the current directory is `pwd`"  双引号
the current directory is /root
[root@free ~]# echo "directory is `pwd`"
directory is /root
[root@free ~]# echo "`pwd`"
/root详细解释``作用
1. 命令替换的作用
借助命令替换,能够把命令的输出结果当作参数,嵌入到其他命令之中。就像这样:
echo "当前目录是 `pwd`"  # 先执行 pwd 命令,再把结果(如 /root)嵌入到字符串里
输出结果为:
当前目录是 /root2. 反引号(`)与美元符号加括号($(...))的对比
命令替换有两种表示方式:
传统写法:使用反引号(`命令`)
现代写法:使用 $(命令)
下面是这两种写法的对比示例:
echo "`date`"        # 输出当前日期时间(传统写法)
echo "$(date)"      # 输出当前日期时间(现代写法)
现代写法更加方便简洁,嵌套更加方便,反引号在命令替换中要使用其本身要用转义字符。反引号(`)的核心作用是**执行命令并获取结果**,进而实现动态参数的生成或者信息的嵌入。不过,在新的脚本中,更推荐使用 $(...) 这种写法,因为它更加清晰,还支持嵌套功能。[root@kittod ~]# echo "hehe;hehe"
hehe;hehe
[root@kittod ~]# echo hehe;hehe
hehe
-bash: hehe: command not found

简单示例:

[root@kittod ~]# echo -n i have a cat
i have a cat[root@kittod ~]#
[root@kittod ~]# echo -e i\thave\ta\tcat
ithavetatcat
[root@kittod ~]# echo -e "i\thave\ta\tcat"
i have a cat
[root@kittod ~]# echo "1 2 3"
1 2 3
[root@kittod ~]# echo -e "1\t2\t3"
1 2 3
[root@kittod ~]# echo -e "1 2 3"
1 2 3
#设置字体颜色
[root@kittod ~]# echo -e "\e[1;31m This is red test \e[0m"
This is red test
\e[1;31m 将颜色设置为红色, \e[0m 将颜色重置,使用时只需要更换颜色代码即可
颜色代码
重置 0
黑色 30
红色 31
绿色 32
黄色 33
蓝色 34
洋红 35
青色 36
白色 37
#设置背景颜色[root@kittod ~]# echo -e "\e[1;42m This is red test bg \e[0m"
This is red test bg
颜色代码
重置 0
黑色 40
红色 41
绿色 42
黄色 43
蓝色 44
洋红 45
青色 46
白色 47

 连续反斜杠加-e和默认的区别

1. 不带 -e 参数的 echo
bash
echo  today is\\\\\\ sunday
# 输出:today is\\\ sunday
规则:默认情况下,echo 会将连续的反斜杠按奇数 / 偶数处理:
偶数个反斜杠(如 \\、\\\\):每两个反斜杠合并为一个(\\ → \)。
奇数个反斜杠(如 \、\\\):最后一个反斜杠会转义其后的字符(若后无字符则保留)。
步骤解析:
bash
# 原始输入:today is\\\\\\ sunday
# 处理反斜杠:
# 1. \\\\ → \\(前四个反斜杠合并为两个)
# 2. \\ → \(最后两个反斜杠合并为一个)
# 最终输出:today is\\\ sunday2. 带 -e 参数的 echo
bash
echo -e today is\\\\\\ sunday
# 输出:today is\\ sunday
规则:-e 参数启用反斜杠转义功能,但 echo 会先按原始规则处理反斜杠,再应用转义:
偶数个反斜杠:合并后,若剩余偶数个,则继续两两合并;若剩余奇数个,则最后一个用于转义。
特殊转义符(如 \n、\t):会被解释为对应功能。
步骤解析:
bash
# 原始输入:today is\\\\\\ sunday
# 1. 原始反斜杠处理:
#    \\\\ → \\(前四个反斜杠合并为两个)
#    \\ → \(最后两个反斜杠合并为一个)
#    中间步骤:today is\\\ sunday# 2. 应用 -e 参数的转义:
#    \\\ → \\(前两个反斜杠合并为一个,最后一个转义空格失败,保留)
# 最终输出:today is\\ sunday3. 关键区别
参数	反斜杠处理逻辑	示例(输入 \\\\\\)	输出结果
无 -e	奇偶合并,奇数保留最后一个	\\\\\\ → \\\	\\\
-e	先奇偶合并,再转义特殊字符	\\\\\\ → \\\ → \\	\\
4. 常见误区
误解一:认为 -e 会直接解析原始反斜杠。
实际上,echo 会先处理反斜杠(合并 / 转义),再应用 -e 的特殊转义规则。
误解二:连续反斜杠在 -e 下总是成对解析。
只有合并后的奇数个反斜杠中的最后一个才会触发转义,例如:
bash
echo -e '\\\\\n'  # 输出:\\(前四个合并为两个,最后一个转义 \n)5. 如何正确输出多个反斜杠?
输出偶数个反斜杠:直接使用两倍数量的反斜杠。
bash
echo '\\\\'       # 输出:\\(默认模式)
echo -e '\\\\'     # 输出:\\(-e 模式)输出奇数个反斜杠:在 -e 模式下,需要额外的反斜杠来转义。
bash
echo -e '\\\\\\'   # 输出:\\\(前四个合并为两个,最后一个保留)总结
默认 echo:按奇偶合并反斜杠,奇数个保留最后一个。
echo -e:先处理反斜杠,再转义特殊字符(如 \n、\t)。
建议:若需精确控制反斜杠数量,优先使用单引号 ' 包裹字符串,并结合 -e 参数。

文本颜色样式设置代码详解

命令解析
echo -e "\e[1;31m This is red text \e[0m"
echo -e:启用对反斜杠转义字符的解释(如\e、\n等)
\e[1;31m:ANSI 转义序列,用于设置文本样式
\e:转义字符(ASCII 27,也可写作\033或\x1B)
[:控制序列引入符(CSI)
1:设置文本为粗体(可选参数)
31:设置文本颜色为红色(31 代表红色,32 为绿色,33 为黄色,依此类推)
m:设置属性命令
This is red text:实际显示的文本内容
\e[0m:重置所有文本属性,恢复默认样式
输出效果

当你运行这个命令时,终端会显示:

This is red text(实际显示为红色粗体)

然后恢复为默认文本样式。

其他颜色和样式选项

你可以通过修改转义序列中的数字来改变颜色和样式:

# 基本颜色代码
30: 黑色   31: 红色   32: 绿色   33: 黄色
34: 蓝色   35: 紫色   36: 青色   37: 白色# 背景颜色代码(40-47)
40: 黑底   41: 红底   42: 绿底   43: 黄底
44: 蓝底   45: 紫底   46: 青底   47: 白底# 样式代码
0: 重置    1: 粗体    4: 下划线   5: 闪烁    7: 反显

export命令详细解释

一、基本概念

环境变量 是 Shell 中存储的全局变量,可被当前 Shell 和所有子进程访问。而 局部变量 仅在当前 Shell 会话中有效,子进程无法继承。

export 的作用是:

  1. 将当前 Shell 中的局部变量转换为环境变量。
  2. 在定义变量时直接声明其为环境变量。

二、语法格式

export [变量名]=[值]     # 定义并导出新变量
export [变量名]          # 将已存在的局部变量导出为环境变量
export -f [函数名]       # 导出函数,使其在子Shell中可用
export -n [变量名]       # 取消变量的导出状态(使其变为局部变量)
export -p               # 显示所有已导出的环境变量

三、核心用法

bash -c 会创建一个全新的子 shell 进程来执行命令,该子 shell 与当前 shell 相互隔离。用于测试很方便。

1. 定义并导出变量
export NAME="Doubao"    # 定义并导出变量
echo $NAME              # 输出: Doubao# 在子Shell中验证
bash -c 'echo $NAME'    # 输出: Doubao(子Shell继承了环境变量)
2. 导出已存在的局部变量
AGE=25                  # 定义局部变量
export AGE              # 将局部变量导出为环境变量bash -c 'echo $AGE'     # 输出: 25
3. 导出函数
greet() { echo "Hello $1"; }
export -f greet         # 导出函数bash -c 'greet World'   # 输出: Hello World(子Shell可调用该函数)
4. 取消导出状态
export LANG=en_US.UTF-8
export -n LANG          # 取消LANG的导出状态
bash -c 'echo $LANG'    # 输出为空(子Shell无法访问)

四、与变量作用域的关系

变量类型定义方式作用域示例
局部变量NAME=value仅当前 ShellNAME=Doubao; echo $NAME
环境变量export NAME=value当前 Shell 及所有子进程export NAME=Doubao; bash -c 'echo $NAME'
全局变量.bashrc等文件中定义所有新启动的 Shell.bashrc中添加:export PATH="$PATH:/new/dir"

五、常见应用场景

1. 设置 PATH 路径
export PATH="$PATH:/home/user/bin"  # 添加自定义目录到PATH
2. 配置语言环境
export LANG=en_US.UTF-8             # 设置语言编码
3. 在脚本中使用环境变量
# script.sh
#!/bin/bash
echo "Hello $USER, today is $(date +%A)"# 执行脚本(继承当前环境变量)
export USER="Doubao"
./script.sh  # 输出: Hello Doubao, today is Friday
4. 临时测试环境变量
FOO=bar ./command     # 仅在执行command时设置FOO,执行后失效

六、注意事项

  1. 仅对当前 Shell 及子进程有效
    export 设置的变量只在当前 Shell 会话和其启动的子进程中生效。关闭终端后,设置会丢失。

  2. 永久生效需配置文件
    若要每次登录都生效,需将 export 命令添加到 Shell 配置文件中,如:

    # 对所有用户生效
    /etc/profile# 对当前用户生效
    ~/.bashrc  或  ~/.bash_profile
    
  3. 子 Shell 修改不影响父 Shell
    子进程中修改环境变量不会影响父进程:

    bash -c 'export TEST=123'  # 子Shell设置TEST
    echo $TEST                 # 父Shell中TEST仍为空
    

七、与其他命令的对比

命令作用示例
export设置环境变量,使其在子进程中可用export VAR=value
declare声明变量类型(如整型、数组等)declare -i NUM=100
readonly设置只读变量,不可修改或取消readonly PATH
set显示或设置 Shell 选项和变量set -x(开启调试模式)

总结

export 是 Shell 编程中用于管理环境变量的核心工具,通过它可以灵活控制变量的作用域,确保配置在不同进程间传递。合理使用 export 能帮助你更好地管理系统环境和编写可复用的脚本。

read命令详解

在 Bash 中,read 命令用于从标准输入(通常是键盘)读取用户输入,并将其赋值给一个或多个变量。它是交互式脚本、配置读取和数据处理的重要工具。以下是对 read 命令的详细解析:

基本语法

read [选项] [变量名1 变量名2 ...]
  • 功能:读取一行输入,按空格分割后赋值给对应变量。若变量数少于输入字段数,最后一个变量会包含剩余所有字段。
  • 示例
    read name age  # 输入 "Alice 25"
    echo "Name: $name, Age: $age"  # 输出: Name: Alice, Age: 25
    

常用选项

选项功能描述
-p "提示信息"显示提示信息,无需额外使用 echo
-t 超时秒数设置超时时间,超时后返回非零状态(需结合 -n 或 -s 使用)。
-s静默模式,不显示输入内容(适用于密码输入)。
-n 字符数读取指定数量的字符后立即返回,无需按回车。
-r禁用反斜杠 \ 的转义功能(原始输入)。
-d 分隔符使用指定字符作为输入结束标记(默认是换行符 \n)。

选项示例

  1. 带提示信息的输入

    read -p "请输入用户名: " username
    echo "欢迎, $username!"
    
  2. 密码输入(静默模式)

    read -s -p "请输入密码: " password
    echo  # 手动换行
    echo "密码已输入"
    
  3. 限时输入

    if read -t 5 -p "5秒内按Y确认: " answer; thenecho "你输入了: $answer"
    elseecho "超时!"
    fi
    
  4. 读取单个字符

    read -n 1 -p "按任意键继续..."
    echo  # 手动换行
    
  5. 原始输入(保留反斜杠)

    read -r path  # 输入 "C:\Users\Alice"
    echo "$path"  # 输出: C:\Users\Alice(而非 C:UsersAlice)
    

高级用法

  1. 从文件读取

    while read -r line; doecho "读取行: $line"
    done < filename.txt  # 逐行读取文件内容
    
  2. 读取特定分隔符的输入

    read -d '/' var1 var2  # 输入 "apple/banana"
    echo "Var1: $var1, Var2: $var2"  # 输出: Var1: apple, Var2: banana
    
  3. 读取数组

    read -a fruits  # 输入 "apple banana cherry"
    echo "第二个水果: ${fruits[1]}"  # 输出: banana
    

返回状态与错误处理

  • 成功:读取到有效输入时返回状态码 0
  • 失败
    • 超时(-t 选项)返回非零状态。
    • 读取到文件结束符(EOF,如按 Ctrl+D)返回非零状态。

示例:检查超时

if read -t 3 -p "快速回答: " answer; thenecho "回答: $answer"
elseecho "超时!" >&2exit 1
fi

注意事项

  1. 输入分割规则read 默认使用 IFS(内部字段分隔符,默认为空格、制表符、换行符)分割输入。如需自定义分割符,可临时修改 IFS

    IFS=',' read -r a b c <<< "1,2,3"
    echo "a=$a, b=$b, c=$c"  # 输出: a=1, b=2, c=3
    
  2. 空变量处理:若用户直接按回车,变量会被赋值为空字符串。可通过 read -e 启用 readline 编辑功能,提供默认值:

    read -e -p "请输入文件名 [default.txt]: " file
    file=${file:-default.txt}  # 使用默认值
    

总结

read 命令是 Bash 中处理用户输入的核心工具,通过灵活搭配选项(如 -p-s-t),可以实现从简单提示到复杂交互式脚本的各种需求。熟练掌握 read 能显著提升脚本的用户体验和功能完整性。

相关文章:

shell脚本基础详细学习(更新中)

shell简单介绍 Shell不仅仅是充当用户与UNIX或者localhost交互的角色&#xff0c;还可以作为一种程序设计 语言来使用。通过Shell编程&#xff0c;可以实现许多非常实用的功能&#xff0c;提高系统管理的自动化水平。 如果有一系列经常需要使用的命令&#xff0c;把它存储在一…...

记录一下学习kafka的使用以及思路

下面这是kafka的依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId></dependency> 我在学习的时候直接导入是没有导入成功的&#xff0c;我猜测大概的原因是我本…...

AT9880B北斗单模卫星定位SOC芯片

AT9880B是一款高性能北斗单模卫星导航接收机SOC单芯片&#xff0c;芯片集成射频前端和数字基带、北斗多频卫星信号处理引擎、电源管理功能。芯片支持接收中国北斗二号和北斗三号&#xff0c;支持接收B1I、B1C、B2I、B3I、B2a和 B2b等频点信号。 主要特性&#xff1a; 支持北斗…...

李沐《动手学深度学习》 | 多层感知机

文章目录 感知机模型《深度学习入门》的解释训练感知机损失函数的选择感知机的收敛定理&#xff1a;什么时候能够停下来&#xff0c;是不是真的可以停下来感知机的不足 多层感知模型案例引入隐藏层从线性到非线性单隐藏层-单分类案例多隐藏层 激活函数softmax函数溢出的问题 多…...

vue数据可视化开发常用库

一、常用数据可视化库 1. ECharts 特点&#xff1a;功能强大&#xff0c;支持多种图表类型&#xff0c;社区活跃。适用场景&#xff1a;复杂图表、大数据量、3D 可视化。安装&#xff1a;npm install echarts示例&#xff1a;<template><div ref"chart" c…...

CAN转ModbusTCP网关:破解电池生产线设备协议壁垒,实现全链路智能互联

在电池生产的现代工艺中&#xff0c;自动化和信息化水平的提高是提升产能、保障品质与安全的关键。CAN 协议作为一种广泛应用于汽车、工业控制等领域的串行通信协议&#xff0c;它以其高可靠性和强实时性而受到企业的青睐。而在众多工业通讯协议中&#xff0c;ModbusTCP作为一种…...

更新 / 安装 Nvidia Driver 驱动 - Ubuntu - 2

如果按更新 / 安装 Nvidia Driver 驱动 - Ubuntu-CSDN博客中的步骤操作后问题依旧&#xff0c;则查看过程中的提示信息。 如果发现有“Use sudo apt autoremove to remove them.”&#xff0c;则执行&#xff1a; #sudo apt autoremove #nvidia-smi...

技术分享 | 如何在2k0300(LoongArch架构)处理器上跑通qt开发流程

近期迅为售后团队反馈&#xff0c;许多用户咨询&#xff1a;2K0300处理器采用了LA264处理器核&#xff0c;若要在该处理器上运行Qt程序&#xff0c;由于架构发生了变化&#xff0c;其使用方法是否仍与ARM平台保持一致&#xff1f; 单纯回答‘一致’或‘不一致’缺乏说服力&…...

ubuntu 24.04 error: cannot uninstall blinker 1.7.0, record file not found. hint

最近在打python3.12的镜像&#xff0c;安装browser-gym的核心库&#xff0c;编译一个使用browswer agents的环境&#xff0c;然后出现了下面的问题&#xff1a; error: cannot uninstall blinker 1.7.0, record file not found. hint: the package was installed by debian.系…...

学习记录:DAY28

DispatcherController 功能完善与接口文档编写 前言 没什么动力说废话了。 今天来完善 DispatcherController 的功能&#xff0c;然后写写接口文档。 日程 早上&#xff1a;本来只有早八&#xff0c;但是早上摸鱼了&#xff0c;罪过罪过。下午&#xff1a;把 DispatcherContro…...

C# 的异步任务中, 如何暂停, 继续,停止任务

namespace taskTest {using System;using System.Threading;using System.Threading.Tasks;public class MyService{private Task? workTask;private readonly SemaphoreSlim semaphore new SemaphoreSlim(0, 1); // 初始为 0&#xff0c;Start() 启动时手动放行private read…...

html object标签介绍(用于嵌入外部资源通用标签)(已不推荐使用deprecated,建议使用img、video、audio标签)

文章目录 HTML <object> 标签详解基本语法与核心属性关键属性解析1. **data**2. **type**3. **width & height**4. **name** 嵌入不同类型的资源1. **嵌入图像**2. **嵌入音频**3. **嵌入视频**4. **嵌入 PDF** 参数传递与回退内容**参数&#xff08;<param>&a…...

专题练习1

优化: 找101-200的质数: 开发验证码: 解密数字 抽奖 优化 彩票...

Uniapp编写微信小程序,使用canvas进行绘图

一、canvas文档&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial 二、数据绘制&#xff08;单位是像素&#xff09;&#xff1a; 1、绘制文本&#xff1a; 文字的长度超过设置的最大宽度&#xff0c;文字会缩在一起 ① 填充文本&#xf…...

Java高频基础面试题

Java高频基础面试题 Java基础 Java的特点是什么&#xff1f; 面向对象平台无关性&#xff08;“一次编写&#xff0c;到处运行”&#xff09;支持多线程自动内存管理&#xff08;垃圾回收&#xff09;安全性丰富的类库 JDK、JRE和JVM的区别 JDK (Java Development Kit): Java…...

U9C-SQL-采购订单视图

U9C-SQL-采购订单视图 SELECTpo.ID,CONVERT ( VARCHAR ( 10 ), po.CreatedOn, 23 ) AS 签订日期,org.Name AS 甲方,po.DocNo AS 单号,item.Code AS 料号,item.Name AS 品名,item.SPECS AS 规格,item.DescFlexField_PrivateDescSeg1 AS 图号,item.DescFlexField_PrivateDescSeg2…...

HTML字符串转换为React元素实现

HTML字符串安全转换为React元素的实现 一、背景介绍 介绍HTML字符串在Web开发中的常见场景。说明React中直接使用HTML字符串的局限性。提出将HTML字符串转换为React元素的需求。 二、首先必备的两个npm库&#xff1a;html-react-parser和dompurify 导入&#xff1a; pnpm i…...

全局异常未能正确捕获到对应的异常

自定义Validation验证器遇到的问题 抛出的异常没有能被指定的TaskValidException.class方法拦截到。故写这个原因 全局异常拦截只能拦截相同的异常。只能通过解析转入自定义的异常。自定义的异常继承的异常要是一家子的。如TaskValidException和ValidationException。这样就能在…...

LeetCode 解题思路 47(最长回文子串、最长公共子序列)

解题思路&#xff1a; dp 数组的含义&#xff1a; dp[i][j] 是否为回文子串。递推公式&#xff1a; dp[i][j] s.charAt(i) s.charAt(j) && dp[i 1][j - 1]。dp 数组初始化&#xff1a; 单字符 dp[i][i] true&#xff0c;双字符 dp[i][i 1] s.charAt(i) s.charA…...

P11369 [Ynoi2024] 弥留之国的爱丽丝(操作分块,DAG可达性trick)

真的神仙题。感觉学到了很多。 题意&#xff1a; 给你一张 n n n 个结点 m m m 条边的有向图&#xff0c;点编号为 1 , 2 , … , n 1,2,\dots,n 1,2,…,n。每条边的颜色为黑色或白色。一开始所有 m m m 条边都是黑色的。 你需要进行 q q q 次操作&#xff0c;有两种操作…...

NAT穿越

概述 IPSec协商是通过IKE完成--->ISAKMP协议完成--->由UDP封装&#xff0c;源目端口均为500。 NAT--->NAPT&#xff0c;同时转换IP和端口信息。 对端设备会查验收到的数据报文中的源IP和源端口&#xff0c;其中源IP可以设定为NAT转换后的IP&#xff0c;但是源端口无法…...

不黑文化艺术学社首席艺术家孙溟㠭浅析“雪渔派”

孙溟㠭浅析“雪渔派” 何震 字主臣 &#xff0c;长卿&#xff0c;号雪渔&#xff0c;安徽婺源&#xff08;今江西&#xff09;人&#xff0c;是明代著名的篆刻家和书法家&#xff0c;与文彭独树一帜&#xff0c;实现书法与刀法的统一。 云中白鹤 笑谭间气吐霓虹 边款 其篆刻吸…...

【Linux操作系统】第一弹——Linux基础篇

文章目录 &#x1f4a1; 一. Linux的基本常识&#x1fa94; 1.1 linux网络连接三种方式&#x1fa94;1.2 虚拟机的克隆&#x1fa94;1.3 虚拟机的快照&#x1fa94;1.4 虚拟机的迁移和删除&#x1fa94;1.5 vmtools工具 &#x1f4a1;二. Linux的目录结构&#x1fa94;2.1 Linu…...

“ES7+ React/Redux/React-Native snippets“常用快捷前缀

请注意&#xff0c;这是一个常用的列表&#xff0c;不是扩展提供的所有前缀。最完整和最新的列表请参考扩展的官方文档或在 VS Code 中查看扩展的详情页面。 React (通常用于 .js, .jsx, .ts, .tsx): rfce: React Functional Component with Export Defaultrafce: React Arro…...

selenium替代----playwright

安装 好处特点&#xff1a;这个东西不像selenium需要固定版本的驱动 pip config set global.index-url https://mirrors.aliyun.com/pypi/simplepip install --upgrade pippip install playwright playwright installplaywright install ffmpeg (处理音视频的)验证&#x…...

2025年社交APP安全防御指南:抵御DDoS与CC攻击的实战策略

2025年&#xff0c;社交APP的用户规模与业务复杂度持续增长&#xff0c;但随之而来的DDoS与CC攻击也愈发隐蔽和智能化。攻击者通过AI伪造用户行为、劫持物联网设备&#xff0c;甚至利用区块链漏洞发起混合攻击&#xff0c;对平台稳定性与用户数据安全构成严峻挑战。本文将结合最…...

PHP会话技术

第十六章-PHP会话技术 PHP会话技术是构建动态、个性化Web应用的核心机制之一&#xff0c;它通过跟踪用户在网站上的连续操作状态&#xff0c;实现了网页间的数据持久化交互。无论是电商平台的购物车信息保存、社交媒体的用户登录状态维持&#xff0c;还是表单数据的跨页面传递…...

QT聊天项目DAY10

1.封装redis操作类 头文件 #ifndef REDISMANAGE_H #define REDISMANAGE_H#include "Singletion.h" #include "GlobalHead.h"class RedisManage : public Singletion<RedisManage> {friend class Singletion<RedisManage>; public:~RedisMana…...

5.0.5 变换(旋转、缩放、扭曲)

WPF变换可以产生特殊效果,如平移、旋转、扭曲。 变换类 描述TranslateTransform沿着X轴和Y轴平移ScaleTransform 沿着定义的中心点缩放RotateTransform沿着定义的中心点旋转SkewTransform 扭曲元素MatrixTransfrom提供3x3矩阵,用于定义一个自定义变换 1…...

matlab转python

1 matlab2python开源程序 https://blog.csdn.net/qq_43426078/article/details/123384265 2 网址 转换网址&#xff1a;https://app.codeconvert.ai/code-converter?inputLangMatlab&outputLangPython 文件比较网址&#xff1a;https://www.diffchecker.com/text-comp…...

什么是直播美颜SDK?跨平台安卓、iOS美颜SDK开发实战详解

时下&#xff0c;尤其在社交、娱乐、电商等应用场景中&#xff0c;一个流畅且效果自然的美颜功能往往能直接影响用户的留存率和平台的营收。要实现这些效果&#xff0c;美颜SDK是核心工具。那么&#xff0c;什么是直播美颜SDK&#xff1f;它的功能有哪些&#xff1f;如何进行跨…...

大尺寸PCB如何重塑通信与新能源产业格局

在5G通信基站与新能源电站的机房内&#xff0c;一块块面积超过600mm600mm的PCB板正悄然推动着技术革命。作为电子设备的核心载体&#xff0c;大尺寸PCB凭借其高密度集成与复杂工艺&#xff0c;成为通信、能源等领域的“隐形功臣”。以猎板PCB为代表的厂商&#xff0c;凭借宽幅曝…...

JavaSE核心知识点02面向对象编程02-04(包和导入)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程02-04&#…...

【漫话机器学习系列】249.Word2Vec自然语言训练模型

【自然语言处理】用 Word2Vec 将词语映射到向量空间详解 一、背景介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;我们常常需要将文本信息转化为机器能够理解和处理的形式。传统的方法&#xff0c;如 one-hot编码&#xff0c;虽然简单&#xff0c;但存在严重…...

CSS transition过渡属性

transition 是 CSS 中用于创建平滑动画效果的属性&#xff0c;它允许元素在两个状态之间平滑过渡&#xff0c;而不是立即改变。通过定义过渡的属性、持续时间和速度曲线&#xff0c;你可以实现丰富的交互体验&#xff0c;如悬停效果、状态切换动画等。 核心作用 平滑过渡&…...

U9C对接飞书审批流完整过程

U9C虽然很强大&#xff0c;但是移动办公和审批流功能并不好用&#xff0c;为了弥补U9C这种不足&#xff0c;很多的企业在使用U9C的同时再开通钉钉、飞书、企业微信这种OA管理系统&#xff0c;两套系统并行使用&#xff0c;就需要考虑U9C和OA系统数据同步的问题&#xff0c;最简…...

阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化

作者&#xff1a;裘文成&#xff08;翊韬&#xff09; 摘要 随着企业全球化业务的扩展&#xff0c;如何高效、经济且可靠地将分布在海外各地的应用与基础设施日志统一采集至阿里云日志服务 (SLS) 进行分析与监控&#xff0c;已成为关键挑战。 本文聚焦于阿里云高性能日志采集…...

从0开始学习大模型--Day04--大模型的框架以及基本元素

Agent框架与策略分析 计划与执行&#xff08;planning-and-Execute&#xff09; 该框架侧重于先规划一系列的行动&#xff0c;然后执行。这个框架可以使大模型能够先综合考虑任务的多个方面&#xff0c;然后按照计划进行行动&#xff0c;比较适合应用在较复杂的项目管理中或者…...

FPGA实战项目2———多协议通信控制器

1. 多协议通信控制器模块 (multi_protocol_controller) 简要介绍 这是整个设计的顶层模块,承担着整合各个子模块的重要任务,是整个系统的核心枢纽。它负责协调 UART、SPI、I2C 等不同通信协议模块以及 DMA 模块的工作,同时处理不同时钟域之间的信号交互,确保各个模块能够…...

strings.Builder 使用详解

目录 1. 官方包 2. 支持版本 3. 官方说明 官方示例 方法 func (b *Builder) Cap() int func (b *Builder) Grow(n int) func (b *Builder) Len() int func (b *Builder) Reset() func (b *Builder) String() string func (b *Builder) Write(p []byte) (int, error)…...

数巅智能携手北京昇腾创新中心深耕行业大模型应用

当前&#xff0c;AI技术正在加速向各行业深度渗透,成为驱动产业转型和社会经济发展的重要引擎。构建开放协作的AI应用生态体系、推动技术和应用深度融合&#xff0c;已成为行业发展的重要趋势。 近日&#xff0c;数巅智能与北京昇腾人工智能计算中心&#xff08;北京昇腾创新中…...

【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识——⑤电源及电路设计

文章目录 7. 嵌入式系统电源分类及管理7.1 嵌入式系统电源分类7.2 电源管理技术7.3 电源完整性设计 8. 电子电路设计8.1 电子电路设计基础知识8.1.1 电子电路设计原理8.1.2 电子电路设计方法及步骤8.1.3 电子电路可靠性设计 8.2 PCB设计基础知识8.2.1 PCB设计原理8.2.2 PCB设计…...

排序算法-希尔排序

希尔排序是插入排序的改进版&#xff0c;通过将原始数组分成多个子序列进行间隔插入排序&#xff0c;逐步缩小间隔直至为1&#xff0c;最终完成整体排序。它也被称为缩小增量排序。 希尔排序步骤 选择增量序列&#xff08;Gap Sequence&#xff09;&#xff1a;确定一个递减的…...

JAVA继承中变量和方法的存储和方法中访问变量的顺序

一、变量归属与内存位置 static 变量&#xff1a;属于类&#xff0c;只存在一份&#xff0c;保存在方法区&#xff08;或元空间&#xff09;。 实例变量&#xff08;非static&#xff09;&#xff1a;属于对象&#xff0c;每个对象单独一份&#xff0c;保存在堆内存中。 二、…...

【PhysUnits】3.3 SI 基础量纲单位(units/base.rs)

一、源码 这段代码定义了一系列基础物理量纲的类型别名&#xff0c;并使用标记 trait Canonical 来表示它们是国际单位制&#xff08;SI&#xff09;中的基本单位。 use crate::Dimension; use typenum::{P1, Z0};/// 标记特质&#xff0c;表示基础量纲单位 pub trait Canoni…...

stm32F103芯片 实现PID算法控制温度例程

目录 硬件需求 软件需求 步骤 1. 配置STM32CubeMX 2. 编写PID控制代码 3. 编译和烧录 4. 测试 注意事项 要在STM32F103芯片上实现PID算法控制温度,首先需要确保你有一套完整的硬件和软件开发环境。这里,我将给你一个简化的例程,展示如何使用PID控制算法来调节一个假…...

Java学习手册:微服务设计原则

一、单一职责原则 每个微服务应该专注于一个特定的业务功能&#xff0c;具有清晰的职责边界。这有助于保持服务的简洁性&#xff0c;降低服务之间的耦合度&#xff0c;提高服务的可维护性和可扩展性。例如&#xff0c;可以将用户管理、订单管理、支付管理等功能分别设计为独立…...

【挑战项目】 --- 微服务编程测评系统(在线OJ系统)(二)

三十二、Swagger介绍&使用 官网:https://swagger.io/ 什么是swagger Swagger是一个接口文档生成工具,它可以帮助开发者自动生成接口文档。当项目的接口发生变更时,Swagger可以实时更新文档,确保文档的准确性和时效性。Swagger还内置了测试功能,开发者可以直接在文档中…...

Unity背景随着文字变化而变化

组件结构&#xff1a; 背景&#xff08;父&#xff09;需要添加如下两个组件 根据具体情况选择第一个组件水平还是垂直&#xff0c;一般垂直用的比较多 效果展示&#xff1a; 此时在文本框中改变内容背景图都会随着变化&#xff0c;动态的...

Elasticsearch内存管理与JVM优化:原理剖析与最佳实践

#作者&#xff1a;孙德新 文章目录 一、Elasticsearch缓存分类1、Node Query Cache&#xff1a;2、Shard Request Cache&#xff1a;3、Fielddata Cache&#xff1a; 三、内存常见的问题案例一案例二案例三案例四 四、内参分配最佳实践1、jvm heap分配2、将机器上少于一半的内…...