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

linux之shell脚本实战

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

文章目录
1 Shell 基础介绍
1.1 Shell 简介
Shell 概述
Shell 发展史
查看Shell
查看系统默认安装的 Shell
查看当前登录用户默认 Shell
查看当前的 Shell
1.2 Shell 脚本(定义、作用、格式、权限及执行)
Shell 脚本基础知识
Shell 脚本的约束Shell 脚本可以完成很多任务,但不适用于所有情况
Shell 脚本开发环境
Shell 脚本指定解释器
执行 Shell 脚本
后台执行 Shell 脚本
2 Shell 编程基础
2.1 输入输出、管道
Linux 中的文本流
输出重定向
输入重定向
管道
2.2 字符、变量、运算
2.2.1 Shell 中的字符
2.2.2 Shell 中的变量
变量的类型
使用变量
扩展变量
变量的赋值和输出
2.2.3 Shell 的算术扩展
在 Shell 中计算时间
算术运算常用表达式
算术运算优先级
变量递增的前置后置区别
2.3 语句(条件、循环)
Shell 中的结构化命令
条件语句
多分支判断语句
循环语句
for 循环
for 循环中的列表
for 循环奇数累加器
for 循环文件展示
while 循环
until 循环
使用循环打印乘法表
3 Shell 编程最佳实践
3.1 调试
Shell 脚本错误故障排除
调试模式
评估退出代码
3.2 语法风格
3.3 最佳实践示例
检测日志告警信息并邮件通知

1 Shell 基础介绍
1.1 Shell 简介
Shell 概述

Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口
Shell 将用户输入的命令并且把它们送到内核去执行,然后返回执行结果
Shell 是可编程的,它允许用户编写由 Shell 命令组成的程序
Shell 发展史
1971 : Bell Labs 的 Ken Thompson 为 UNIX 开发了第一个 Shell: V6 Shell 是一个在内核之外执行的独立的用户程序
1977 :Steven Bourne 在 AT&T Bell Labs 为 V7 UNIX 创建 Bourne shell
1978 :Bill Joy 在伯克利分校攻读研究生期间为 BSD UNIX 系统开发的 csh
1983 : Ken Greer 在卡内基-梅隆大学开发了 tcsh,将 C Shell 引入了 Tenex 系统中的一些功能,如命令行编辑功能和文件名和命令自动补全功能
1983 :David Korn 在 AT&T Bell Labs 创建 korn shell,它功能更强大,提供关联数组表达式运算
1989 :Bourne-Again Shell(或 Bash)是一个开源 GNU 项目,旨在取代 Bourne shell;Bash 由 Brian Fox 开发,已成为世上最流行的 Shell,它兼容 sh、csh、ksh,是 Linux 系统的默认 Shell
在 Linux 中,有多种 Shell 程序可供选择,比如 dash、csh、zsh 等,默认的 Shell 可以在 /bin/sh 查看,在etc/passwd 中修改。

查看Shell
查看系统默认安装的 Shell

cat /etc/shells

查看当前登录用户默认 Shell
 

echo $SHELL

查看当前的 Shell

echo $0

1.2 Shell 脚本(定义、作用、格式、权限及执行)
Shell 脚本基础知识
在 Unix/Linux 里,一个程序/命令只做好一件事;复杂的问题可以通过多个命令的组合来解决;形式最简单的 Shell 脚本就是一系列命令构成的可执行文件,并可以被其他脚本复用。编写风格良好易读的 Shell 脚本可以提高日常任务的自动化程度和准确性。

Shell 脚本的约束Shell 脚本可以完成很多任务,但不适用于所有情况
Shell 脚本可以完成很多任务,但不适用于所有情况
对于可以通过调用其他命令行实用工具来完成的任务,Shell 脚本是一种不错的选择
Shell 脚本可以作为一种“胶水”语言,整合其他编程语言 当解决某个问题时,Shell 脚本实现起来复杂度高,效率低,此时就可以考虑使用其他编程语言。
Shell 脚本开发环境
可以在任意文本编辑器中打开新文件来创建 Shell 脚本。

高级编辑器如 Vim 和 Emacs,在识别文件的后缀为 .sh 后,可以提供语法高亮、检查、补全等功能。

[root@localhost~]# vim demo.sh     #新建一个脚本文件,并写入如下内容:
#!/bin/bash
echo "Hello World“
[root@localhost~]# sh demo.sh
Hello World

Shell 脚本指定解释器
Shell 脚本只是静态的代码,若要输出结果,还需要解释器的参与。一般在脚本的第一行,指定执行此脚本的解释器。如果不指定解释器,脚本也能在默认的解释器中正常运行,但出于规范和安全的考虑,建议指定如下:

#!/bin/bash#!/bin/csh

执行 Shell 脚本
对于脚本文件,我们有两种执行方式:

sh script_name.sh
./script_name.sh

Linux 中一切皆文件,脚本/命令/程序都是一个文件,文件作为一个对象,具有权限的属性。在执行别人发送或从网上下载的脚本时可能会遇到权限问题,赋予执行权限可解决:

chmod +x script_name.sh

如果某个 Shell 脚本可执行,则可以通过在命令行中输入其名称调用.被成功调用的前提是,脚本所在路径包含在 $PATH 变量中

查看 $PATH 变量
修改 $PATH 变量

查找某个命令/脚本的路径

[root@localhost~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost~]# PATH=$PATH:/New/path
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/New/path
#永久修改 $PATH 需要在 .bashrc 或 .bash_profile 中添加 export PATH=“$$PATH:/new/path”

后台执行 Shell 脚本
有时候一些脚本执行时间较长,命令行界面会被占用,因此可以采取后台运行脚本:

 ./my_script.sh & 

这种方法在退出 Shell 后,脚本进程会随之终止,为了保证脚本一直运行,可以采用:

 nohup ./my_script.sh &


脚本的的标准输出和标准错误会重定向到 nohup.out 文件里

使用 jobs 命令可以查看后台中运行着的进程。

2 Shell 编程基础
2.1 输入输出、管道
Linux 中的文本流
文本流存在于 Linux 的每一个进程中。Linux 的每个进程启动时,会打开三个文本流的端口:标准输入、标准输出、标准错误。这三个端口对应着一个程序的输入、输出和异常的抛出。

例如:
在 bash 中输入一串字符后,bash 进程中的标准输入端口捕获命令行中的输入,进行处理后从标准输出端口中传出,回显在屏幕上,如果处理过程中发生异常,则会通过标准错误端口,将异常回显在屏幕上。

输出重定向
某些情况下,我们需要保存程序的输出,此时就可以通过重定向,将程序的输出保存到文件中

将标准输出定向到文件中, 使用这种方式会将程序的标准输出覆盖文件内容:

 ls > dir_log


将标准输出追加到文件中, 使用这种方式会将程序的标准输出追加至文件的末尾:

 ls >> dir_log


执行完命令后,可以通过 cat dir_log 查看保存的文件内容
输入重定向
与输出重定向类似,输入重定向是把程序的标准输入进行重新定向。

输入重定向:

格式:command < inputfile
将右边的文件作为标准输入,然后传入左边的命令
例: wc -l < /dev/null
内联输入重定向:

格式: command << maker
输出重定向需要文件,而内联输入重定向可以使用即时输入的文本作为标准输入,传入左边的命令
右边的字符“maker”作为标志,表示标准输入的开始和结束,自身不包含在标准输入里。
下图例中以“maker”作为标志

command << maker >file,同时将输入的内容存成文件

管道
有时需要将一个命令的输出连到另一个命令的输入,如果用重定向实现会较复杂。

管道( | )就像现实中的水管一样,可以连接两个命令的输入和输出,甚至是串联多个命令

格式:command1 | command2 | command3

[root@localhost ~]# ls /bin/ | grep python | less

管道实际上是进程间通信(IPC)的一种方式

2.2 字符、变量、运算
2.2.1 Shell 中的字符

和其他编程语言一样,Shell 也有一些保留字(特殊字符),在编写脚本时需要注意。


注释符号(Hashmark[Comments])
在shell文件的行首,作为shebang标记,#!/bin/bash;
其他地方作为注释使用,在一行中,#后面的内容并不会被执行,除非用单/双引号包围时,#作为#号字符本身,不具有注释作用。
单引号(full quoting [single quote])
单引号括住的内容,被视为单一字符串,引号内的禁止变量扩展,所有字符均作为字符本身处理(除单引号本身之外),单引号必须成对出现。
反斜线,反斜杆(escape [backslash])
放在特殊符号之前,转义特殊符号的作用,仅表示特殊符号本身,这在字符串中常用;放在一行指令的最末端,表示紧接着的回车无效(其实也就是转义了Enter),后继新行的输入仍然作为当前指令的一部分。
斜线,斜杆(Filename path separator [forward slash])
作为路径的分隔符,路径中仅有一个斜杆表示根目录,以斜杆开头的路径表示从根目录开始的路径;
在作为运算符的时候,表示除法符号。如:a=4/2
感叹号(reverse (or negate) [bang],[exclamation mark])
取反一个测试结果或退出状态。表示反逻辑,比如后面的!=,这个是表示不等于;表示取反,如:ls a[!0-9] 表示a后面不是紧接一个数字的文件;
2.2.2 Shell 中的变量
任何语言都有变量这个要素。Shell 与其他强类型的编程语言如:C,Java 和 C++ 等有很大不同,Shell 中的变量是无类型的。通过一个变量,我们可以引用一块内存区域的值,变量名就是这块内存区域上贴的一个标签。

变量赋值:variable=value


变量的类型
在 Linux Shell 中,变量主要有两大类:环境变量和用户定义变量。每种类型的变量依据作用域不同,又分为全局变量和局部变量

全局变量作用在整个 Shell 会话及其子 Shell
局部变量作用在定义它们的进程及其子进程内
查看变量

使用 printenv 查看全局变量
使用 set 查看某个特定进程中的所有变量,包括局部变量、全局变量以及用户定义变量
对比 printenv 与 set 的区别:dif -yw <(printenv) <(set)
命令set是Shell中的一个内建命令,它能够显示当前Shell中的变量,已经用户自定义的变量,不管该变量有没有export。set命令允许你更改Shell选项的值并设置位置参数,或者显示Shell变量的名称和值。如果未提供任何选项或参数,则会设置显示所有Shell变量和函数的名称和值(按照当前语言环境排序),并且输出的格式可以重新用作设置或重置当前设置变量的输入
printenv和env在环境变量打印方面是类似的。但是在功能上,env主要用于设置环境变量并运行指定的命令命令,而printenv是为了打印环境变量。
set则是一个Shell的内建命令,与Shell有关,用于设置Shell的属性。

修改变量

在 .bash_profile 或 .bashrc 中添加 export 语句,永久修改变量
使用变量
Shell 变量命名规则:

变量名由数字、字母、下划线组成
必须以字母或者下划线开头
不能使用 Shell 里的关键字
定义变量的格式:

variable=value
variable='value'
variable="value"

赋值号的周围不能有空格
如果有必要,也可以使用 declare 关键字显式定义变量的类型
查询关键字:help | grep <keywords>
如果 value 包含了空白符,则需要用引号包裹起来
单引号包裹的内容,shell 不展开命令、变量,即原样输出
双引号反之,会展开其中包裹的命令和变量
扩展变量
在以下示例中,如果不使用花括号,Bash 会将$FIRST_$LAST 解释为变量 $FIRST_ 后跟变量 $LAST,而不是由_ 字符分隔的变量 $FIRST 和 $LAST。


因此,在此情况下,必须使用花括号引用的形式才能使变量扩展正确运行。

变量的赋值和输出
定义并赋值如下变量,个人姓名 name,日期 time
输出姓名及日期变量
读取输入并输出。read 命令,等待用户输入,随后将输入的内容赋给变量

2.2.3 Shell 的算术扩展
算术扩展可用于执行简单的整数算术运算
语法:$[表达式]
如:

[root@localhost ~]# echo $[1+9]
10
[root@localhost ~]# echo $[8*8]
64
[root@localhost ~]# count=1;echo $[$[$count+3]*2]
8

在 Shell 中计算时间
定义24小时,60分钟,60秒变量,定义每天秒数变量并赋值,输出变量

[root@localhost ~]# SEC_PER_MIN=60
[root@localhost ~]# MIN_PER_HR=60
[root@localhost ~]# HR_PER_DAY=24
[root@localhost ~]# SEC_PER_DAY=$[$SEC_PER_MIN*$MIN_PER_HR*$HR_PER_DAY]
[root@localhost ~]# echo "There are $SEC_PER_DAY seconds in a day"
There are 86400 seconds in a day

算术运算常用表达式算术运算优先级
优先级由高到低如下:


变量递增的前置后置区别
i++ 要开辟一个变量来保存 i 的值 并返回,然后让 i 这个变量 的值 +1 。而 ++i 直接把 1 加到 i 这个 变量的空间中去,并返回这个空间 中的值, 没有开辟任何临时空间,性能更高。

2.3 语句(条件、循环)
Shell 中的结构化命令
在 Shell 脚本里除了顺序执行,还需要一些额外的逻辑控制流程。

和其他编程语言类似, Shell 中的结构化命令主要包括条件、循环两类

条件语句
Shell 中的 if 和其他 if 判断的条件不太一样,需注意。

If-then 语句
语法:

if commandthencommandsfi

Bash Shell 会先执行 if 后面的语句,如果其退出状态码为 0,则会继续执行 then 部分的命令,否则会执行脚本中的下一个命令。

多分支判断语句
在涉及多条件判断时,可能会使用较为繁琐的 if-then-else 语句,通过 elif 语句频繁检测同一个变量的值,此时更适合使用 case 语句
语法:

case variable inpattern1 | pattern2) commands1;;pattern3) commands2;;*) default commands;;
esac

case 语句会将指定的变量与不同的模式比较,若匹配,则执行对应的命令
用 | 可以分割出多个模式
用 * 代表所有与已知模式不匹配的值
循环语句
Shell 脚本中常会遇到一些重复任务,相当于循环执行一组命令直到满足了某个特定条件

常见的循环语句有三种:for、while、until

循环控制符有两种:break、continue 用于控制循环流程的转向

for 循环

#Shell风格语法
for var in listdocommandsdone#例:
for i in {1..10}
doprintf "$i\n"
done#c语言风格
for ((var assignment ; condition ; iteration process))
docommands
done#例:
for (( i = 1; i < 10 ; i++))
doecho “Hello”
done

do和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同。for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列。

for 循环中的列表

[root@localhost~]# for HOST in host1 host2 host3; do echo $HOST; done 
host1
host2
host3
[root@localhost ~]# for HOST in host{1..3}; do echo $HOST; done             
host1
host2
host3
[root@localhost~]# for EVEN in $(seq 2 2 8); do echo "$EVEN"; done;

for 循环奇数累加器
定义奇数累加器文件,并执行
参考脚本:

#!/bin/bashsum=0
for i in {1..100..2}
dolet "sum+=i"
done    
echo "sum=$sum"

for 循环文件展示
展示目录下所有文件
参考脚本:

#!/bin/bashfor file in $(ls)
doecho "file: $file“
done

while 循环
也称为前测试循环语句,重复次数是利用一个条件来控制是否继续重复执行这个语句。为避免死循环,必须保证循环体中包含循环出口条件

#!/bin/bashsum=0;i=1 
while(( i <= 100 ))
dolet "sum+=i"let "i += 2"   
doneecho "sum=$sum"

until 循环
与 while 循环类似,但是跳出循环的条件判断有所区别

#!/bin/bash
#奇数累加器sum=0;i=1 
until(( i > 100 ))
dolet "sum+=i"let "i += 2"   
doneecho "sum=$sum"

使用循环打印乘法表
参考脚本:

#!/bin/bashfor (( i = 1; i <=9; i++ ))do        for (( j=1; j <= i; j++ ))do       let "temp = i * j"             echo -n "$i*$j=$temp  "     done          
printf “\n”
done

3 Shell 编程最佳实践
3.1 调试

Shell 脚本错误故障排除
编写、使用或维护 Shell 脚本的管理员不可避免地会遇到脚本的错误

错误通常是由于输入错误、语法错误或脚本逻辑不佳导致
在编写脚本时,将文本编辑器与 bash 语法高亮显示结合使用可以帮助使错误更明显
找到并排除脚本中错误的最直接方法是调试
避免在脚本中引入错误的另一种简单方法是在创建脚本期间遵循良好风格
调试模式
脚本上激活调试模式,请向脚本第一行中的命令解释器中添加 -x 选项
如此前乘法表,进行如下修改:

#!/bin/bash -x
1
bash 的调试模式将打印出脚本执行前由脚本执行的命令,已执行的所有 shell 扩展的结果都将显示在打印输出中,所有变量数据状态会实时打印,以供跟踪:bash -x adder.sh
1
评估退出代码
每个命令返回一个退出状态,也通常称为返回状态或退出代码
退出代码可以用于脚本的调试
以下示例说明了几个常见命令的执行和退出状态检索
[root@localhost tmp]# ls /etc/hosts
/etc/hosts
[root@localhost tmp]# echo $?
0
----------------------------------------------------------------
[root@localhosttmp]# ls /etc/nofile
ls: cannot access /etc/nofile: No such file or directory
[root@localhost tmp]# echo $?


在脚本中使用退出代码
一旦执行,脚本将在其处理所有内容之后退出,但是有时候可能需要中途退出脚本,比如在遇到错误条件时
可以通过在脚本中使用 exit 命令来实现这一目的,当脚本遇到 exit 命令时,脚本将立即退出并跳过对脚本其余内容的处理

[root@localhosttmp]# cat hello.sh 
#!/bin/bash
echo "Hello World"
exit 1
[root@localhosttmp]# ./hello.sh 
Hello World
[root@localhost tmp]# echo $?

3.2 语法风格
以下是要遵循的一些具体做法:

将长命令分解为多行更小的代码块,代码段越短,就越便于读者领悟和理解
将多个语句的开头和结尾排好,以便于查看控制结构的开始和结束位置以及它们是否正确关闭
对包含多行语句的行进行缩进,以表示代码逻辑的层次结构和控制结构的流程
使用行间距分隔命令块以阐明一个代码段何时结束以及另一个代码段何时开始
在整个脚本中通篇使用一致的格式
修改后的脚本:

#!/bin/bash
# 此脚本是读取关于kernel相关的软件包信息,并从RPM数据库中查询软件包的安装时间
PACKAGETYPE=kernel
PACKAGES=$(rpm -qa | grep $PACKAGETYPE)
# 循环处理信息
for PACKAGE in $PACKAGES; do #查询每个软件包的安装时间截INSTALLEPOCH=$(rpm -q --qf "%{INSTALLTIME}\n" $PACKAGE)# 把时间截转换为普通的日期时间INSTALLDATETIME=$(date -d @$INSTALLEPOCH)# 打印信息echo "$PACKAGE was installed on $INSTALLDATETIME"
done

3.3 最佳实践示例
检测日志告警信息并邮件通知
场景描述:
某运营商要求对当前环境日志文件“error.log”进行长期监测,如发现关键词“danger”,则发送告警邮件

要求:

日志文件可自己新建,用脚本模拟写入
发送邮件可通过 mail 指令,但受限实验环境,可通过向日志文件写入“mail”字符串来替代
运行监测脚本
日志初始内容为空,写入关键词“danger”
自动发送邮件(写入 mail 替代)

#!/bin/bash
# 日志检测脚本 test.shtail -f /var/log/error.log | while read danger;
do echo ‘mail’ >> /var/log/error.log;
sleep 1m;
done#!/bin/bash
# 模拟报错脚本 addlog.shecho ‘danger’ >> /var/log/error.log


后台运行监测脚本:

./test.sh &

模拟报错:

./addlog.sh

查看 error.log 文件,检查结果:

cat /var/log/error.log

相关文章:

linux之shell脚本实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

文件上传漏洞(ctfshow web151-161)

Web151 F12修改源代码 exts后面png改为php 这样就可以上传php的文件了 Web152&#xff1a; 考点&#xff1a;后端不能单一校验 就是要传图片格式&#xff0c;抓个包传个png的图片 然后bp抓包修改php后缀解析 然后放包 Web153-web156 在php代码中可以使用“{}”代替“[]” …...

小猪佩奇.js

闲着没事 使用js 画一个小猪佩奇把 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…...

人工智能AI合集:Ollama部署对话语言大模型-网页访问

目录 &#x1f345;点击这里查看所有博文 随着人工智能技术的飞速发展&#xff0c;AI已经不再是遥不可及的高科技概念&#xff0c;而是逐渐融入到我们的日常生活中。从智能手机的语音助手到家庭中的智能音箱&#xff0c;再到工业自动化和医疗诊断&#xff0c;AI的应用无处不在…...

CentOS搭建Apache服务器

安装对应的软件包 [roothds ~]# yum install httpd mod_ssl -y 查看防火墙的状态和selinux [roothds ~]# systemctl status firewalld [roothds ~]# cat /etc/selinux/config 若未关闭&#xff0c;则关闭防火墙和selinux [roothds ~]# systemctl stop firewalld [roothds ~]# …...

CDGA|数据治理:安全如何贯穿数据供给、流通、使用全过程

随着信息技术的飞速发展&#xff0c;数据已经成为企业运营、社会管理和经济发展的核心要素。然而&#xff0c;数据在带来巨大价值的同时&#xff0c;也伴随着诸多安全风险。因此&#xff0c;数据治理的重要性日益凸显&#xff0c;它不仅仅是对数据的简单管理&#xff0c;更是确…...

32单片机bootloader程序

一&#xff0c;单片机为什么要使用bootloader 1、使用bootloader的好处 1) 程序隔离&#xff1a;可以同时存在多个程序&#xff0c;只要flash空间够大&#xff0c;或者通过外挂flash&#xff0c;可以实现多个程序共存&#xff0c;在多个程序之间切换使用。 2&#xff09;方便程…...

MongoDB - 数组更新操作符:$、$[]、$pop、$pull、$push、$each、$sort、$slice、$position

文章目录 1. $1. 更新数组中的值2. 更新数组中的嵌入文档 2. $[]1. 更新数组中的所有元素2. 更新数组中的所有嵌入文档 3. $pop1. 删除数组的第一个元素2. 删除数组的最后一个元素 4. $pull1. 删除所有等于指定值的项2. 删除与指定条件匹配的所有项3. 从文档数组中删除项4. 从嵌…...

多GPU并行处理[任务分配、进程调度、资源管理、负载均衡]

1. 多GPU并行处理设计 设计思路: 实现基于多GPU的并行任务处理&#xff0c;每个GPU运行独立的任务&#xff0c;以加速整体的处理速度。 实现机制: 进程隔离: 利用multiprocessing.Process为每个GPU创建独立的工作进程。 GPU资源限制: 通过设置CUDA_VISIBLE_DEVICES环境变量&…...

项目部署到服务器

(相关资源都给出来了) 1 下载MobaXterm,然后打开 正常连接输入你的服务器IP&#xff0c;用户名可以起名为root 2 将JDK,Tomcat,mysql安装包 布置到服务器中&#xff08;JDK官网地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8 mysql官网地址: …...

Idea2024 创建Meaven项目没有src文件夹

1、直接创建 新建maven项目&#xff0c;发现没有src/main/java 直接新建文件夹&#xff1a;右击项目名->new->Directory 可以看到idea给出了快捷创建文件夹的选项&#xff0c;可以根据需要创建&#xff0c;这里点击src/main/java 回车&#xff0c;可以看到文件夹已经创建…...

LeetCode 2766.重新放置石块:哈希表

【LetMeFly】2766.重新放置石块&#xff1a;哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/relocate-marbles/ 给你一个下标从 0 开始的整数数组 nums &#xff0c;表示一些石块的初始位置。再给你两个长度 相等 下标从 0 开始的整数数组 moveFrom 和 moveTo…...

基于STM32的农业大棚温湿度采集控制系统的设计

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 &#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是智能教室。 设备的详细功能见网盘中的文章《8、基…...

go语言的命名规则

身为前端为什么去学go语言呢&#xff1f;我认为go在未来可能会给我带来一些收益。自认为收益是去做一件事情不可缺少的因素&#xff0c;就好像是你努力之后得到回报&#xff0c;努力的欲望会越来越强。《Head First Go》这本书里作者有一句话&#xff0c;如果你已经掌握了一门编…...

新增ClamAV病毒扫描功能、支持Java和Go运行环境,1Panel开源面板v1.10.12版本发布

2024年7月19日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布了v1.10.12版本。 在这一版本中&#xff0c;1Panel新增了多项实用功能。社区版方面&#xff0c;1Panel新增ClamAV病毒扫描功能、支持Java和Go运行环境&#xff0c;同时1Panel还新增了文件编辑器…...

Windows通过命令查看mac : getmac

要查看本机网卡mac&#xff0c;可以通过ipconfig /all 显示&#xff0c;但输出内容过多 可以通过getmac命令查看 示例 C:\Users\Desktop> getmac物理地址 传输名称暂缺 没有硬件 1C-1B-B5-04-E2-7D \Device\Tcpip_{80096E40-D51D-490C-9AF7-…...

Android笔试面试题AI答之Android系统与综合类(1)

答案仅供参考&#xff0c;来着文心一言、Kimi.ai 目录 1.简述嵌入式实时操作系统&#xff0c;Android 操作系统属于实时操作系统吗?嵌入式实时操作系统简述Android操作系统是否属于实时操作系统 2.简述Android系统的优势和不足&#xff1f;3.简述Android的系统架构 &#xff1…...

【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结

文章目录 文件存储存储到文件读取文件 SharedPreferences存储存储获取SharedPreferences对象Context 类的 getSharedPreferences() 方法Activity 类的 getPreferences() 方法PreferenceManager 类中的 getDefaultSharedPreferences() 方法 示例 读取记住密码的功能 SQLite数据库…...

抖音矩阵管理系统功能说明:一站式掌握

在当下这个信息爆炸的时代&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;其用户规模持续扩大&#xff0c;影响力日益增强。对于内容创作者和营销人员来说&#xff0c;如何高效管理抖音账号&#xff0c;实现内容的多平台分发和精准触达&#xff0c;成为了亟待解决的问题。…...

旅游卡使用指南及常见疑问解答

近期&#xff0c;许多朋友对旅游卡的免费旅游政策表示浓厚兴趣&#xff0c;但心中不免存疑&#xff1a;这真的是全程免费&#xff0c;无需自费一分吗&#xff1f; 在此&#xff0c;我们明确告知&#xff1a;免费旅游确实存在&#xff0c;但享受范围与条件需清晰界定。 本文将…...

【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…...

背单词工具(C++)

功能分析 生词本管理&#xff1a; 创建生词本文件&#xff1a;在构造函数中创建了“生词本.txt”“背词历史.log”“历史记录.txt”三个文件。添加单词&#xff1a;用户可以输入单词、词性和解释&#xff0c;将其添加到生词本中。查询所有单词&#xff1a;展示生词本中所有的单…...

面试八股 | 数据库引擎 | InnoDB和myISAM的区别?

⭐️⭐️⭐️InnoDB和MyISAM的区别? InnoDB &#xff1a; 1、使用的是行锁&#xff0c;操作时候只锁一行数据&#xff0c;不会对其他有影响&#xff0c;适合高并发工作 2、支持事务 3、不仅缓存索引还要缓存真实数据&#xff0c;适合高并发 4、默认安装 5、支持外键 6、…...

GEE计算五种植被指数(NDVI、EVI2、RVI、MTVI2、OSAVI)

目录 计算公式源代码计算公式 源代码 // 定义感兴趣区域(这里以一个简单的矩形区域为例) var region = ee.FeatureCollection("projects/a-flyllf0313/assets/dachang"); // 定义时间范围 var startDate = 2023-04-18; var endDate &...

C/S架构和B/C架构

C/S架构&#xff08;Client/Server Architecture&#xff09;和B/C架构&#xff08;Browser/Client Architecture&#xff09;是两种不同 的软件架构模型&#xff0c;它们各自有不同的特点和应用场景。 一、C/S架构&#xff08;Client/Server Architecture&#xff09; 1. 定…...

音乐曲谱软件Guitar Pro 8.2 for Mac 中文破解版

Guitar Pro 8.2 for Mac 中文破解版是一款功能强大的音乐曲谱软件&#xff0c;非常适合学习如何玩&#xff0c;改进技巧&#xff0c;重现喜爱的歌曲或陪伴自己。 Guitar Pro for Mac 是一款功能强大的音乐曲谱软件&#xff0c;非常适合学习如何玩&#xff0c;改进技巧&#xf…...

浅聊Web Storage(localStorage 和 sessionStorage)、cookie的使用场合

Web Storage&#xff08;localStorage 和 sessionStorage&#xff09;、cookie 一、Cookie二、Web StoragelocalStoragesessionStorage与 Cookies 的比较 一、Cookie Cookies 主要用于以下几种情况&#xff1a; 会话管理&#xff08;Session Management&#xff09;: 登录、购…...

C语言输入输出缓冲机制

文章目录 输入输出缓冲机制概述为什么要有缓冲区缓冲区的类型引发缓冲区的刷新 原理实现 输入输出缓冲机制 概述 缓冲区又称为缓存&#xff0c;它是内存空间的一部分。也就是说&#xff0c;在内存空间中预留了一定的存储空间&#xff0c;这些存储空间用来缓冲输入 或者输出的数…...

javaEE-03-cookie与session

文章目录 Cookie创建Cookie获取Cookie更新CookieCookie 生命控制Cookie 有效路径 Session 会话创建和获取sessionSession 域数据的存取Session 生命周期控制浏览器和 Session 之间关联 Cookie Cookie 是服务器通知客户端保存键值对的一种技术,客户端有了 Cookie 后&#xff0c…...

EtherNet/IP转Profinet协议网关(经典配置案例)

怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题&#xff0c;作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为JM-PN-EIP&#xff0c;下面是详细介绍。 一&#xff0c;设备主要功能 1、捷米特J…...

华为云依赖引入错误

问题&#xff1a;记录一次项目加在华为云依赖错误&#xff0c;如下&#xff1a; 错误信息&#xff1a;Could not find artifact com.huawei.storage:esdk-obs-java:pom:3.1.2.1 in bintray-qcloud-maven-repo (https://dl.bintray.com/qcloud/maven-repo/) 找到本地仓库&#…...

【Ubuntu】Ubuntu 配置镜像源(ARM)

【Ubuntu】Ubuntu 配置镜像源&#xff08;ARM&#xff09; 零、起因 最近在QEMU中安装了个ubuntu-24.04-live-server-arm64&#xff0c;默认是国外的软件源&#xff0c;很慢&#xff0c;故替换到国内。 壹、替换 源地址&#xff08;清华源&#xff09; https://mirror.tun…...

速腾聚创激光雷达复现FAST-LIO

目录 1.软件环境 2.测试执行 3.代码学习 3.1.找主节点代码文件 3.2.整体流程结构 3.3.具体函数理解 记录复现FAST-LIO算法的过程和&#xff0c;代码梳理和理解 1.软件环境 Windows 10(64bits) VMware 16 Pro Ubuntu 20.04 ROS Noetic FAST-LIO的简化版、注释版。感谢…...

k8s核心知识总结

写在前面 时间一下子到了7月份尾&#xff1b;整个7月份都乱糟糟的&#xff0c;不管怎么样&#xff0c;日子还是得过啊&#xff0c; 1、7月份核心了解个关于k8s&#xff0c;iceberg等相关技术&#xff0c;了解了相关的基础逻辑&#xff0c;虽然和数开主线有点偏&#xff0c;但是…...

语言模型及数据集

一、定义 1、语言模型的目标是估计序列的联合概率&#xff0c;一个理想的语言模型就能够基于模型本身生成自然文本。 2、对一个文档&#xff08;词元&#xff09;序列进行建模&#xff0c; 假设在单词级别对文本数据进行词元化。 3、计数建模 &#xff08;1&#xff09;其中…...

linux如何卸载python3.5

卸载&#xff1a; 1、卸载python3.5 sudo apt-get remove python3.5 2、卸载python3.5及其依赖 sudo apt-get remove --auto-remove python3.5 3、清除python3.5 sudo apt-get purge python3.5 或者 sudo apt-get purge --auto-remove python3.5...

【BUG】已解决:TypeError: expected string or bytes-like object

TypeError: expected string or bytes-like object 目录 TypeError: expected string or bytes-like object 【常见模块错误】 【解决方案】 常见原因及解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰…...

在linux上面用drissionpage自动化遇到反爬?

目录 一、反爬内容1、案例12、案例2 二、后来发现的问题解决 一、反爬内容 1、案例1 反爬的响应文本返回如下&#xff1a;爬虫均能精准识别,测试链接:https://ziyuan.baidu.com/crawltools/index)非正常爬虫访问时:返回的压缩报文内容无法直接识别,可一定程度上保护站点信息安…...

vue3大事件管理系统 === 首页 layout 文章分类页面 -

目录 首页 layout 架子 [element-plus 菜单] 基本架子拆解 登录访问拦截 用户基本信息获取&渲染 退出功能 [element-plus 确认框] 文章分类页面 - [element-plus 表格] 基本架子 - PageContainer 文章分类渲染 封装API - 请求获取表格数据 el-table 表格动态渲染 …...

堆的基本实现

一、堆的概念 在提出堆的概念之前&#xff0c;首先要了解二叉树的基本概念 一颗二叉树是节点的有限集合&#xff0c;该集合&#xff1a; 1、或者为空&#xff1b; 2、或者由一个根节点加上两颗分别称为左子树和右子树的两颗子树构成&#xff1b; 堆就是一颗完全二叉树&…...

Ubuntu上编译多个版本的frida

准备工作 Ubuntu20(WSL) 略 安装依赖 sudo apt update sudo apt-get install build-essential git lib32stdc-9-dev libc6-dev-i386 -y nodejs 去官网[1]下载nodejs&#xff0c;版本的话我就选的20.15.1&#xff1a; tar -xf node-v20.15.1-linux-x64.tar.xz 下载源码 …...

概率论三大分布

目录 基本概念 卡方分布&#xff08;χ分布&#xff09;&#xff1a; t分布&#xff1a; F分布&#xff1a; 延伸 卡方分布在哪些具体情况下最适合用于数据分析&#xff1f; t分布在大样本情况下的表现与正态分布相比如何&#xff1f; F分布在进行方差比较时与t分布的区…...

Spring系统学习-基于XML的声明式事务

基本概念 在Spring框架中&#xff0c;基于XML的事务管理是一种通过XML配置文件来管理事务的方式。Spring提供了强大的事务管理功能&#xff0c;可以与多种持久化技术&#xff08;如JDBC、Hibernate、JPA等&#xff09;结合使用。以下是如何在Spring中使用基于XML的事务管理的基…...

iOS中的MVVM设计模式

目录 前言 一、MVVM简介 二、MVVM的核心思想 三、MVVM的优势 四、MVVM在iOS中的实现 1. 创建Model 2. 创建ViewModel 3. 创建View 4. 主入口 总结 前言 随着iOS开发的发展&#xff0c;构建可维护和可扩展的代码架构变得至关重要。Model-View-ViewModel (MVVM) 是一种…...

ES中的数据类型学习之ARRAY

Arrays | Elasticsearch Guide [7.17] | Elastic 中文翻译 &#xff1a;Array Elasticsearch 5.4 中文文档 看云 Arrays In Elasticsearch, there is no dedicated array data type. Any field can contain zero or more values by default, however, all values in the a…...

vue网络请求

post网络请求 import axios from axios import {ElMessage, ElLoading} from "element-plus" import { nextTick } from "vue" import JSONbig from json-bigint import { userToken } from "/constants/Constant.js";const defaultConfig {bas…...

几何光学基本原理——费马原理和射线方程

在几何光学中&#xff0c;射线方程用于描述光在折射率不均匀的介质中传播的路径。折射率的变化会导致射线发生弯曲&#xff0c;射线方程正是用于计算这种弯曲路径的。 几何光学的基本原理 几何光学假设光在介质中沿直线传播&#xff0c;但在折射率变化的介质中&#xff0c;光的…...

OpenCV车牌识别技术详解

第一部分&#xff1a;图像预处理 车牌识别&#xff08;License Plate Recognition&#xff0c;LPR&#xff09;是计算机视觉领域的一个重要应用&#xff0c;它涉及到图像处理、模式识别等多个方面。OpenCV作为一个强大的计算机视觉库&#xff0c;提供了丰富的车牌识别相关功能…...

解决llama_index中使用Ollama出现timed out 问题

现象&#xff1a; File "~/anaconda3/envs/leo_py38/lib/python3.8/site-packages/httpx/_transports/default.py", line 86, in map_httpcore_exceptionsraise mapped_exc(message) from exc httpx.ReadTimeout: timed out代码&#xff1a; from llama_index.core …...

Python爬虫技术 第14节 HTML结构解析

HTML 结构解析是 Web 爬虫中的核心技能之一&#xff0c;它允许你从网页中提取所需的信息。Python 提供了几种流行的库来帮助进行 HTML 解析&#xff0c;其中最常用的是 BeautifulSoup 和 lxml。 1. 安装必要的库 首先&#xff0c;你需要安装 requests&#xff08;用于发送 HTT…...