Shell编程从入门到实践——入门篇

news2024/11/15 17:47:31

欢迎关注 「Android茶话会」

  1. 「学习之路」 取Android技术路线经典电子书
  2. 「pdf」 取阿里&字节经典面试题、Android、算法、Java等系列武功秘籍。
  3. 「天涯」 取天涯论坛200+精彩博文,包括小说、玄学等

Shell是一种命令行解释器,它是在Unix和Linux操作系统中广泛使用的一种工具,也是我们日常开发工作中的好帮手,相较于Python,Shell语法简单非常好上手而且开箱即用无需纠结安装Python2还是Python3。下面将从 入门到实践详细介绍下Shell编程

本篇是入门篇

入门篇:

大纲图如下:

字符串

字符串替换

  • ${变量名#匹配规则} 从变量开头进行规则匹配,将符合最短的数据删除。
  • ${变量名##匹配规则} 从变量开头进行规则匹配,将符合最长的数据删除。
  • ${变量名%匹配规则} 从变量尾部进行规则匹配,将符合最短的数据删除。
  • ${变量名%%匹配规则} 从变量尾部进行规则匹配,将符合最长的数据删除。
  • ${变量名/旧字符串/新字符串} 变量内容符合旧字符串,则第一个旧字符串会被新字符串取代。
  • ${变量名//旧字符串/新字符串} 变量内容符合旧字符串,则全部旧字符串会被新字符串取代。
var_1="I love you, Do you love me"

var=${var_1#*ov} # e you, Do you love me

var=${var_1##*ov} # e me

var=${var_1%ov*} # I love you, Do you l

var=${var_1%%ov*} # I l

var_2="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

# 第一个小写bin被替换为大写的BIN
var=${var_2/bin/BIN} # /usr/local/BIN:/usr/bin:/bin:/usr/sbin:/sbin 

# 所有小写bin会被替换为大写的BIN
var=${var_2//bin/BIN} # /usr/local/BIN:/usr/BIN:/BIN:/usr/sBIN:/sBIN

抽取子串

  • ${string:position} 从string的 position 开始。
  • ${string:position:length} 从position开始,匹配长度为 length
  • ${string: -position} 从右边开始匹配。
  • ${string:(position)} 从左边开始匹配。
  • expr substr $string $postion $length 从 position 开始,匹配长度为 length

字符串长度


- ${#string}
- expr length "$string"  如果string有空格必须加双引号

var_1="Hello world"

len=${#var_1} # 11

len=`expr length "$var_1"` # 11

获取子串在字符串中的索引位置

  • expr index$substring 从1开始计算索引位置
var_1="quickstart is an app"

ind=`expr index "$var_1" start` # 6
ind=`expr index "$var_1" uniq` # 1
ind=`expr index "$var_1" f` # 0

计算子串长度

  • expr match $string substr

从头开始匹配子串长度,如果没有匹配到则返回0,匹配到了返回匹配子串的长度

var_1="quickstart is an app"

sub_len=`expr match "$var_1" app` # 0
sub_len=`expr match "$var_1" quic` # 4
sub_len=`expr match "$var_1" quic.*` # 18

字符串替换大小写

#! /bin/bash
# 注意:脚本第一行一定要注明脚本解释器是bash.不能是sh,或dash
# 因为sh软连接有可能指向的是dash
var="Hello,Word"
# 把变量中的第一个字符换成大写 
echo ${var^} 
# 把变量中的所有小写字母,全部替换为大写
echo ${var^^}   
# 把变量中的第一个字符换成小写
echo ${var,}
# 把变量中的所有大写字母,全部替换为小写
echo ${var,,}

数组

定义数组

array=('v1' 'v2' 'v3')

输出数组内容

${array[@]} # 输出全部内容
${array[*]} # 也是输出全部内容
${array[1]} # 输出下标索引为1的内容

获取数组长度

${#array} # 数组内元素个数
${#array[2]} # 数组内下标为2的元素长度

数组赋值

array[0]="frank" # 给数组下标为1的元素赋值为frank
array[20]="lion" # 在数组尾部添加一个新元素

删除数组

unset array[2] # 清除元素
unset array # 清空整个数组

数组遍历

for v in ${array[@]}
do
done

函数

定义

  • 函数名后面的圆括号不加任何参数
  • 函数的完整定义必须置于函数的调用之前
函数名 (){
 函数体
}

传参

#!/bin/bash

print_something(){
    echo "hello $1" # $1 获取第一个参数
}
print_something Lion # Lion 为参数
print_something Frank # Frank 为参数

参数获取

$1~$9:函数的第一个到第9个的参数。
$0:函数所在的脚本名。
$#:函数的参数总数。
$@:函数的全部参数,参数之间使用空格分隔。
$*:函数的全部参数,参数之间使用变量$IFS值的第一个字符分隔,默认为空格,但是可以自定义。
$?:显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。可以用于函数返回值

返回值

testFun(){
    echo "helloworld!"
    return 99
}


# 千万要注意shell并不像其他语言直接返回返回值,其返回值放到$?中,这也是为什么只能返回整型的原因
# 所以这种承接方法是错误的,获取到的值是echo打印的内容
# return_value=`testFun`
# 以下才是正确获取通过return返回的返回值的正确写法
testFun
echo "the return value is: $?"

局部变量

  • 不做特殊声明,shell中变量都是全局变量
  • 局部变量 使用 「local」 关键字,函数内外同时存在同名变量,则函数内部会覆盖函数外部变量
#!/bin/bash

localvar="fun1"

main() {
    func1
    func2
}

func1() {
    local localvar="funlocal"
    echo ${localvar}
    localvar="fun2"
}

func2() {
    echo ${localvar}
}

main "$@"

循环

until

until [ 条件判断式 ]
 do
  程序
 done

while循环

while [ 条件判断式 ]
 do
  程序
 done

for循环

两种程式

//方式一
for 变量 in 值1 值2 值3 …(可以是一个文件等)
 do
  程序
 done
 
 这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。
 也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,以此类推。


//方式二
for (( 初始值;循环控制条件;变量变化 ))
 do
  程序
 done
 
语法二中需要注意:
初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;

循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;

变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1。

逻辑控制

多分支case

每个程序之后;; 双分号结尾;以 case开头以esac结尾

[root@localhost ~]$ vi sh/if-case.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter确认:" KEY

case "$KEY" in
 [a-z]|[A-Z])
 echo "您输入的是字母"
 ;;
 
 [0-9])
 echo "您输入的是数字"
 ;;
 
 *)
 echo "您输入的是其他字符"
 ;;
esac

if

if [ 条件判断式1 ]
 then
  当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
 then
  当条件判断式2成立时,执行程序2
…省略更多条件…
else
 当所有条件都不成立时,最后执行此程序
fi

文件

文件与目录

操作符说明
pwd查看当前目录
cd切换目录 cd… cd ~ cd /
ls查看当前目录的文件列表
mkdir创建目录或文件
echo打印
cat链接、查看文件 > , >>
less文件内容过多,以分页方式查看
q退出
mv移动, . 代表当前目录;移动文件到一个目录,最后一个为目标目录
cp复制文件或目录
rm移除文件或者目录
rmdir删除目录
# 移动文件到某个目录
mv combined.txt dir1

# . 代表当前目录
mv dir1/combined.txt .

# 移动多个文件到一个目录,最后一个为目标目录,如把以下几个文件及文件夹dir3移动到dir2
mv combined.txt test_* dir3 dir2

# 修改文件名、目录名
mv test_1.txt test1.txt
mv "folder 1" folder_1

运算

bash的运算有以下几种方式

$(( ))

只能计算整数

expr

语法格式: expr $num2

  • num1 | num2 – num1 不为空且非0,返回 num1 ; 否则返回 num2
  • num1 & num2 – num1 不为空且非0,返回 num1 ;否则返回0
  • num1 < num2 – num1 小于 num2 ,返回1;否则返回0
  • num1 <= num2 – num1 小于等于 num2 ,返回1;否则返回0
  • num1 = num2 – num1 等于 num2 ,返回1;否则返回0
  • num1 != num2 – num1 不等于 num2 ,返回1;否则返回0
  • num1 > num2 – num1 大于 num2 ,返回1;否则返回0
  • num1 >= num2 – num1 大于等于 num2 ,返回1;否则返回0
  • num1 + num2 – 求和
  • num1 - num2 – 求差
  • num1 * num2 – 求积
  • num1 / num2 – 求商
  • num1 % num2 – 求余

let

let命令声明变量时 可以直接执行算术表达式

let "foo = 1 + 2"
echo $foo # 3

运算符

文件测试运算符

文件测试运算符用于检测Unix/Linux文件的各种属性

操作符说明
-b file检测文件是否是块设备文件
-c file检测文件是否是字符设备文件
-d file检测文件是否是目录
-f file检测文件是否是普通文件,不是目录或者设备文件
-g file检测文件是否设置了SGID位
-p file检测文件是否是明管道
-r file检测文件是否可读
-w file检测文件是否可写
-x file检测文件是否可执行
-s file检测文件是否为空
-e file检测文件(包括目录)是否存在
  • -e $file exist 的缩写,表示文件是否存在。
  • -d $file directory 的缩写,表示文件是否为一个目录。
  • -f $file file 的缩写,表示文件是否是一个文件。
  • -L $file Link 的缩写,表示链接。
  • -r $file readable 的缩写,表示文件是否可读。
  • -w $file writable 的缩写,表示文件是否可写。
  • -x $file executable 的缩写,表示文件是否可执行。
  • $file1 -nt $file2 表示文件 file1 是否比 file2 更新。
  • $file1 -ot $file2 表示文件 file1 是否比 file2 更旧。

字符串测试运算符

运算符说明
=检测两个字符串是否相等
!=检测两个字符串是否不相等
-z检测字符串长度是否为0
-n检测字符串长度是否不为0
str检测字符串是否不为空
  • $string1 = $string2 表示两个字符串是否相等。
  • $string1 != $string2 表示两个字符串是否不相等。
  • -z $string 表示字符串 string 是否为空。
  • -n $string 表示字符串 string 是否不为空。

数字测试运算符

运算符单词说明
-eqequal检查两个数是否相等,相等返回true
-nenot equal检查两个数是否相等,不相等返回true
-gtgreat than检测左边的数是否大于右边的,如果是 返回true
-ltless than检测左边数是否小于右边数,如果是 返回true
-gegreat than or equal检测左边数是否大于等于右边的,如果是,返回true
-leless than or equal检测左边数是否小于等于右边,如果是,返回true
  • $num1 -eq $num2 equal 的缩写,表示两个数字是否相等。
  • $num1 -ne $num2 not equal 的缩写,表示两个数字是否不相等。
  • $num1 -lt $num2 lower than 的缩写,表示 num1 是否小于 num2 。
  • $num1 -le $num2 lower or equal 的缩写,表示 num1 是否小于或等于 num2 。
  • $num1 -gt $num2 greater than 的缩写,表示 num1 是否大于 num2 。
  • $num1 -ge $num2 greate or equal 的缩写,表示 num1 是否大于或等于 num2

逻辑判断

  • && 表示逻辑与,只要有一个不为真,整个条件测试为假。
  • || 表示逻辑或,只要有一个为真,整个条件测试就为真。
  • ! 表示反转测试条件。

变量

预定义变量

预定义变量作用
$?最后一次执行命令的返回状态,为0表示,上一个命令正确执行,否则代表上一个命令执行错误
$$当前进程的进程号 PID
$!后台运行的最后一个进程号PID
[root@localhost sh]$ ls
count.sh hello.sh parameter2.sh parameter.sh
#ls命令正确执行
[root@localhost sh]$ echo $?
#预定义变量“$?”的值是0,证明上一个命令执行正确
[root@localhost sh]$ ls install.log
ls:无法访问install.log:没有那个文件或目录
#当前目录中没有install.log文件,所以ls命令报错了
[root@localhost sh]$ echo $?
2
#变量“$?”返回一个非О的值,证明上一个命令没有正确执行
#至于错误的返回值到底是多少,是在编写ls命令时定义好的,如果碰到文件不存在就返回数值2

位置参数

位置参数变量
$n$0表示当前脚本程序 $1-9代表第一到第九参数,10以上参数需要大括号 {10}
$*代表命令行中所有参数,$把所有参数看成一个整体
$@代表命令行中所有参数,每个参数区分对待
$#代表命令行中所有参数的个数
[root@localhost sh]$ vi parameter2.sh
#!/bin/bash
for i in"$*"
#定义for循环,in后面有几个值,for会循环多少次,注意“$*”要用双引号括起来
#每次循环会把in后面的值赋予变量i
#Shell把$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
 do
  echo "The parameters is: $i"
  #打印变量$i的值
 done
x=1
#定义变量x的值为1
for y in"$@"
#同样in后面的有几个值,for循环几次,每次都把值赋予变量y
#可是Shel1中把“$@”中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
 do
  echo "The parameter$x is: $y"
  #输出变量y的值
  x=$(( $x +1 ))
  #然变量x每次循环都加1,为了输出时看的更清楚
 done

环境变量设置

export 声明的变量即是环境变量

环境变量查询和删除

env命令和set命令区别:set命令可以查看所有变量,而env命令只能查看环境变量

[root@localhost ~]$ unset gender   #删除环境变量gender
[root@localhost ~]$ env | grep gender

变量删除

unset 变量名

变量查看

set -u 调用未声明变量会报错 -x 执行之前会把命令先输出一次 +<参数> 取消魔偶个set曾启动的参数

[root@localhost ~]$ set [选项]
选项:
-u:如果设定此选项,调用未声明变量时会报错(默认无任何提示)
-x:如果设定此选项,在命令执行之前,会把命令先输出一次
+<参数> :取消某个set曾启动的参数。

[root@localhost ~]$ set
BASH=/bin/bash
…省略部分输出…
name='shen chao'
#直接使用set 命令,会查询系统中所有的变量,包含用户自定义变量和环境变量
[root@localhost ~]$ set -u
[root@localhost ~]$ echo $file
-bash: file: unbound variable
#当设置了-u选项后,如果调用没有设定的变量会有报错。默认是没有任何输出的。
[root@localhost ~]$ set -x
[root@localhost ~]$ ls
+ls --color=auto
anaconda-ks.cfginstall.loginstall.log.syslog sh tdir testtestfile
#如果设定了-x选项,会在每个命令执行之前,先把命令输出一次

[root@localhost ~]$ set +x
#取消启动的x参数

细节

反引号

如果命令不用反引号包含,命令不会执行,而是直接输出 只有用反引号包含的命令、使用${命令}的方式也是可以

[root@localhost ~]$ echo ls
ls
#如果命令不用反引号包含,命令不会执行,而是直接输出
[root@localhost ~]$ echo `ls`
anaconda-ks.cfginstall.loginstall.log.syslog sh test testfile
#只有用反引号包括命令,这个命令才会执行
[root@localhost ~]$ echo $(date)
2018年10月21日星期一18:25:09 CST
#使用$(命令)的方式也是可以的

单引号和双引号

如果输出使用单引号,则$name原封不动输出 如果输出使用双引号,则输出变量name的值sc 反引号和双引号括起来的命令会正常执行; 反引号被单引号括起来命令不会执行当做普通字符串输出

[root@localhost ~]$ name=sc
#定义变量name 的值是sc(就是最正直的人,超哥我了!)
[root@localhost ~]$ echo '$name'
$name
#如果输出时使用单引号,则$name原封不动的输出
[root@localhost ~]$ echo "$name"
sc
#如果输出时使用双引号,则会输出变量name的值 sc

[root@localhost ~]$ echo `date`
2018年10月21日星期一18:16:33 CST
#反引号括起来的命令会正常执行
[root@localhost ~]$ echo '`date`'
`date`
#但是如果反引号命令被单引号括起来,那么这个命令不会执行,―date`会被当成普通字符输出
[root@localhost ~]$ echo "`date`"
2018年10月21日星期一18:14:21 CST
#如果是双引号括起来,那么这个命令又会正常执行

Shell反引号、()和{}的区别

反引号与$()

用于命令替换,获取命令的返回值

all_files=`ls` # 获取ls命令的执行结果
all_files=$(ls) # 效果同上
  • ${}

用于变量替换

echo ${A}B

特殊变量替换

1. ${var:n} 若n为正数,n从0开始,表示在变量var中提取第n个字符到末尾的所有字符
2. ${var:n1:n2} 用于提取从下标n1开始后面n2个字符
3. ${/}与${//}用于字符串模式匹配替换
4. ${#}、${##}、${%}与${%%} 用于字符串模式匹配截断

[]和[[ ]] 、(())

在使用[]或者test指令进行字符串判空时,需要在引用的变量上加上双引号""。
如果使用[[]]的话就不需要。
$(())用来做整数运算的
  1. 「学习之路」 取Android技术路线经典电子书
  2. 「pdf」 取阿里&字节经典面试题、Android、算法、Java等系列武功秘籍。
  3. 「天涯」 取天涯论坛200+精彩博文,包括小说、玄学等

您的 点赞、评论、转发 是对我的巨大鼓励!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强化历程3-JavaWeb及Spring,SpringMVC,SpringBoot系列(2023.6.22)

文章目录 强化历程3-JavaWeb及SSM,SpringBoot系列(2023.6.22第一次更新)习题汇总1 JSP页面内容组成?2 cookie和session的区别?3 web应用中如何利用session来维持客户端和服务端的关系&#xff1f;4 session销毁的方式?5 请求转发和重定向的区别?6 什么是servelt&#xff1f…

基于Web的数字家庭网站设计与实现【附开题报告和万字文档(Lun文)】

主要功能 前台登录&#xff1a; ①主页&#xff1a;新闻信息展示、最新动态、家庭亲子视频展示、亲友动态展示 ②论坛&#xff1a;发布帖子 ③家庭亲自视频&#xff1a;视频类型分类、亲子视频标题 ④家庭日记&#xff1a;日记类型分类、日记标题 ⑤新闻信息&#xff1a;新闻类…

vue3+vite+js+router+vueX+组件一键导入(源码)

一、前言 一直想自己做一个简单脚手架&#xff0c;方便自己做点简单的demo网上开源也找不到&#xff0c;大多数都是太重了&#xff0c;或者又太轻了今天把这个几个都揉在一起&#xff0c;方便后面做点小玩意 二、项目包 vite-project.zip - 蓝奏云文件大小&#xff1a;8.8 M|ht…

SCTF2023 Barter 复现

题目描述&#xff1a; chal_sage部分&#xff1a; from Crypto.Util.number import * from random import * from secrets import flagdef gen_random(seed, P, Q, r_list, times):s seedfor i in range(times):s int((s * P)[0])r int((s * Q)[0])r_list.append(r)return…

E. Round Dance(dfs分辨特殊联通块)

Problem - 1833E - Codeforces 有 n 个人来到一个节日并决定跳几个“圆舞”。每个圆舞至少有 2 个人&#xff0c;且每个人恰好有两个邻居。如果圆舞中只有 2 个人&#xff0c;则它们在两侧拥有相同的邻居。 你想要确定有多少个“圆舞”可以跳。但是每个参与者只记得一个邻居。…

【自注意力机制必学】BERT类预训练语言模型(含Python实例)

BERT类预训练语言模型 文章目录 BERT类预训练语言模型1. BERT简介1.1 BERT简介及特点1.2 传统方法和预训练方法1.3 BERT的性质 2. BERT结构2.1 输入层以及位置编码2.2 Transformer编码器层2.3 前馈神经网络层2.4 残差连接层2.5 输出层 3. BERT类模型简要笔记4. 代码工程实践 1.…

利用python绘制端午节的各种图案,例如粽子,赛龙舟等,以及一些端午节的感人小故事

这里写目录标题 1、关于端午节的有趣故事2、关于端午节的趣闻3、利用python绘制龙舟3.1. 代码如下3.2 图形展示 4、利用python绘制大公鸡5、利用python来进行端午节的诗词对弈总结 1、关于端午节的有趣故事 端午节是一个历史悠久的中国传统节日&#xff0c;有很多有趣的故事与…

内存不够用,那你的内存去哪了?

一、前言 近几年开发了一些大型的应用程序&#xff0c;在程序性能调优或者解决一些疑难杂症问题的过程中&#xff0c;遇到最多的还是与内存相关的一些问题。例如glibc内存分配器ptmalloc&#xff0c;google的内存分配器tcmalloc都存在“内存泄漏”&#xff0c;即内存不归还操作…

原来Flutter代码是这样运行在原生系统的!快来了解Flutter标准模板,感受原生系统中Flutter的魅力!

通过Android Studio创建的Flutter应用模板&#xff0c;了解Flutter项目结构&#xff0c;分析Flutter工程与原生Android和iOS工程有哪些联系&#xff0c;体验一个有着基本功能的Flutter应用是如何运转的&#xff0c;从而加深你对构建Flutter应用的关键概念和技术的理解。 Dart只…

深入理解深度学习——GPT(Generative Pre-Trained Transformer):GPT-2与Zero-shot Learning

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; GPT&#xff08;Generative Pre-Trained Transformer&#xff09;&#xff1a;基础知识 GPT&#xff08;Generative Pre-Trained Transformer&#xff09;&#xff1a;在不同任务中使用GPT GPT&#x…

软考:软件工程:软件维护与项目管理

软考&#xff1a;软件工程:软件维护与管理 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &…

如何挑选合格的在线教育解决方案?

现在市面上的知识付费系统繁多&#xff0c;你可以说百花齐放&#xff0c;也可以说良莠不齐&#xff0c;如果不具备一定的专业素养&#xff0c;根本就无法从中挑选出真正的好产品&#xff0c;劣币驱逐良币反而成为常态。 本文将从几个常见维度分析一个好产品应该具备的基本要素…

CSS基础总结

CSS基础总结 CSS基础总结基础认知基础选择器**选择器的作用**标签选择器类选择器id选择器**通配符选择器** 字体和文本样式字体样式字体大小&#xff1a;font-size字体粗细&#xff1a;font-weight字体样式&#xff1a;font-style字体类型&#xff1a;font-family字体类型&…

【MYSQL篇】mysql性能优化总结

前言 说到MYSQL性能调优&#xff0c;大部分时候想要实现的目标是让我们的查询更快。一个查询的动作又是由很多个环节组成的&#xff0c;每个环节都会消耗时间&#xff0c;我们要减少查询所消耗的时间&#xff0c;就要从每一个环节入手。 关于MYSQL的sql语句执行流程&#xff0…

ARM-驱动/总结一

Linux设备驱动 驱动&#xff1a;能够控制硬件实现特定功能的软件代码就是驱动 ARM裸机驱动和驱动区别&#xff1f; ARM裸机驱动是不基于操作系统的软件代码&#xff0c;通常这份代码都是有开发者独立编写完成的。 驱动是基于内核&#xff08;Linux&#xff09;架构的基础上的…

chatGPT 指南:秒变 Excel 大神

Excel 是一款功能强大的电子表格软件&#xff0c;而 ChatGPT 则是一种智能语言模型&#xff0c;可以为 Excel 用户提供帮助和指导。本文将探讨 Excel 与 ChatGPT 的关系&#xff0c;并从初级、中级和高级 Excel 用户三个层次&#xff0c;介绍如何利用 ChatGPT 来提升 Excel 技能…

leetcode416. 分割等和子集(动态规划-java)

分割等和子集 leetcode416. 分割等和子集题目描述 暴力递归代码演示 动态规划解题思路代码演示 动态规划专题 leetcode416. 分割等和子集 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/partition-equal-subset-sum 题目…

高级数据结构——平衡二叉树(AVL树)

目录 1. 底层结构 2. AVL数的概念 3. AVL树节点的定义 4. 基本框架 5. AVL树的插入 6. AVL树的旋转 6.1 左单旋 6.2 右单旋 6.3 左右双旋 6.4 右左双旋 7. AVL树的验证 8. AVL树的查找 9. AVL树的删除 10. AVL树的性能 11. 总代码 11.1 AVLTree 11.2 Test.c…

mac本地创建ssh key连接github

起因 今天克隆自己github上面的笔记到新电脑上&#xff0c;用http连接进行克隆&#xff0c;然后要我输入账号密码&#xff0c;输入完报了个提示“remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.”…