shell基础用法
shell基础知识
shell中的多行注释
:<<EOF
read
echo $REPLY # read不指定变量,则默认写入$REPLY
EOF
# :<<EOF ...EOF 多行注释,EOF可以替换为!# 等
文件目录和执行目录
echo '$0='$0 # ./demo.sh
echo '$0的realpath='$(realpath $0) # 完整路径
echo '$0的父目录='$(dirname $(realpath $0)) # 文件的父目录echo "BASH_SOURCE="${BASH_SOURCE} # ./demo.sh
echo "BASH_SOURCE的realpath="$(realpath ${BASH_SOURCE}) # 完整路径echo '文件执行目录:'`pwd` # 执行目录
当使用bash或./执行时,$0和${BASH_SOURCE}是一样的,但是通过.或source命令执行脚本时,$0就变为了/bin/bash ,无法达到想要的效果;
- BASH_SOURCE
如果你有一个脚本 script1.sh 调用了 script2.sh,而 script2.sh 又调用了 script3.sh,那么在 script3.sh 中,BASH_SOURCE 数组将包含以下路径:
BASH_SOURCE[0] 将是 script3.sh 的路径。
BASH_SOURCE[1] 将是 script2.sh 的路径。
BASH_SOURCE[2] 将是 script1.sh 的路径。
shell变量
变量赋值
var=‘hello word’
unset var # 删除变量,不能删除只读变量
readonly var=89 # 只读变量
数组定义
var_array=(value1 value2 value3) # 普通数组
declare -A var_url_array=(['baidu']='www.baidu.com' ['taobao']='www.taobao.com' ['jd']='jingdong.com') # 关联数组
echo ${var_array} # value1
echo ${var_url_array} # 空
echo ${var_array[1]} # value2
echo ${var_url_array["taobao"]} # www.baidu.com
echo ${var_array[*]} # value1 value2 value3
echo ${var_array[@]} # value1 value2 value3
echo ${var_url_array[*]} # www.baidu.com jingdong.com www.taobao.com
echo ${var_url_array[@]} # www.baidu.com jingdong.com www.taobao.com
echo ${#var_array[1]} # 6 计算数组下标元素的长度
echo ${#var_array[*]} # 3 计算数组的长度
echo ${#var_url_array[*]} # 3
echo ${#var_url_array["taobao"]} # 14
echo ${!var_array[*]} # 0 1 2 获取数组的key
echo ${!var_url_array[*]} # baidu jd taobao 获取数组的key
echo ${var_array[@]:0:2} # value1 value2 切片访问,从0下标开始,长度是2
echo ${var_url_array[@]:1:2} # www.baidu.com jingdong.com
echo ${var_array[@]/value/num} # num1 num2 num3 数组内容替换
echo ${var_url_array[@]/www/} # .baidu.com jingdong.com .taobao.com
# 以上4条命令,同样可以指定下标,就是对数组下标元素操作
unset var_array[0]
echo ${var_array[*]} # value2 value3
unset var_url_array["taobao"]
echo ${var_url_array[*]} # www.baidu.com jingdong.com
# 需要注意的是,var_array删除下标0之后,并不会重置下标
echo ${!var_array[*]} # 1 2
var_array[7]=78
echo ${!var_array[*]} # 1 2 7
echo ${var_array[*]} # value2 value3 78
var_array+=(10 20)
echo ${var_array[*]} # value2 value3 78 10 20
var_array=(${var_array[*]} 1 2 3)
echo ${var_array[*]} # value2 value3 78 10 20 1 2 3
unset var_array # 删除整个数组
for i in ${!var_url_array[*]} ; do echo $i; done # 遍历数组的key:baidu \n jd
for i in ${var_url_array[*]} ; do echo $i; done # 遍历数组的值:www.baidu.com \n jingdong.com
test1(){echo "接收到的参数列表:$@"newarr=($@)echo "新数组的值为:${newarr[*]}"return $newarr # 不建议这样写,其实只能返回数组第一个元素的整数值
}
# shell脚本调用也不能传入数组,所以建议直接在脚本中定义数组
arr=(10 2 3)
test1 ${arr[*]}
echo $?#接收到的参数列表:10 2 3
#新数组的值为:10 2 3
#10
shell内置变量
$MACHTYPE:机器类型
$OSTYPE:操作系统类型
$HOSTNAME:当前主机名
$HOME:当前用户家目录
$USER:当前用户名
$UID:当前用户ID
$SHELL:当前shell的路径
$PWD:当前目录
$IFS:字段分隔符
$RANDOM:随机数
$SECONDS:shell 脚本启动的秒数
$FUNCNAME:当前函数的名称
特殊参数变量
$0 --脚本名称
$n --位置参数
$# --参数个数
$* --所有参数
$@ --所有参数;
不加双引号时,$* 、$@相同,都是独立字符串;加上双引号时,$*是将所有参数作为整个字符串,而$@是将每个参数作为独立字符串;
特殊状态变量
$? – 退出状态码
$! – 上一个后台运行的程序的进程id
$$ – 当前脚本的pid
$_ – 上一个命令的最后一个参数
shell内置命令
date
date +'%Y-%m-%d %H:%M:%S'
# 2024-11-18 19:14:02
tee
# 同时写入标准输出和文件。
echo "hello"|tee a.txt # 写入a.txt文件,同时也会到标准输出,-a参数代表追加;
echo "hello world"|tee a.txt b.txt c.txt # 同时重定向到多个文件;
lsblk|tee a.txt > /dev/null # 这样可以不到标准输出
lsblk 2>&1|tee a.txt # 将标准错误也写入a.txt文件;
tee -i a.txt # 从键盘获取输入写入文件,-i不会被ctrl+c打断,可用ctrl+d打断;
echo和printf
echo -e "\n hello" # 支持转义字符
echo -n "hello" # 不换行
printf "hello \t world" # printf默认支持转义,默认不换行
printf "%d %s %.2f" 24 hello 4.5678 # 24 hello 4.57
exec 和 eval
eval "pwd" # eval可以将字符串作为命令执行
exec date # exec 执行命令后退出,相当于自动执行一次exit
cat 重定向
cat > b.txt <<EOF
first
second
third
EOF
local
function func(){
local name='inside var'
}
# 默认情况下,函数内部定义的变量也属于全局变量。但是只要在变量名前加local关键字,该变量就会变成局部变量。
trap
用于捕获和处理信号:
#!/bin/bash
# 定义错误处理函数,将错误信息记录到日志文件
handle_error() {echo "$(date): $BASH_COMMAND failed with exit code $?"
}
# 设置 ERR 信号处理函数
trap handle_error ERR EXIT
# 其他代码逻辑
ls none.txt
# 运行 ./demo.sh
# ls: 无法访问'none.txt': 没有那个文件或目录
# 2024年 11月 22日 星期五 21:30:53 CST: ls none.txt failed with exit code 0
# 2024年 11月 22日 星期五 21:30:53 CST: ls none.txt failed with exit code 0
捕获了ERR信号,同时也捕获了EXIT信号,所以打印了2遍;这里打印的退出码是0,其实是因为执行$(date)命令成功。
#!/bin/bash
trap cleanup INTcleanup() {echo "Caught interrupt signal. Cleaning up..."
}echo "Press Ctrl+C to interrupt me!"
while true; do sleep 1; done
declare
declare [+/-] [选项] 变量名, 其中,+表示取消设置,-表示设置。
声明变量类型:在默认情况下,Linux中的变量是弱类型,即默认都是字符串类型。使用declare可以声明变量的类型,例如使用-i选项将变量作为整数处理。参考
declare -i data1 data2 res
data1=10
data2=20
res=$data1+$data2
echo $res # 30 如果不声明,那结果是10+20
declare +i data # 去掉整数属性
declare -r name='test' # 声明只读变量
name='zyy' # 报错bash: name: 只读变量
readonly a=1 # 也是定义只读变量
declare -a arr=(1 2)
#对于索引数组来说,declare是否声明似乎并无差别(索引数组顺序固定)
declare -A b=(["apple"]=1 ["boy"]=2 ["cat"]=3)
# 但对于关联数组,则必须使用declare -A声明(关联数组顺序不定)
demo(){echo "demo function"
}
declare -f demo
# declare -f 函数名 显示函数的名称和定义代码; -F是只显示函数名称
declare -x APP=“mail” -x代表声明环境变量,完全等同于export。
export
直接执行export命令,会显示所有环境变量;
export APP=“mail” 其实相当于 declare -x APP=“mail”,设置后,在当前shell及其子shell中共用该环境变量。直接定义变量a=1,是不能在子shell中共用的。
set
set -xe
echo $var
ls none.txt
echo hello
# 运行./demo.sh
# ++ echo# ++ ls none.txt
# ls: 无法访问'none.txt': 没有那个文件或目录
-x 代表打印每一行的执行结果;
-e代表遇到错误就退出;bash默认遇到错误会接着执行;
还有-u,如果指定了未定义的变量,会报错退出;
set first second third
echo $1
# 运行./demo.sh param1
# first
# set 会重新赋值给位置参数
env
env --显示所有环境变量,包括自己脚本中编写的export的变量;
export --显示所有环境变量,和env查询出的变量一致;
declare --显示所有变量,包括全局变量(包括环境变量)、局部变量;
set --显示所有变量,和declare查询出的变量一致;
ps --forest
ps -ef --forest --展示父进程和子进程的关系
()开启子shell
利用括号,开启子she11的理念,以及检查,在she11脚本开发中,经常会用子she11进行多进程的处理,提高程序并发执行效率。
echo $BASH_SUBSHELL
0 # 0表示当前shell
(pwd;echo $BASH_SUBSHELL)
/home/xxx/Desktop
1 # 1 嵌套一层shell
(pwd;(echo $BASH_SUBSHELL))
/home/xxx/Desktop
2 # 2 嵌套2层shell
{} # 代表当前shell执行
tr 转换和压缩
echo 1234abcd|tr 12 34 # 3434abcd
echo 1234abcd|tr [0-9] d # ddddabcd
echo 1234abcd|tr [a-z] [A-Z] # 1234ABCD
echo 1234abcd|tr "1234" "[A*]C" # AAACabcd
echo 1234abcd|tr "1234" "AC" # ACCCabcd
echo 1234abcd|tr -t "1234" "AC" # AC34abcd
# 以上这种由set1转换为set2,是一一对应的,如果个数对不上,默认重复set2的最后一个字符。加上-t,可以避免重复,而不替换;echo 1234abcd|tr -d [:digit:] # abcd
echo 1234abcd|tr -dc [:digit:] # 1234
# -d 删除匹配的字符,-dc 保留匹配的字符(相当于反选)并且-c删除了末尾的换行符;echo aaa123bbbb123|tr -s 'ab' # a123b123
echo aaa123bbbb123|tr -s '123' 'ccc' # aaacbbbbc
# -s 代表压缩,第一个命令是对a和b字符压缩,第二个命令是先将123替换为ccc,再对ccc字符压缩;
mkdir
- mkdir a/{b, c} 指定目录下同时创建多个文件夹
- mkdir -p xx/xxx 代表无父目录可直接创建
解压和压缩
- tar czf a.tar.gz 1.txt 2.txt
- tar xzf a.tar.gz -C 目录
都可以加-v,显示具体过程
sort和uniq
cat file|sort # 默认按ASCII码排序
cat file|sort -u # 去重排序
echo -e '2\n1\n-9'|sort -n # 按数字排序
sort -r # 反向排序
sort -k2 file # 按第二列排序
uniq # 按行去重,只会对相邻重复的行去重
uniq -d file # 列出重复的行
uniq -u file # 列出不重复的行
uniq -c # 统计行的重复次数
# 实现对文件中获取重复行的重复次数
sort example.txt | uniq -ic # -i 不区分大小写
curl
curl -s -I http://example.com | grep HTTP
# -s 安静模式,不打印错误信息、进度信息、网速等;
# -I 发送一个 HEAD 请求,仅请求页面的 HTTP 头部信息,当仅需检查状态码时(HTTP/1.1 200 OK)可使用此命令。
shell内置和外置命令
内置命令通过compgen -b 查看;
“type + 命令” 可以判断是内置还是外置命令;
内置命令:在系统启动时就加载入内存,常驻内存,执行效率更高,但是占用资源,如pwd;
外置命令:系统需要从硬盘中读取程序文件,再读入内存加载,一定会开启子进程执行;
shell循环
# 循环读取test.txt中的每一行
while read x
doecho input is $x
done<test.txt
until [ ${i:=0} -gt 10 ]
dolet i++echo $i
done # 1 2 ... 10 11
while循环在条件为真时继续执行,条件为假时停止。
until循环在条件为假时继续执行,条件为真时停止。
for((i=0;i<5;i++));do echo $i;done
for i in {0..4};do echo $i;done
for i in $(seq 0 4);do echo $i;done
for i in 0 1 2 3 4;do echo $i;done
# 0 1 2 3 4
num=3
if (($num==3));then echo succ;elif (($num>3));then echo bigger;else echo smaller;fi
# succ
shell计算
普通计算
res=$((10+67))
num=10
let num=num+10
echo $num # 20
expr 10 + 9 # 19
# expr支持模式匹配,判断是否以.jpg为后缀,返回非0就是符合要求的;冒号代表计算匹配的字符长度
expr taohua.jpg : ".*\.jpg" # 10
expr taohua.jpg : ".*" # 10
expr length taohua.jpg # 10
# bc命令,计算1+2+3+..+1000
echo {1..1000}|tr " " "+"|bc
# []计算
echo $[10-9] # 1
需要注意的是,双小括号、let、expr、中括号只能进行整数计算,而bc可以支持小数计算。awk也可用于计算,虽然不是专门做计算的。
echo 2.4 4.5|awk '{print $1+$2}' # 6.9
shell应用
统计字符串长度
# 方式一:
name="Katherine Pierce"
echo ${#name}# 方式二:
echo $name|wc -L# 方式三:
expr length "$name"# 方式四:
echo $name|awk '{print length($0)}'
统计命令执行时间
time for i in {1..3000};do str1=`seq -s ":" 100`;echo ${#str1}>/dev/null;done
# real 0m5.143s 实际执行时间
# user 0m3.506s 用户态执行时间
# sys 0m1.692s 内核态执行时间
一般shell内置命令和语法,执行效率最高,因为底层都是用C实现,尽量减少管道符实现;
获取目录下的所有文件的完整路径
# demo.sh
#!/bin/bashfunction get_file(){for file in `ls $1`dodir_file=$1/$fileif [ -d $dir_file ]thenget_file $dir_fileelseecho $dir_filefidone
}
get_file $1# ./demo.sh /home/uos 打印目录下所有的文件
字符串截取
name="Katherine Pierce"
echo ${name:2} # therine Pierce
echo ${name:2:3} # the 截取3个字符
echo ${name:2:-3} # therine Pie 如果是负数,则截取到-3的位置处
name="Katherine therce"
echo ${name#*th} # erine therce 左边开始匹配,删除最短匹配
echo ${name##*th} ## erce 左边开始匹配,删除最长匹配
echo ${name%th*} ## Katherine 右边开始匹配,删除最短匹配
echo ${name%%th*} ## Ka 右边开始匹配,删除最长匹配
echo ${name/th/boy} ## 仅替换第一个,Kaboyerine therce
echo ${name//th/boy} ## 替换所有匹配,Kaboyerine boyerce
# cut命令也可用于截取字符
echo $name|cut -c 3-5 # the -c按字符位置切割
扩展变量
# 如果param变量为空,则word赋给$res,不会给$param;注意如果param不为空,则不进行相关处理;
res=${param:-word}
# 这里的冒号可以省略,有时候看到这样的写法也是可以的: ${BASE_SOURCE-$0}# 如果param变量为空,则word赋给$res和$param;注意如果param不为空,则不进行相关处理;
res=${param:=word}# 如果param变量为空,word作为stderr错误输出,否则输出变量值 ${param:?word}
${age:?无变量错误}
# bash: age: 无变量错误# 如果param变量为空,什么都不做,否则word返回 ${param:+word}
age=10
echo ${age:+jk}
# jk# 按目录查找文件,这样实现避免dir_path变量未赋值时报错
find ${dir_path:-./} -name "*.png"
待补充
参考
- shell课程;
- shell数组
相关文章:
shell基础用法
shell基础知识 shell中的多行注释 :<<EOF read echo $REPLY # read不指定变量,则默认写入$REPLY EOF # :<<EOF ...EOF 多行注释,EOF可以替换为!# 等文件目录和执行目录 echo $0$0 # ./demo.sh echo $0的realpath$(realpath…...
Redisson分布式锁
概览 个人博客源地址 Redisson不只是一个 Java Redis 客户端,它是一个以内存 Redis 服务器作为后端的处理 Java 对象(如 java.util.List, java.util.Map, java.util.Set, java.util.concurrent.locks.Lock 等)的一个框架。 Redisson提供了使用Redis的最简单和最…...
【C语言--趣味游戏系列】--电脑关机整蛊小游戏
前言: 老铁们,还是那句话,学习很苦游戏来补, 为了提高大家与朋友之间的友谊,博主在这里分享一个电脑关机的恶作剧小游戏,快拿去试试吧!!! 目录: 1.电脑关机代…...
C#实现一个HttpClient集成通义千问-开发前准备
集成一个在线大模型(如通义千问),来开发一个chat对话类型的ai应用,我需要先了解OpenAI的API文档,请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…...
二叉树优选算法(一)
一、根据二叉树创建字符串 题目介绍: 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 "()" 表示,转化后需…...
单片机C51--笔记8-STC89C51RC/RD-IIC协议
一、概述 IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式。 特点 简单性和有效性。 由于接口直接在组件之上,因此IIC总线占用的空间非常小…...
HttpUtil的get和post请求
Http工具类 import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.ht…...
leetcode 二进制数转字符串
1.题目要求: 2.题目代码: class Solution { public:string printBin(double num) {string result;double compare_value 1.0;//先给把0和.赋值给result;result.push_back(0);result.push_back(.);while(result.size() < 33){//利用十进制转换成二进制的方法//1.先给num …...
前端项目使用gitlab-cicd+docker实现自动化部署
GitLab CI/CD 是一个强大的工具,可以实现项目的自动化部署流程,从代码提交到部署只需几个步骤。本文将带你配置 GitLab CI/CD 完成一个前端项目的自动化部署。 前言 为什么使用cicddocker? 目前我们公司开发环境使用的shell脚本部署&#…...
【Linux】进程
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、冯诺依曼体系结构 🌟系统调用和库函数概念 二、操作系统OS 三、进程 🌟查看进程 🌟通过系统调用获取进程标示符 🌟通过系统调用创…...
transformers生成式对话机器人
简介 生成式对话机器人是一种先进的人工智能系统,它能够通过学习大量的自然语言数据来模拟人类进行开放、连贯且创造性的对话。与基于规则或检索式的聊天机器人不同,生成式对话机器人并不局限于预定义的回答集,而是可以根据对话上下文动态地…...
Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战
Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战 前言1.何为Text2SQL(NL2sql)2.Text2SQL结构与挑战3.金融领域实际业务场景4.注意事项5.总结 前言 随着信息技术的迅猛发展,人机交互的方式也在不断演进。…...
C# 关于加密技术以及应用(二)
AES(Advanced Encryption Standard)和 RSA(Rivest-Shamir-Adleman)是两种不同的加密算法,它们各自有特定的使用场景和优势。下面是它们的主要区别和适用场景: AES(高级加密标准) 特…...
四十四:Web如何关闭会话
在Web应用中,关闭会话(Session Termination)是一个重要的机制,用于确保用户的会话状态被安全地终止。无论是用户主动退出登录还是因超时被动登出,正确地管理会话关闭有助于提升安全性并释放服务器资源。 一、为什么需…...
在wsl2中安装archlinux
在之前的博客中,我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置,但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利,在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发…...
在Goland中对goroutine协程断点调试
在Goland中对goroutine协程断点调试 环境: Goland 参考了 chatgpt 的回复 进行断点调试的代码 package mainimport ("fmt""sync""time" )// worker 模拟处理任务 func worker(id int, wg *sync.WaitGroup) {defer wg.Done() // 确保任务完成后…...
最长连续递增序列
问题分解 1:要求 要求找到最长的连续递增子序列,即在原数组中位置连续且数值严格递增的一段序列 2:输入和输出 输入是一个未经排序的整数数组nums 输出是该数组中最长连续递增子序列的长度 3:边界调节 数组为空则长度为0 …...
apt 包 源 的维护 和缓存 命令
APT 包源维护命令 更新软件包列表: sudo apt update:从配置的软件源中获取最新的软件包信息。这是安装、升级或删除软件包前通常要执行的步骤,以确保使用的是最新的软件包信息。 升级软件包: sudo apt upgrade:升级系…...
【排序方法的总结】
在数据结构中常见的排序方法有: 插入排序、交换排序、选择排序、归并排序和基数排序等。 插入排序 特点: 简单直观,对于小规模的数据排序效率较高。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后…...
工作中常用springboot启动后执行的方法
前言: 工作中难免会遇到一些,程序启动之后需要提前执行的需求。 例如: 初始化缓存:在启动时加载必要的缓存数据。定时任务创建或启动:程序启动后创建或启动定时任务。程序启动完成通知:程序启动完成后通…...
QT 中使用 QTableView 和 QStandardItemModel 实现将数据导出到Excel 和 从Excel导入到 QTableView 的功能
简介 在Qt中,使用QTableView和QStandardItemModel来实现将数据导出到Excel和从Excel导入到QTableView的功能,而不使用第三方库(如QXlsx)。 效果 将 QTableView 中的数据导出到Excel //从tableview 导出到 EXcle void MainInterfa…...
模版方法模式的理解和实践
在软件开发中,设计模式为我们提供了一套经过验证的解决方案,用于解决常见的设计问题。其中,模版方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改…...
05-树莓派-交叉编译
交叉编译的概念 交叉编译是什么 来源百度百科: 交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。 举例来说,我们常说的x86 Lin…...
杨振宁大学物理视频中黄色的字,c#写程序去掉
先看一下效果:(还有改进的余地) 我的方法是笨方法,也比较刻板。 1,首先想到,把屏幕打印下来。c#提供了这样一个函数: Bitmap bmp new Bitmap(640, 480, PixelFormat.Format32bppArgb); // 创…...
非归档模式下一个或多个数据文件损坏恢复
1. 介绍 有些时侯可能你的库处于非归档的模式下,而你的联机重做日志又currupted,你的数据文件不能完成完全的恢复,这里为大家介绍一个oracle的一个隐藏参数_allow_resetlogs_corruption,让数据库重生。 通过设置隐含参数恢复 alter system …...
k8s 之storageclass使用nfs动态申请PV
文章目录 配置角色权限部署nfs-client-provisioner创建 NFS StorageClass创建 PVC 来动态申请 PV在 Pod 中使用 PVC验证存储是否正确挂载使用 kubectl 和 jq 筛选 PVCwaiting for a volume to be created, either by external provisioner "nfs-diy" or manually cre…...
Spark实训
实训目的: 介绍本实训的基本内容,描述知识目标、,以及本实训的预期效果等。 1、知识目标 (1)了解spark概念、基础知识、spark处理的全周期,了解spark技术是新时代对人才的新要求。 (2)掌握Linux、hadoop、spark、hive集群环境的搭建、HDFS分布文件系统的基础知识与应用…...
Mitel MiCollab 企业协作平台 任意文件读取漏洞复现(CVE-2024-41713)
0x01 产品简介 Mitel MiCollab是加拿大Mitel(敏迪)公司推出的一款企业级协作平台,旨在为企业提供统一、高效、安全的通信与协作解决方案。通过该平台,员工可以在任何时间、任何地点,使用任何设备,实现即时通信、语音通话、视频会议、文件共享等功能,从而提升工作效率和…...
React学习笔记(一)
创建函数写法一: 重点:函数有几种写法 function DemoShow() {return (<div className"App">函数声明</div>); }export default DemoShow;对应js创建函数声明:function sum1(a,b){return ab } 创建函数写法二&#x…...
【H2O2|全栈】MySQL的基本操作(三)
目录 前言 开篇语 准备工作 案例准备 多表查询 笛卡尔积 等值连接 外连接 内连接 自连接 子查询 存在和所有 含于 分页查询 建表语句 结束语 前言 开篇语 本篇继续讲解MySQL的一些基础的操作——数据字段的查询中的多表查询和分页查询,与单表查询…...
SQL按指定字符分割字符串
在SQL中分割字符串通常需要使用特定的函数,因为SQL本身并不像编程语言那样直接支持字符串分割。不同的数据库系统有不同的函数来处理字符串分割。以下是一些常见数据库系统中分割字符串的方法: 1. MySQL 在MySQL中,你可以使用SUBSTRING_IND…...
NAT traversal 原理 | TCP / UDP/ P2P
注:本文为 “NAT traversal ”相关的几篇文章合辑。 未整理去重。 NAT 穿越技术原理 Li_yy123 于 2020-12-08 18:54:26 发布 一、NAT 由来 为了解决全球公有 IPv4 的稀缺,提出了 NAT 技术。NAT 是 Network Address Translation 网络地址转换的缩写。 …...
喜报!极限科技(INFINI Labs)通过国家高新技术企业认定
2024 年 10 月 29 日,国家高新技术企业认定管理工作网公示了北京市认定机构 2024 年认定报备的第一批高新技术企业备案名单,极限数据(北京)科技有限公司 顺利通过本次高新技术企业评审,并获得 国家级“高新技术企业”认…...
在Ubuntu 22.04上搭建Kubernetes集群
Kubernetes 简介 什么是 Kubernetes? Kubernetes(常简称为 K8s)是一个强大的开源平台,用于管理容器化应用程序的部署、扩展和运行。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation(CNCF࿰…...
【OpenCV】平滑图像
二维卷积(图像滤波) 与一维信号一样,图像也可以通过各种低通滤波器(LPF)、高通滤波器(HPF)等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...
Vue了解
MVVM和MVC区别是什么? MVC : 传统的设计模式。 设计模式: 一套广泛被使用的开发方式 M: model 模型 模型:就是数据的意思 V : view视图 视图:就是页面的意思 C:controlle…...
JS 深拷贝浅拷贝
一、浅拷贝 // 假设有一个JSON对象 let originalObject {name: "Alice",age: 25,interests: ["reading", "coding"] };// 将JSON对象赋值给另一个变量 let copiedObject originalObject;// 修改新变量的属性 copiedObject.age 26;// 输出原始…...
设计模式学习之——单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这个模式的主要目的是控制对象的创建,确保在程序的整个生命周期中,某个类只有一个实例被创…...
Linux Vi/Vim使用 ⑥
掌握 CentOS 7 下的 Vi/Vim 编辑器:从安装到精通 在 CentOS 7 系统的日常运维、编程开发以及各类文本处理场景中,Vi/Vim 编辑器都是不可或缺的得力工具。它以轻量、高效、功能强大著称,虽然初次上手有一定学习门槛,但掌握之后便能…...
【5G】5G技术组件 5G Technology Components
5G的目标设置非常高,不仅在数据速率上要求达到20Gbps,在容量提升上要达到1000倍,还要为诸如大规模物联网(IoT, Internet of Things)和关键通信等新服务提供灵活的平台。这些高目标要求5G网络采用多种新技术…...
Java 学习,字符串比较
Java 字符串比较通常使用 equals() 方法,而不是使用 运算符。因为 运算符,比较的是字符串对象的引用是否相同,而 equals() 方法比较的是字符串的内容是否相同。 使用equals()等方法,比较两个字符串: public class …...
普通算法——二维前缀和
二维前缀和 题目链接:https://www.acwing.com/problem/content/798/ 题目描述: 输入一个 n n n 行 m m m 列的整数矩阵,再输入 q q q 个询问,每个询问包含四个整数 ** x 1 , y 1 , x 2 , y 2 x1,y1,x2,y2 x1,y1,x2,y2 &…...
2024年API接口发展趋势:智能化、自动化引领潮流
随着信息技术的飞速发展,应用程序编程接口(API)已成为现代软件开发的核心组成部分。API作为不同系统之间的桥梁,使得数据、功能和服务能够在各种平台和设备之间无缝流动。在2024年,API接口正经历着一系列显著的变革和发…...
SQL中的通配符:使用LIKE操作符进行模式匹配
在SQL中,LIKE 操作符用于在查询中进行模式匹配。它常用于 WHERE 子句中,以便根据特定模式查找数据。与直接进行精确匹配的 操作符不同,LIKE 允许你使用通配符来对数据进行模糊查询,从而使查询更加灵活和强大。 常见的SQL通配符 …...
数据结构:数组
线性表: 线性表就是数据排成像一条线一样的结构.每个现行表上的数据最多只有前和后两个方向.常见的线性表结构:数组,链表、队列、栈等。 什么是数组: 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储…...
2022 年“泰迪杯”数据分析技能赛A 题竞赛作品的自动评判
2022 年“泰迪杯”数据分析技能赛A 题竞赛作品的自动评判 完整代码请私聊 博主 一、背景 在各类学科竞赛中,常常要求参赛者提交 Excel 或/和 PDF 格式的竞赛作品。 本赛题以某届数据分析竞赛作品的评阅为背景,要求参赛者根据给定的评分准则和标准答案&a…...
java+ssm+mysql美妆论坛
项目介绍: 使用javassmmysql开发的美妆论坛,系统包含超级管理员,系统管理员、用户角色,功能如下: 用户:主要是前台功能使用,包括注册、登录;查看论坛板块和板块下帖子;…...
MySQL | 尚硅谷 | 第13章_约束
MySQL笔记:第13章_约束 文章目录 MySQL笔记:第13章_约束第13章_约束 1. 约束(constraint)概述1.1 为什么需要约束1.2 什么是约束1.3 约束的分类演示代码 2. 非空约束2.1 作用2.2 关键字2.3 特点2.4 添加非空约束2.5 删除非空约束演示代码 3. 唯一性约束3…...
【Ubuntu】Ubuntu的Desktop(学习/用户使用)和Bit版本(工作)
这篇文章似乎没什么必要写,但想了想还是决定记录一下,也许对新手入坑Ubuntu会有帮助, 事实上也很简单,一个是桌面版本,另一个是字符界面版本。 桌面版:拥有图形桌面 字符界面,易上手ÿ…...
面试之MySQL自增ID耗尽问题的解决方案详解
自增ID耗尽问题的解决方案详解 目录 引言切换到BIGINT分表分库UUID雪花算法(Snowflake)回收已删除的ID其他策略策略选择和实施总结 引言 在现代数据库应用中,自增ID作为主键被广泛使用。随着数据量的不断增长,自增ID耗尽问题逐…...