shell 编程
文章目录
- 一、shell 编程
- 1.1. 脚本执行
- 1.2. 变量
- 1.3. 特殊变量
- 1.4. 运算符
- 1.5. for 循环
- 1.6. while 循环
- 1.7. case 语句
- 1.8. read 命令
- 1.9. if 判断
- 1.10. 判断语句
- 1.11. 自定义函数
- 1.12. 脚本调试
- 二、sed
- 2.1. sed 选项
- 2.2. sed function
- 2.3. sed 删除(d 命令)
- 2.4. sed 替换(s 命令)
- 2.5. 多点编辑(e 命令)
- 2.6. 插入(i 命令)
- 三、awk
- 3.1. 三种调用方式
- 3.2. 实例
- 3.3. 内置变量
- 3.4. awk 编程
- 3.5. 参考
- 四、自动化部署脚本
- 4.1. 安装 jdk
- 4.2. ssh 免密
一、shell 编程
1.1. 脚本执行
# 1. 输入脚本绝对路径或相对路径,需要先添加脚本的执行权限(+x)
./case.sh
/root/case.sh# 2. 用解释器执行脚本
sh case.sh# 3. 在脚本的路径前再加 ‘.’,1和2 会新开一个 bash,变量不共享,3 不会新开 bash
./root/case.sh
../case.sh
1.2. 变量
1. 变量=值 (例如STR=abc)
2. 等号两侧不能有空格
3. 变量名称一般习惯为大写
4. 双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意
STR="hello world"
A=9
unset A # 撤销变量 A
readonly B=2 # 声明静态的变量 B=2 ,不能 unset
export A # export 变量名 可把变量提升为全局环境变量,可供其他shell程序使用# 将命令的返回值赋给变量
A=`ls -la` # 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) # 等价于反引号
1.3. 特殊变量
$? # 表示上一个命令退出的状态
$$ # 表示当前进程编号
$0 # 表示当前脚本名称
$n # 表示n位置的输入参数(n代表数字,n>=1)
$# # 表示参数的个数,常用于循环
$* # 表示参数列表
$@ # 和 $*都表示参数列表
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以$1 $2 … $n 的形式输出所有参数;
当它们被双引号" “包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … n"的形式输出所有参数;"n"的形式输出所有参数;"n"的形式输出所有参数;"@" 会将各个参数分开,以"$1" “2"…"2" … "2"…"n” 的形式输出所有参数;
1.4. 运算符
# 格式 :expr m + n 或 $((m+n)) 注意expr运算符间要有空格
# 例如计算(2 +3 )×4 的值# 分步计算
S=`expr 2 + 3`
expr $S \* 4# 一步完成计算
expr `expr 2 + 3 ` \* 4
echo `expr \`expr 2 + 3\` \* 4`
# 或
$(((2+3)*4))
1.5. for 循环
for N in 1 2 3
doecho $N
done
# 或
for N in 1 2 3; do echo $N; done
# 或
for N in {1..3}; do echo $N; donefor ((i = 0; i <= 5; i++))
doecho "welcome $i times"
done
# 或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
1.6. while 循环
while expression
do# command# …
donei=1
while ((i<=3))
doecho $ilet i++
done
1.7. case 语句
case $1 in
start)echo "starting";;
stop)echo "stoping";;
*)echo "Usage: {start|stop} "
esac
1.8. read 命令
# read -p(提示语句)-n(字符个数) -t(等待时间)
read -p "please input your name: " NAME
please input your name: aure
echo $NAME
aure
1.9. if 判断
# 语法
if condition
thenstatements
[elif conditionthen statements. ..]
[elsestatements ]
fi# if例子
#!/bin/bash
read -p "please input your name:" NAME
# printf '%s\n' $NAME
if [ $NAME = root ]
thenecho "hello ${NAME}, welcome !"
elif [ $NAME = itcast ]thenecho "hello ${NAME}, welcome !"
elseecho "SB, get out here !"
fi
1.10. 判断语句
[ condition ] # 注意condition前后要有空格
[ test ]# 非空返回true,可使用 $? 验证(0为true,>1为false)
[ ] # 空返回false
[ condition ] && echo OK || echo notok # 条件满足,执行后面的语句
常用判断条件
- = 字符串比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- -r 有读的权限
- -w 有写的权限
- -x 有执行的权限
- -f 文件存在并且是一个常规的文件
- -s 文件存在且不为空
- -d 文件存在并是一个目录
- -b文件存在并且是一个块设备
- -L 文件存在并且是一个链接[外链图片转存失败,源站可能有防盗链image!机制,建png]接上传mattachment:g-e.png)attachment:image.png)]
1.11. 自定义函数
# 语法[ function ] funname [()]
{action;[return int;]
}function start() / function start / start()#!/bin/bash
fSum 3 2;
function fSum()
{echo $1,$2;return $(($1+$2));
}
fSum 5 7;
total=$?;
echo $total,$?;
- 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译;
- 函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255);
1.12. 脚本调试
sh -vx helloWorld.sh # 或者在脚本中增加set -x
二、sed
sed 全称是:Stream EDitor即流编辑器,是一个很好的文本处理工具,本身是一个管道命令,处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行。它是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作;
2.1. sed 选项
- -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来;
- -e :直接在命令列模式上进行 sed 的动作编辑;
- -i :直接修改读取的文件内容,而不是输出到终端;
2.2. sed function
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
- d :删除,因为是删除啊,所以 d 后面通常不接任何内容
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
- p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
- s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g
2.3. sed 删除(d 命令)
# 删除 exp 第二行
sed '2d' exp# 删除第二到末尾的所有行
sed '2,$d' exp# 删除 exp 文件的最后一行
sed '$d' exp# 删除exp 中包含 cc 的行
sed '/cc/'d exp
2.4. sed 替换(s 命令)
# 在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
sed 's/test/mytest/g' example# (-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
sed -n 's/^test/mytest/p' example# &符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
sed 's/^192.168.0.1/&localhost/' example# love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
sed -n 's/\(love\)able/\1rs/p' example# 不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
sed 's#10#100#g' example# 选定行的范围:逗号
sed -n '/test/,/check/p' example # 所有在模板test和check所确定的范围内的行都被打印。# 打印从第五行开始到第一个包含以test开始的行之间的所有行。
sed -n '5,/^test/p' example# 对于模板test和check之间的行,每行的末尾用字符串sed test替换。
sed '/test/,/check/s/$/sed test/' example
2.5. 多点编辑(e 命令)
# (-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
sed -e '1,5d' -e 's/test/check/' example
2.6. 插入(i 命令)
# 如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
sed '/aa/i\\ new str
三、awk
AWK 是一种优良的文本处理工具。其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母,AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
3.1. 三种调用方式
- 命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件;
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格;
- shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
- 将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
3.2. 实例
# 显示最近登录的5个帐号
last -n 5 | awk '{print $1}'
# 读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。# 显示/etc/passwd的账户
cat /etc/passwd | awk -F ':' '{print $1}' # awk+action的示例,每行都会执行action{print $1}, -F指定域分隔符为':'# 显示/etc/passwd的账户和账户对应的shell,且账户与shell之间以tab键分割
cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'# 显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
# 先执行BEGIN,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。# 搜索/etc/passwd有root关键字的所有行
awk -F: '/root/' /etc/passwd # pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。# 找root开头的(正则)
awk -F: '/^root/' /etc/passwd# 搜索/etc/passwd有root关键字的所有行,并显示对应的shell
awk -F: '/root/{print $7}' /etc/passwd
3.3. 内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
# 统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd# 使用printf替代print
awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd# print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
# printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
3.4. awk 编程
# 统计/etc/passwd的账户人数(count 是自定义变量)
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd# 统计某个文件夹下的文件占用的字节数
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'# 以M为单位显示
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'# 条件语句
# 统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹)
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'# 循环语句
# 显示/etc/passwd的账户
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
3.5. 参考
官方参考
四、自动化部署脚本
4.1. 安装 jdk
BASE_SERVER=node04
yum install -y wget
wget $BASE_SERVER/soft/jdk-7u45-linux-x64.tar.gz
tar -zxvf jdk-7u45-linux-x64.tar.gz -C /usr/local
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/jdk1.7.0_45
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
4.2. ssh 免密
#!/bin/bashSERVERS="node03 node04"
PASSWORD=999999
BASE_SERVER=192.168.100.10auto_ssh_copy_id() {expect -c "set timeout -1;spawn ssh-copy-id $1;expect {*(yes/no)* {send -- yes\r;exp_continue;}*assword:* {send -- $2\r;exp_continue;}eof {exit 0;}}";
}ssh_copy_id_to_all() {for SERVER in $SERVERSdoauto_ssh_copy_id $SERVER $PASSWORDdone
}ssh_copy_id_to_allfor SERVER in $SERVERS
doscp install.sh root@$SERVER:/rootssh root@$SERVER /root/install.sh
done
相关文章:
shell 编程
文章目录一、shell 编程1.1. 脚本执行1.2. 变量1.3. 特殊变量1.4. 运算符1.5. for 循环1.6. while 循环1.7. case 语句1.8. read 命令1.9. if 判断1.10. 判断语句1.11. 自定义函数1.12. 脚本调试二、sed2.1. sed 选项2.2. sed function2.3. sed 删除(d 命令…...

Leetcode.1401 圆和矩形是否有重叠
题目链接 Leetcode.1401 圆和矩形是否有重叠 Rating : 1709 题目描述 给你一个以 (radius, xCenter, yCenter)表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2),其中 (x1, y1)是矩形左下角的坐标,而 (x2, y2)是右上角的坐标。 如果圆和矩…...

CHAPTER 3 Web Server - httpd配置(二)
Web Server - httpd配置二3.1 httpd配置3.1.1 基于用户的访问控制3.1.2 basic认证配置示例:1. 添加用户2. 添加网页文件3. 定义安全域4. 修改父目录权限5. 访问效果6. 在配置文件中定义一个".htaccess"隐藏文件7. 添加组3.1.3 虚拟主机1. 构建方案2. 基于…...

VSCode 连接 SSH 服务器
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/129133964 配置VSCode 下载VSCode:https://code.visualstudio.com/ 安装 Remote - SSH: 点击右下角蓝色图标: 连接服务器: 即可。 默认连接:ssh chen…...

如何选择靠谱的插画培训课程
如何选择靠谱的插画培训课程,今天教你3个维度选择一个靠谱的插画培训班! 插画培训机构课程: 1.选择插画培训班时,要先考察课程,看看课程内容是否符合自己的需求,是否有助于提高插画技术。课程设置应该灵活…...

剑指 Offer 28. 对称的二叉树
剑指 Offer 28. 对称的二叉树 难度:easy\color{Green}{easy}easy 题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 但是下…...

深入Spring底层透析后置处理器之豁然开朗篇
目录前言Spring的后置处理器Bean工厂后置处理器Bean后置处理器自定义Component实现注解开发前言 看这篇文章之前,需要了解Bean创建的过程,本篇文章是接着bean创建的基本流程的续写 Bean创建的基本过程:http://t.csdn.cn/1lK2d Spring的后置处…...

软件测试(基础定义篇)
测试基础 1、什么是软件测试?2、常见的测试分类3、质量模型 4、软件测试流程 5、测试用例 6、测试用例设计方法 )1、什么是软件测试? 1、什么是软件? 答:软件是控制计算机硬件工作的工具。 2、软件的组成? 3、什么是…...
华为OD机试 - 寻找目标字符串 | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...

使用echart绘制中国地图并显示人数
文章目录引言效果如图所示vue中echarts4.9版本,地图的使用引言 在做毕设的过程中,有一个需求:根据用户的ip,在前端展示出中国地图,然后展现出每个省有多少人这样子 经过百度后,发现可以使用echart来完成该…...

Git的常用命令
1:软件安装1.1:Git下载与安装百度上搜索Git官网:https://git-scm.com/下载:https://git-scm.com/download/win下载Git安装程序,双击安装 Git-2.9.3.2-64-bit.exe配置环境变量path 使用git --version查看 git 是否安装成…...
AcWing1018.最低通行费
1018.最低通行费一个商人穿过一个 NN 的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间 1 个小方格,都要花费 1 个单位时间。商人必须在 (2N−1)(2−1) 个单位时间穿越出去。而在经过中间的每个小方…...

【面试题】vue中的插槽是什么?
大厂面试题分享 面试题库后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库一、slot是什么在HTML中 slot 元素 ,作为 Web Components 技术套件的一部分,是Web组件内的一个占位符该占位符可以在后期…...
Go语言结构体struct详解,Go空结构体的这些妙用你知道吗?
本文详解了Go语言结构体的各个知识点,最后介绍了空结构体的3种妙用。希望对你有帮助。 定义 结构体,是一种自定义的数据类型,由多个数据类型组合而成。用于描述一类事物相关属性。 定义方式: type 类型名 struct {字段名 字段类…...
华为OD机试 - 航天器(Python) | 机试题+算法思路+考点+代码解析 【2023】
航天器 题目 给航天器一侧加装长方形和正方形的太阳能板(图中的斜线区域); 需要先安装两个支柱(图中的黑色竖条); 再在支柱的中间部分固定太阳能板; 但航天器不同位置的支柱长度不同; 太阳能板的安装面积受限于最短一侧的那支支柱的长度; 现提供一组整型数组的支柱高度数据;…...

【Optional】告别丑陋判空,使用Optional类
一、概述 当项目中充斥着大量的、丑陋的判空语句,如下: if (user ! null) {Address address user.getAddress();if (address ! null) {Country country address.getCountry();if (country ! null) {String isocode country.getIsocode();if (isocod…...

魔兽世界服务端端新手搭建教程
明杰也是很久以前开始研究魔兽服务器架设,主要原因是亚服经常要排队6-7个小时,去不排除的服和单机没啥区别,以怀旧服玩到10级以后就开始玩335端,一开始也和新入手的人一样云里雾里的,经过长时间的学习总算有点成就,向新…...

宝塔搭建实战人才求职管理系统mobile手机端vue源码(五)
大家好啊,我是测评君,欢迎来到web测评。 上一期给大家分享骑士cms会员管理member前端vue在本地运行打包、宝塔发布部署的方式,本期给大家分享,mobile移动端vue怎么在本地运行,打包,实现线上功能更新替换的方…...
生态应用:探讨 NGINX 与上下游系统集成时的开发经验
NGINX 作为一款高性能的 Web 服务器和反向代理服务器,在各种应用场景中广泛应用。随着业务的发展,我们在使用 NGINX 时,可能需要将其与其他系统进行集成,以实现更加复杂的业务需求。 本文将结合实际应用场景,探讨 NGI…...

ArcGIS批量拼接大量栅格遥感影像:Mosaic工具
本文介绍在ArcGIS下属的ArcMap软件中,基于Mosaic工具,批量对大量栅格遥感影像文件加以拼接、镶嵌的方法。 在GIS应用中,我们时常需要对大量栅格遥感影像数据加以批量拼接的工作。这一步骤可以基于Python语言实现,具体可以参考文章…...
【学习笔记】Lamba表达式[匿名函数]
【学习笔记】Lamba表达式[匿名函数] Lamba表达式格式函数模板Lamba表达式例子 Lamba表达式格式 格式: [捕获列表](参数列表) -> 返回类型 { 函数体 }1、捕获列表:指定如何访问外部变量(如 [&x] 引用捕获,[x] 值捕获&#…...

【计算机组成原理】计算机硬件的基本组成、详细结构、工作原理
引言 计算机如同现代科技的“大脑”,其硬件结构的设计逻辑承载着信息处理的核心奥秘。从早期程序员手动输入指令的低效操作,到冯诺依曼提出“存储程序”概念引发的革命性突破,计算机硬件经历了从机械操控到自动化逻辑的蜕变。本文将深入拆解…...
Java 2D 图形类总结与分类
一、基本形状类 这些类用于绘制简单的标准几何形状。 1. 圆形 / 椭圆类 Ellipse2D:椭圆基类,支持浮点精度。 子类: Ellipse2D.Double:双精度浮点坐标。Ellipse2D.Float:单精度浮点坐标。 参数:x, y, wid…...
阿里140 补环境日志
所有属性值是 __cheng________ 都是我做的防止套代理 非140环境检测代码 这个日志绝大多数 是做和浏览器tostring结果 处理一致 方法: toString 函数: ...... 结果: ..... 当前代码补了事件和dom 实际手补 比这少些 下方为环境日志: VM526 vm.js:…...

Seed1.5-VL登顶,国产闭源模型弯道超车丨多模态模型5月最新榜单揭晓
随着图像、文本、语音、视频等多模态信息融合能力的持续增强,多模态大模型在感知理解、逻辑推理和内容生成等任务中的综合表现不断提升,正在展现出愈发接近人类的智能水平。多模态能力也正在从底层的感知理解,迈向具备认知、推理、决策能力的…...

HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖
##鸿蒙核心技术##运动开发##Core Speech Kit(基础语音服务)# 前言 在运动类应用中,语音播报功能不仅可以提升用户体验,还能让运动过程更加生动有趣。想象一下,当你准备开始运动时,一个温暖的声音提醒你“…...

单片机0-10V电压输出电路分享
一、原理图 二、芯片介绍 GP8101是一个PWM信号转模拟信号转换器,相当于一个PWM信号输入,模拟信号输出的DAC。此 芯片可以将占空比为0%到100%的PWM信号线性转换成0-5V或者0-10V的模拟电压,并且输出电压 精度小于1%。GP8101M可以处理高频调制的…...

Linux编程:1、文件编程
一、Linux 文件编程与 C 语言文件编程的区别 特性C 语言 I/O 库函数Linux 文件编程(系统调用)实现层面用户空间(glibc 库)内核空间(系统调用)跨平台性跨平台(Windows/Linux)仅限 Li…...

89.实现添加收藏的功能的后端实现
实现完查看收藏列表之后,实现的是添加收藏的功能 我的设想是:在对话界面中,如果用户认为AI的回答非常好,可以通过点击该回答对应的气泡中的图标,对该内容进行添加 所以后端实现为: service类中添加&…...
go语言学习 第6章:错误处理
第6章:错误处理 在任何编程语言中,错误处理都是一个至关重要的环节。Go语言以其简洁而强大的错误处理机制而闻名,这使得开发者能够以一种优雅且高效的方式处理程序中可能出现的错误情况。本章将深入探讨Go语言中的错误处理机制,包…...