Linux命令-Shell编程
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
写一个hello.sh脚本:
1.mkdir scripts
2.cd scripts
3.touch hello.sh
4.vim hello.sh
#!/bin/bash
echo "hello,world"
5.bash hello.sh(另外启用一个bash进程)
5.chmod +x scripts/hello.sh scripts/hello.sh(必须要用相对或绝对路径,不能进入scripts文件夹再执行) ./hello.sh(最常用)
5.(前两种都启用子shell进程)source hello.sh . hello.sh(不启用子shell进程,没有父子shell嵌套关系)
用ps -f可以查看bash进程数量,用exit可以退出子bash进程。
开子shell与不开子shell的区别就在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。
echo $HOME | 查看系统变量 |
env | less | 查看所有系统全局变量 |
set | less | 查看定义的所有变量 |
自定义变量
在子shell更改变量,不影响父shell。
全局环境变量名字建议大写。
a=2(等号两边不能加空格)
echo $a
s="hello, world"(变量的值有空格,需要使用双引号括起来。)
echo $s
export s(升级成全局变量)
a=$((1+5))(可以进行符号运算) a=$[1+5]
echo $a
readonly b=5(定义一个只读变量)
b=10(报错,只读)
unset a(删除变量a)
unset b(删除不了,只读)
特殊变量
1.$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10})
vim hello.sh
#!/bin/bash
echo "hello, world"
echo "hello, $1"
./hello.sh xiaoming(将xiaoming填入$1)
vim parameter.sh
单引号就不会把里面的$认为是变量,而是原封不动输出。
#!/bin/bash
echo '----------$n-----------'
echo script name:$0
echo 1st parameter:$1
echo 2nd parameter:$2
chmod +x parameter.sh
./parameter.sh abc def
2.$#(功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)。
vim parameter.sh
#!/bin/bash
echo '----------$n-----------'
echo script name:$0
echo 1st parameter:$1
echo 2nd parameter:$2
echo '----------$#-----------'
echo parameter numbers:$#
./parameter.sh abc def
3.$*(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
vim parameter.sh
#!/bin/bash
echo '----------$n-----------'
echo script name:$0
echo 1st parameter:$1
echo 2nd parameter:$2
echo '----------$#-----------'
echo parameter numbers:$#
echo '----------$*-----------'
echo $*
echo '----------$@-----------'
echo $@
./parameter.sh abc def
4.$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行:如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
echo $?(接上面代码,结果为0)
parameter.sh(报错)
echo $?(非0)
运算符
echo $[5 * 2]
s=$[(2+3) * 4]
echo $s
cd /scripts
vim add.sh
#!/bin/bash
sum=$[$1 + $2]
echo sum=$sum
chmod +x add.sh
./add.sh 25 25
条件判断
[ condition ](注意condition前后要有空格)
注意:条件非空即为 true,[ happygame ]返回true,[ ]返回 false。
[ $a = Hello ](等号两边需要空格,否则识别成一个值)
echo $?(如果a是Hello则结果为0)
[ $a != Hello ]
echo $?(a是Hello则结果为1)
-eq | 等于(equal) |
-ne | 不等于(not equal) |
-lt | 小于(less than) |
-le | 小于等于(less equal) |
-gt | 大于(greater than) |
-ge | 大于等于(greater equal) |
[ 2 -lt 8 ]
echo $?(结果为0)
[ 2 -gt 8 ]
echo $?(结果为1)
-r | 有读的权限(read) |
-w | 有写的权限(write) |
-x | 有执行的权限(execute) |
touch test
[ -r test ]
echo $?
[ -w test ]
echo $?
[ -x test ]
echo $?
-e | 文件存在(existence) |
-f | 文件存在并且是一个常规的文件(file) |
-d | 文件存在并且是一个目录(directory) |
[ -e test ]
echo $?
[ -f test ]
echo $?
[-d test ]
echo $?
a=15
[ $a -lt 20 ] && echo "$a < 20" || echo "$a > 20"(输出15 < 20)
a=27
[ $a -lt 20 ] && echo "$a < 20" || echo "$a > 20"(输出27 > 20)
if单分支
cd /scripts
vim if_test.sh
在条件判断里面加入双引号和x防止报错,当变量传入为空时就用上x。
#!/bin/bash
if [ "$1"x = "happygame"x ]
thenecho "welcome, happygame"
fi
chmod +x if_test.sh
./if_test.sh happygame
a=25
if [ $a -gt 18 ] && [ $a -lt 35 ]; then echo OK; fi(输出OK)
if多分支
vim if_test.sh
#!/bin/bash
if [ "$1"x = "happygame"x ]
thenecho "welcome, happygame"
fi# 输入第二个参数表示年龄,判断属于哪个年龄段
if [ $2 -lt 18 ]
thenecho "未成年人"
elseecho "成年人"
fi
./if_test.sh happygame 15(未成年人)
./if_test.sh happygame 25(成年人)
vim if_test.sh
#!/bin/bash
if [ "$1"x = "happygame"x ]
thenecho "welcome, happygame"
fi# 输入第二个参数表示年龄,判断属于哪个年龄段
if [ $2 -lt 18 ]
thenecho "未成年人"
elif [ $2 -lt 35 ]
thenecho "青年人"
elif [ $2 -lt 60 ]
thenecho "中年人"
elseecho "老年人"
fi
./if_test.sh happygame 25(青年人)
./if_test.sh happygame 45(中年人)
./if_test.sh happygame 65(老年人)
case
vim case_test.sh
#!/bin/bashcase $1 in
1)echo "one"
;;
2)echo "two"
;;
3)echo "three"
;;
*)echo "number else"
;;
esac
chmod +x case_test.sh
./case_test.sh 2(two)
./case_test.sh 6(number else)
for
vim sum_to.sh
用$取到sum和i的值,加号运算符要在$和[]运算表达式中
#!/bin/bashfor (( i=1; i <= $1; i++ ))
dosum=$[ $sum + $i ]
doneecho $sum
chmod +x sum_to.sh
./sum_to.sh 100(输出5050)
以下是linux中常用的写法:
for os in linux windows macos; do echo $os; done(输出这三个操作系统名称)
for i in {1..100}; do sum=$[$sum+$i]; done; echo $sum(输出5050)
$*和$@的区别:
vim parameter_for_test.sh
#!/bin/bashecho '--------------$*-------------'
for para in "$*"
doecho $para
doneecho '--------------$@-------------'
for para in "$@"
doecho $para
done
chmod +x parameter_for_test.sh
./parameter_for_test.sh a b c d e
$*把它们作为一个整体,$@仍然把他们作为独立个体。
结果如下:
while
vim sum_to.sh
#!/bin/bash# 用for实现
for (( i=1; i <= $1; i++ ))
dosum=$[ $sum + $i ]
done
echo $sum# 用while实现
a=1
while [ $a -le $1 ]
dosum2=$[ $sum2 + $a ]$a=$[$a + 1]
done
echo $sum2
./sum_to.sh 100(输出两个5050)
read
用于读取控制台输入。
-p | 指定读取值时的提示。 |
-t | 指定读取值时等待的时间(秒)如果不加 - t则一直等待。 |
vim read_test.sh
#!/bin/bashread -t 10 -p "请输入您的名字:" name
echo "welcome, $name"
chmod +x read_test.sh
./read_test.sh
系统函数
vim cmd_test.sh
$(date +%s)相当于用$()将date函数的值取出来。
#!/bin/bashfilename="$1"_log_$(date +%s)
echo $filename
chmod +x cmd_test.sh
./cmd_test.sh happygame
basename /root/scripts/parameter.sh(结果输出parameter.sh)
basename /root/scripts/parameter.sh .sh(结果输出parameter,删除了后缀.sh)
vim parameter.sh
#!/bin/bash
echo '----------$n-----------'
echo script name: $(basename $0 .sh)
echo 1st parameter:$1
echo 2nd parameter:$2
echo '----------$#-----------'
echo parameter numbers:$#
echo '----------$*-----------'
echo $*
echo '----------$@-----------'
echo $@
/root/scripts/parameter.sh a b
dirname /root/scripts/parameter.sh(结果输出/root/scripts)
vim parameter.sh
先进入路径,再得出绝对路径。
#!/bin/bash
echo '----------$n-----------'
echo script name: $(basename $0 .sh)
echo script path: $(cd $(dirname $0); pwd)
echo 1st parameter:$1
echo 2nd parameter:$2
echo '----------$#-----------'
echo parameter numbers:$#
echo '----------$*-----------'
echo $*
echo '----------$@-----------'
echo $@
./parameter.sh a b
自定义函数
vim fun_test.sh
用sum变量得到echo的返回值,如果用$?返回只能返回0-255的数字。
#!/bin/bashfunction add(){s=$[$1 + $2]echo $s
}read -p "请输入第一个整数: " a
read -p "请输入第二个整数: " bsum=$(add $a $b)
echo "和: "$sum
chmod +x fun_test.sh
./fun_test.sh(接下来要手动输入两个数)
还可以计算和的平方:
#!/bin/bashfunction add(){s=$[$1 + $2]echo $s
}read -p "请输入第一个整数: " a
read -p "请输入第二个整数: " bsum=$(add $a $b)
echo "和的平方: "$[$sum * $sum]
练习一:归档文件
vim daily_archive.sh
#!/bin/bash# 首先判断输入参数个数是否为1
if [ $# -ne 1 ]
thenecho "参数个数错误!应该输入一个参数作为归档的目录名。"exit
fi# 从参数中获取目录名称
if [ -d $1 ]
thenecho
elseechoecho "目录不存在!"echoexit
fiDIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)# 获取当前日期
DATE=$(date +%y%m%d)# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE# 开始归档目录文件
echo "开始归档..."
echo tar -czf $DEST DIR_PATH/DIR_NAME# 判断是否归档成功
if [ $? -eq 0 ]
thenecho echo "归档成功!"echo "归档文件为: $DEST"echo
elseecho "归档出现问题!"echo
fiexit
mkdir /root/archive
chmod u+x daily_archive.sh
./daily_archive.sh ../scripts
接下来将这个脚本加入到定时任务中:
crontab -e
0 2 * * * /root/scripts/daily_archive.sh /root/scripts
常用特殊字符
cat /etc/passwd | grep ^a | 找到以a开头的内容 |
cat /etc/passwd | grep bash$ | 找到以bash结尾的内容 |
cat daily_archive.sh | grep -n ^$ | 找到空行的位置,-n显示行号 |
cat daily_archive.sh | grep r..t | 找到r和t中间有两个任意字符的内容,如root |
cat etc/passwd | grep ro*t | 找到o出现0次或多次的内容,如rt,rot,root等 |
cat etc/passwd | grep ^a.*bash$ | 找到以a开头以bash结尾的内容 |
cat etc/passwd | grep ^a.*var.*in$ | 找到以a开头以in结尾,中间还有var的内容 |
[6,8] | 匹配6或者 8 |
[0-9] | 匹配一个0-9的数字 |
[0-9]* | 匹配任意长度的数字字符串 |
[a-z] | 匹配一个a-z之间的字符 |
[a-z]* | 匹配任意长度的字母字符串 |
[a-c,e-f] | 匹配a-c或者e-f之间的任意字符 |
cat /etc/passwd | grep r[a,b,c]*t | 找到rt,rat,rbt,rabt等的内容 |
cat daily_archive.sh | grep '\$' | 用\转义,找到含$的内容 |
echo "13812345678" | grep ^1[34578][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$ | 筛选手机号 |
echo "13812345678" | grep -E ^1[34578][0-9]{9}$ | 用-E支持扩展的正则 |
cut
vim cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
cat cut.txt
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列,默认制表符\t |
-c | 按字符进行切割,加n表示取第几列 |
cut -d " " -f 1 cut.txt(截取出第一列的内容)
cut -d " " -f 2,3 cut.txt(截取第二、三列的内容)
cat /etc/passwd | grep bash$
cat /etc/passwd | grep bash$ | cut -d ":" -f 1,6,7
截取出以下内容:
cat /etc/passwd | grep bash$ | cut -d ":" -f 1-4 | 截取1-4列 |
cat /etc/passwd | grep bash$ | cut -d ":" -f -4 | 截取1-4列 |
cat /etc/passwd | grep bash$ | cut -d ":" -f 4- | 截取4到最后一列 |
ifconfig ens33 | grep netmask | cut -d " " -f 10 | 截取到IP地址,inet前面有8个空格 |
ifconfig | grep netmask | cut -d " " -f 10 | 截取出IP地址,本地环回地址,虚拟地址 |
awk
-F | 指定输入文件分隔符,空格为默认分隔符 |
-v | 赋值一个用户定义变量 |
cat /etc/passwd | grep ^root | cut -d ":" -f 7 | 以root开头的第七列所有内容 |
cat /etc/passwd | awk -F ":" '/^root/ {print $7}' | 等价于上面的式子 |
cat /etc/passwd | awk -F ":" '/^root/ {print $1","$7}' | 第一列和第七列,要给逗号打双引号拼接 |
cat /etc/passwd | awk -F ":" '/^root/ {print $1","$6","$7}' | 第一列第六列和第七列 |
cat /etc/passwd | awk -F ":" 'BEGIN{print "user, shell"}{print $1","$7} END{print "end of file"}' | 在最开头加入user, shell,在结尾加入end of file |
cat /etc/passwd | awk -F ":" '{print $3+1}' | 将第三列的数字全部加1 |
cat /etc/passwd | awk -v i=1 -F ":" '{print $3+i}' | 将第三列的数字全部加i,更灵活 |
FILENAME | 文件名 |
NR | 已读的记录数(行号) |
NF | 浏览记录的域的个数(切割后列的个数) |
awk -F ":" '{print "文件名:"FILENAME " 行号:"NR " 列数:"NF }' /etc/passwd | 显示文件名、行号、列数 |
ifconfig | awk '/^$/ {print "空行:"NR}' | 显示空行的行号 |
ifconfig | awk '/netmask/ {print $2}' | 显示IP地址,本地环回地址,虚拟地址,awk前八个空格不考虑 |
练习二:发送消息
mesg(查看是否打开消息功能)
who -T(+则打开了消息功能,-则关闭了消息功能)
vim send_msg.sh
#!/bin/bash# 查看用户是否登录(-i忽略大小写,-m最多拿几行,awk那第一列)
login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')# -z判断是否为空
if [ -z $login_user ]
thenecho "$1 不在线!"echo "脚本退出..."exit
fi# 查看用户是否开启消息功能
is_allowed=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
if [ $is_allowed != "+" ]
thenecho "$1 没有开启消息功能"echo "脚本退出..."exit
fi# 确认是否有消息发送
if [ -z $2 ]
thenecho "没有消息发送"echo "脚本退出..."exit
fi# 从参数中获取要发送的消息
whole_msg=$(echo $* | cut -d " " -f 2-)# 获取用户登录的终端
user_terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')# 写入要发送的消息(write写入要指定发送的用户和发送的终端)
echo $whole_msg | write $login_user $user_terminalif [ $? != 0 ]
thenecho "发送失败!"
elseecho "发送成功!"
fiexit
chmod u+x send_msg.sh
./send_msg.sh happygame hi, happygame
相关文章:
Linux命令-Shell编程
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。 写一个hello.sh脚本: 1.mkdir scripts 2.cd scripts 3.touch hello.sh 4.vim hello.sh #!/bin/bash echo "hello,world" 5.bash hello.sh(…...
基于Django的AI客服租车分析系统
基于Django的AI客服租车分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】AI智能客服与用户交互指导手册 【技术栈】 ①:系统环境:Python 3.8,Django 4.2框架 ②:开发环境&a…...
计算机组成与体系结构:计算机结构的分类(classifications of computer architecture)
目录 Von Neumann Architecture(冯诺依曼结构) Harvard Architecture(哈佛结构) Modified Harvard Architecture(改进哈佛结构) 三种结构对比总结表 💡 从“内存访问结构”角度分类&#x…...
在阿里云和树莓派上编写一个守护进程程序
目录 一、阿里云邮件守护进程 1. 安装必要库 2. 创建邮件发送脚本 mail_daemon.py 3. 设置后台运行 二、树莓派串口守护进程 1. 启用树莓派串口 2. 安装依赖库 3. 创建串口输出脚本 serial_daemon.py 4. 设置开机自启 5. 使用串口助手接收 一、阿里云邮件守护进程 1.…...
Redis 的几种数据类型
Redis 提供了多种数据类型,以支持不同的应用场景。每种数据类型都有其特定的操作方式,并且在内部实现上也有所优化,能够满足不同的业务需求。以下是 Redis 支持的几种常见数据类型: 1. 字符串(String) 描…...
Spring之我见 - Spring Boot Starter 自动装配原理
欢迎光临小站:致橡树 Spring Boot Starter 的核心设计理念是 约定优于配置,其核心实现基于 自动配置(Auto-Configuration) 和 条件化注册(Conditional Registration)。以下是其生效原理: 约定…...
LeRobot 项目部署运行逻辑(二)—— Mobile Aloha 真机部署
LeRobot 在开源项目中详细说明了部署流程,所以首先看一下开源的内容,然后再逐步拆解 首先,LeRobot 开源的硬件是配全部在 examples 文件夹中 包括了 Stretch 3、Aloha and Aloha 2 stationary、SO-100、LeKiwi、Moss v1 等机器人 恰好实验…...
大模型面经 | 介绍一下CLIP和BLIP
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
Java发生OOM是否必然导致JVM退出
Java发生OOM是否必然导致JVM退出? 核心结论 不一定。OOM是否导致JVM退出取决于以下因素: OOM发生的区域JVM启动参数配置是否捕获了OOM异常 详细分析 1. 不同内存区域的OOM影响 内存区域错误类型默认是否导致JVM退出可恢复性Java堆OutOfMemoryError…...
Docker Compose 外部网络(`external: true`)与内部网络的区别
Docker Compose 外部网络(external: true)与内部网络的区别 在 Docker Compose 中,external: true 声明的外部网络与普通(内部)网络有重要区别,以下是它们的详细对比: 1. 定义与创建方式 特性外部网络 (external: true)内部网络 (默认)创建…...
【Android】Wallpaper学习
从wallpaper的设置来了解相关内容: 一,静态壁纸 静态壁纸设置的原理是在WallpaperManagerService里监听/data/system/users/0/wallpaper_orig相关文件的变化来触发设置,通过相应的组件程序去进行绘制, 相应的组件如:…...
Java基础-第一章、基本数据类型
运算符: 1.算术运算符:加减乘除%等 2.逻辑运算符:与或非等 3.关系运算符:大于、小于... 4.赋值运算符: 这里牵扯运算符的运算先后顺序了。 赋值运算的返回值:就是赋值的变量本身...
《Operating System Concepts》阅读笔记:p748-p748
《Operating System Concepts》学习第 64 天,p748-p748 总结,总计 1 页。 一、技术总结 1.Transmission Control Protocol(TCP) 重点是要自己能画出其过程,这里就不赘述了。 二、英语总结(生词:3) transfer, transport, tran…...
Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏
Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏 Project 08 - Digital Hourglass 数字沙漏程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数计时和点亮LED:读取倾斜开关状态:重置LED和计时器:运行过程注意事项Project 08 - …...
报告总结笔记 | Jeff Dean ETH AI趋势 笔记:AI 的重要趋势:我们是如何走到今天的,我们现在能做什么,以及我们如何塑造 AI 的未来?
报告总结笔记 | Jeff Dean ETH AI趋势 笔记:AI 的重要趋势:我们是如何走到今天的,我们现在能做什么,以及我们如何塑造 AI 的未来? 2025年 4 月 14 日,Google Research 及 Google DeepMind 的首席科学家、A…...
RocketMQ实现基于可靠消息的最终一致性
RocketMQ实现基于可靠消息的最终一致性 文章目录 RocketMQ实现基于可靠消息的最终一致性一、RocketMQ应用场景**应用解耦****流量削峰****数据分发** 二、RocketMQ 基础概念1. 核心组件2. 消费模式3. 消息可靠性 三、消息类型按发送方式分同步发送异步发送单向发送 按使用功能特…...
【题解-Acwing】790. 数的三次方根
题目:790. 数的三次方根 题目描述 给定一个浮点数 n,求它的三次方根。 输入 共一行,包含一个浮点数 n 。 输出 共一行,包含一个浮点数,表示问题的解。 注意,结果保留 6 位小数。 数据范围 −10000 ≤ n ≤ 10000 时空限制 1s / 64MB 输入样例 1000.00输出样…...
一键升级OpenSSH/OpenSSL修复安全漏洞
在服务器安全运维过程中,我们经常面临这样的问题:收到高危漏洞通报(如最近的OpenSSH多个CVE漏洞),但Ubuntu系统无法通过apt直接升级到修复版本。这种情况下,传统方法需要手动编译源码,处理依赖关…...
Pycharm 如何删除某个 Python Interpreter
在PyCharm中,点击右下角的“Interpreter Settings”按钮,或者通过菜单栏选择“File” > “Settings”(macOS用户选择“PyCharm” > “Preferences”)。在设置窗口中,导航到“Project: [Your Project Name]” >…...
【C++】深入浅出之多态
目录 多态的概念多态的定义和实现多态的构造条件虚函数虚函数的重写虚函数重写的两个例外协变析构函数作为虚函数重写 C11的override和final重载、重写(覆盖)、隐藏(重定义)的对比相关面试题⭐ 抽象类概念接口继承和实现继承 多态的原理虚函数表多态的原理动态绑定和静态绑定 e…...
精益数据分析(9/126):如何筛选创业路上的关键数据指标
精益数据分析(9/126):如何筛选创业路上的关键数据指标 大家好!在创业的漫漫长路中,数据就像一盏明灯,指引着我们前行的方向。但要让这盏灯发挥作用,关键在于找到那些真正有价值的数据指标。今天…...
【Python爬虫详解】第二篇:HTML结构的基本分析
在上一篇文章中,我们介绍了网络爬虫的基本概念、发展历程和工作原理。要进行有效的网页内容爬取,首先需要理解我们要爬取的对象 —— 网页的基本结构和语法。网页本质上是由HTML代码构成的,爬虫程序需要从HTML中提取我们需要的信息。因此&…...
【C++】 —— 笔试刷题day_21
一、爱丽丝的人偶 题目解析 现在存在n个玩偶,每个玩偶的身高是1、2、3......n; 现在我们要对这些玩偶进行排序(如果x人偶,它左右两边的玩偶一个比x高、一个比x矮,那这个玩偶就会爆炸)。 我们不想要任何一个…...
云点数据读写
一、常见点云数据格式 LAS/LAZ格式 LAS是点云数据的行业标准格式 LAZ是LAS的压缩版本 支持地理参考信息、颜色、强度等属性 PCD格式(Point Cloud Data) PCL(Point Cloud Library)开发的格式 支持ASCII和二进制存储 包含头部信息和数据部分 PLY格式(Polygon File Format…...
Matlab 汽车行驶速度PID控制系统仿真
1、内容简介 Matlab 213-汽车行驶速度PID控制系统仿真 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
STM32嵌入式
一、创建工程项目 1、进入软件首页 2、新建项目,【file】->【new project】 3、选择需要的芯片 4、系统内核部分设置 ① 选择晶振(使用外部的高速晶振) ② 选择debug形式(SW类型) 5、时钟设置 6、选择自己需要的引脚设置&a…...
机器学习(神经网络基础篇)——个人理解篇6(概念+代码)
1 在声明一个类中,构建一个属于类的函数,前面为什要加上“self”? 就像下面这一串代码: class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std0.01):# 初始化权重self.params {}self.p…...
Java学习手册:Filter 和 Listener
在 JavaWeb 开发中,Filter(过滤器)和 Listener(监听器)是两个重要的技术组件,它们在处理客户端请求、管理应用状态和资源以及实现全局逻辑控制等方面发挥着关键作用。 一、Filter(过滤器&#…...
深度学习总结(25)
抽样偏倚问题 非代表性数据有一个特别隐蔽又特别常见的例子,那就是抽样偏倚(sampling bias)。如果你的数据收集过程与你尝试预测的目标之间存在相互影响,就会出现抽样偏倚,从而导致有偏差的结果。 理解数据 将数据…...
探索 Model Context Protocol (MCP):它如何影响 AI 的表现?
Anthropic 公司 Anthropic 是一家技术实力雄厚的公司,也是大模型领域的重要参与者之一。其开发的 **Claude 模型** 是全球首个以编程能力见长并广受欢迎的大语言模型。这款模型凭借卓越的代码生成和理解能力,迅速成为许多开发者工具的核心组件。例如&am…...
Three.js + React 实战系列-3D 个人主页 :完成 Navbar 导航栏组件
在上一节中,我们搭建了项目的基础结构,搭建好了项目框架。 本节我们将继续完善页面结构,完成第一个视觉组件 —— Navbar 导航栏 ✅ 前置准备: ✅下载静态资源在根目录下 (src 同级)谷歌云盘地址 🎥 02 完成 Navba…...
游戏引擎学习第238天:让 OpenGL 使用我们的屏幕坐标
回顾并为今天的内容做准备 我们已经完成了硬件显示的实现,现在通过GPU来显示游戏。原本以为这会花费很长时间,但结果实际所需的时间并不多。因此,我们现在有了进展,但接下来应该做什么还不确定。虽然有很多事情可以做,…...
go+mysql+cocos实现游戏搭建
盲目的学了一段时间了,刚开始从Box2d开始学习,明白了很多,Box2d是物理模型的基础,是我们在游戏中模拟现实的很重要的一个开源工具。后来在朋友的建议下学习了cocos,也是小程序开发的利器,而golang是一款高效…...
Linux 网络基础(二) (传输协议层:UDP、TCP)
目录 一、传输层的意义 二、端口号 1、五元组标识一个通信 2、端口号范围划分 3、知名端口号(Well-Know Port Number) (1)查看端口号 4、绑定端口号数目问题 5、pidof & netstat 命令 (1)ne…...
Vue常用指令入门
1. v-for 作用:用于遍历对象或数组 注意:需要提供key属性,可以提高性能和避免渲染错误,值通常为index或item.id <li v-for"(item, index) in items" :key"index">{{ item }} </li>2. v-if,v-el…...
【文献阅读】EndoNet A Deep Architecture for Recognition Tasks on Laparoscopic Videos
关于数据集的整理 Cholec80 胆囊切除手术视频数据集介绍 https://zhuanlan.zhihu.com/p/700024359 数据集信息 Cholec80 数据集 是一个针对内窥镜引导 下的胆囊切除手术视频流程识别数据集。数据集提供了每段视频中总共7种手术动作及总共7种手术工具的标注,标…...
UML统一建模
UML UML(统一建模语言)介绍 UML(统一建模语言)介绍 面向对象软件开发需要经过OOA面向对象分析、OOD面向对象设计和OOP面向对象编程三个阶段。OOA对目标系统进行分析并寄哪里分析模型,并将之文档化,OOD用面向…...
Ubuntu下安装和卸载MySQL
Ubuntu下安装和卸载MySQL 下面的演示系统版本:Ubuntu 24.04 更新系统软件包 在开始安装之前,建议先更新系统的软件包列表,以确保所有依赖项是最新的。 sudo apt update && sudo apt upgrade -y安装MySQL服务器 Ubuntu的官方软件…...
物联网技术赋能:复杂环境下的能源数据零丢失
安科瑞顾强 在全球能源挑战日益严峻的背景下,高效节能已成为各行业的核心诉求。无论是商业综合体、工业厂房还是公共设施,如何实现能源的精细化管理成为关键课题。安科瑞能耗云平台凭借其创新技术与多功能服务,为企业提供了一站式能源管理解…...
卷积神经网络综述
摘要 本文对卷积神经网络(Convolutional Neural Network,CNN)进行了全面综述。首先介绍了卷积神经网络的发展历程,包括早期的理论基础和关键突破。接着详细阐述了卷积神经网络的结构组成,包括卷积层、池化层、全连接层…...
SpringBoot3设置maven package直接打包成二进制可执行文件
注意事项 SpringBoot普通native打包顺序clean compile spring-boot:process-aot native:compile 使用以下配置只会的打包顺序clean package(注意:使用此配置以后打包会有编译后的class文件、jar包、original源文件、二进制可执行文件【Linux是无后缀的包…...
在 Anaconda 上安装多版本 Python 解释器并在 PyCharm 中配置
默认已安装好 Anaconda 和 PyCharm ,想在 Anaconda 上安装最新版本的 Python 解释器。 一、在 Anaconda 上创建虚拟环境 在连网状态下进入系统的命令提示符(快捷键:win r ,输入 cmd 即可),输入如下命令&a…...
AES (高级加密标准)
原理详解 AES是一种对称加密算法,使用相同的密钥进行加密和解密。它采用替代-置换网络(SPN)结构,主要步骤包括: 密钥扩展:从初始密钥派生多轮密钥 初始轮:AddRoundKey(轮密钥加) 主轮ÿ…...
Git拉分支技巧:从零开始创建并推送分支
Git拉分支技巧:从零开始创建并推送分支 在团队协作开发中,Git 分支管理是不可或缺的技能。合理地创建、同步和推送分支,不仅能提高开发效率,还能避免代码冲突。本文将基于以下技巧,详细讲解如何从零开始创建并推送一个…...
线性回归之归一化(normalization)
文章目录 归一化与梯度下降归一化的必要性:从特征量纲到梯度下降问题背景矛盾与低效归一化的作用 归一化提高模型精度的原因归一化的本质常见归一化方法最大值最小值归一化示例说明优缺点分析 标准归一化具体机制示例说明 强调 归一化与梯度下降 归一化与梯度下降 &…...
mac监控linux上mysql性能(Grafana+Prometheus+mysqld_exporter)
一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装(mac)-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录页面 (默认用户名和密码都为admin,进入后…...
【玩泰山派】MISC(杂项)- linux桌面环境
文章目录 linux桌面环境linux四大桌面环境概述ubuntu基于四大桌面环境的版本 显示管理器gdm3(GNOME Display Manager)lightdm(Lightweight Display Manager)SDDM(Simple Desktop Display Manager)KDM&#…...
MVCC介绍
MVCC(多版本并发控制)详解 MVCC(Multi-Version Concurrency Control) 是一种数据库并发控制技术,核心思想是通过维护数据的多个版本来实现读写操作的无锁并发,从而在高并发场景下提升性能。它广泛用于 MyS…...
神经网络与模型训练过程笔记
1.专有名词 ANN 人工神经网络,一种受生物神经元启发的监督学习算法。输入数据通过网络中的层级函数传递,激活特定神经元。函数复杂度越高,模型对数据的拟合能力越强,预测精度越高。 偏置项 其中x下表从1开始的是输入变量…...
ASP.NET 0~1学习
变量 string username Request["id"]; 声明并初始化一个字符串变量 username 数据类型 下面列出了常用的数据类型: 类型描述实例int整数(全数字)103, 12, 5168float浮点数3.14, 3.4e38decimal十进制数字(高精度&a…...