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

Linux 之 shell 脚本

Linux 之 shell 脚本

  • 1、脚本的格式要求
  • 2、shell 脚本常用执行方式
    • 2.1、绝对路径或相对路径方式
    • 2.2、sh+脚本方式(不推荐)
  • 3、shell 的变量
    • 3.1、定义 shell 变量
    • 3.2、将命令返回值赋值给变量 (重点)
    • 3.3、设置环境变量
    • 3.4、位置参数变量
    • 3.5、预定义变量
  • 4、运算符
  • 5、条件判断
  • 6、流程控制
    • 6.1、if 判断
    • 6.2、case 语句
    • 6.3、for 循环
    • 6.4、while 循环
  • 7、read 读取控制台输入
  • 8、函数
    • 8.1、常用系统函数 basename
    • 8.2、常用系统函数 dirname
    • 8.3、自定义函数
  • 9、shell 综合案例

 
       shell 是一个命令行解释器,它为用户提供了一个向 linux 内核发送请求,以便运行程序的界面系统级程序。用户可以使用 shell 来启动、挂起、停止甚至编写一些程序。

 

1、脚本的格式要求

  • ①、脚本以 #!/bin/bash 开头。

  • ②、脚本需要有可执行权限。

 

2、shell 脚本常用执行方式

 

2.1、绝对路径或相对路径方式

 

# 输入shell 脚本的绝对路径或相对路径的方式,执行shell脚本# 首先 需要对 shell 脚本 赋执行权限
chmod 744 test_shell.sh
# 相对路径的方式执行
./test_shell.sh
# 绝对路径的方式执行
/usr/myshell/test_shell.sh

 

2.2、sh+脚本方式(不推荐)

 
使用该方式不需要 赋予shell脚本执行权限,直接执行即可。

sh ./test_shell2.sh

 

3、shell 的变量

 
shell 的变量分为:系统变量 和 用户自定义变量。

  • 系统变量: H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER 等

    # 输出系统变量
    echo "path = $PATH"
    echo "user = $USER"
    

3.1、定义 shell 变量

 

# 定义变量:  变量=值,示例:
A=100
# 撤销变量:  unset 变量, 示例:
unset A
# 声明静态变量:readonly 变量。注意:静态变量不能 unset。示例:
readonly B=101
# 把变量提升为全局环境变量,可供其他shell程序使用。

 

定义变量的规则

  • ① 变量名称可以由字母、数字和下划线组成,但不能以数字开头。
  • 等号两侧不能有空格。
  • 变量名称一般习惯为大写。

 

3.2、将命令返回值赋值给变量 (重点)

 

# 两种方式
# 方式一:反引号,运行里面的命令,并把结果返回给变量。示例:
A=`ls -la`
# 方式二:等同于反引号。示例:
A=$(ls -la)

 

3.3、设置环境变量

 
环境变量所在文件:

1.系统级:

  • ① /etc/profile:该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于登录到系统的每一个用户。该文件一般是调用/etc/bash.bashrc文件。
    /etc/bash.bashrc:系统级的bashrc文件。
  • ② /etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。

2.用户级(这些文件处于家目录下):

  • ① ~/.profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方
  • ② ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率肯定有影响。
    ~/.bash_profile or ~./bash_login:这里没有引用作者的,下面会提到
    ~/.pam_environment:用户级的环境变量设置文件,没有做测试,不知道管不管用。

 

# 基本语法
# 将 shell 变量输出为环境变量
export 变量名=变量值
# 让修改后的配置信息立即生效
source 配置文件
# 查询环境变量的值
echo $变量名# 示例:
export TOMCAT_HOME=/opt/tomcat
# 生效
source /etc/profile

 

3.4、位置参数变量

 
当我们执行一个 shell 脚本时,某些场景需要获取到执行 shell脚本的命令行参数信息,那么就可以使用位置参数变量。

基本语法:

命令功能说明
$nn 为数字,$0 代表命令本身,$1- 9 代表第一个到第九个参数,十以上的参数需要用大括号包含,例: 9 代表第一个到第九个参数,十以上的参数需要用大括号包含,例: 9代表第一个到第九个参数,十以上的参数需要用大括号包含,例:{10}
$*代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ @ 也代表命令行中所有的参数,不过 @也代表命令行中所有的参数,不过 @也代表命令行中所有的参数,不过@把每个参数区分对待
$#代表命令行中所有参数的个数

 

[root@myCentos6 zim]# vim test.sh#!/bin/bash
echo "获取并打印命令行参数"
echo "$0 $1 $2"
echo "打印全部参数: $*"
echo "打印全部参数-> $@"
echo "参数个数 = $#"[root@myCentos6 zim]# ls -l
总用量 4
-rw-r--r--. 1 root root 154 828 11:45 test.sh
[root@myCentos6 zim]# chmod 744 test.sh
[root@myCentos6 zim]# ls -l
总用量 4
-rwxr--r--. 1 root root 154 828 11:45 test.sh
[root@myCentos6 zim]# ./test.sh aa 100
获取并打印命令行参数
./test.sh aa 100
打印全部参数: aa 100
打印全部参数-> aa 100
参数个数 = 2
[root@myCentos6 zim]# 

 

3.5、预定义变量

 
       预定义变量,就是 shell 脚本设计者事先已经定义好的变量,可以直接在shell脚本中使用。预定义变量是一开始执行Script脚本时就会设定,且不能被修改,预定义变量当一执行程序时就有了。

基本用法:

  • $$ :当前进程的进程号PID。

  • $! :后台运行的最后一个进程的进程号pid。

  • $? :最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数字,由命令自己决定),则证明上一个命令执行错误。

 

4、运算符

 

# 基本语法
# 方式一:  $((运算式)) 示例:
RESULT=$((2+3)*4)
echo "result=$RESULT"
# 方式二:   $[运算式]  示例:
RESULT=$[(2+3)*4]
echo "result=$RESULT"
# 求两个参数的和
SUM=$[$PARAM1+$PARAM2]
# 方式三:   expr m+n  注意:expr 运算符间要有空格
# expr \*,/,%  分别代表 乘,除,取余
TEMP=`expr 2 + 3`
RESULT=`expr $TEMP \* 4`
echo "result=RESULT"

 

5、条件判断

 

# 判断语句,基本语法. 注意:condition 前后要有空格
# 非空返回 true,可使用 $? 验证(0 为 true, >1 为 false)
[ condition ]
# 应用实例: [ test_condition ]  返回true
[ test_condition ] 
# [] 返回false
[]
# 条件满足,执行后面的语句
[ condition ] && echo "ok" || echo "not ok"# 案例:"ok 是否等于 ok"
if [ "ok100" = "ok" ]
then echo "equal"
fi# 案例:/root/install.log 目录中的文件是否存在
if [ -e /root/install.log ]
then echo "文件存在"
fi    

 
常用判断条件

  • 两个整数的比较
    • = 字符串比较
    • -lt 小于
    • -le 小于等于
    • -eq 等于
    • -gt 大于
    • -ge 大于等于
    • -ne 不等于
  • 按照文件权限进行判断
    • -r 有读的权限 [ -r 文件 ] (注意前后有空格)
    • -w 有写权限
    • -x 有执行权限
  • 按照文件类型进行判断
    • -f 文件存在并且是一个常规的文件
    • -e 文件存在
    • -d 文件存在并是一个目录

 

6、流程控制

 

6.1、if 判断

 

# 基本语法
if [ 条件判断式 ];then程序
fi
# 或者 基本语法  (推荐使用)
if [ 条件判断式 ]then程序elif [ 条件判断式 ]then 程序fi  

注意事项:[ 条件判断式 ] ,中括号和条件判断式之间必须有空格。

 

6.2、case 语句

 

# 基本语法
case $变量名 in
"值1")如果变量的值等于值1,则执行程序1;;
"值2")  如果变量的值等于值2,则执行程序2;;… 省略其他分支 …
*)如果变量的值都不是以上的值,则执行此程序;;
esac# 应用示例:命令行参数是 1时,输出"周一",是2时输出"周二",其他情况输出"other"
#!/bin/bash
case $1 in 
"1")echo "周一";;
"2")echo "周二";;
*)echo "other";;
esac  

 

6.3、for 循环

 

# 基本语法1
for 变量 in 值1 值2 值3…do 程序done# 示例: 打印命令行输入的参数
#!/bin/bash
for i in "$*"
doecho "the param is $i"
done
# 或
for j in "$@"doecho "the num is $j"
done     # 基本语法2
for ((初始值;循环控制条件;变量变化))do 程序
done# 示例:从1加到100 的值,输出显示
#!/bin/bash
SUM=0
for((i=1.i<=100;i++))
do SUM=$[$SUM+$i]
done
echo "sum=$SUM"

 

6.4、while 循环

 

# 基本语法1
while[ 条件判断式 ]
do 程序
done
# 应用示例:从命令行输入一个数n,统计从1+…+ n 的值是多少
#!/bin/bash
SUM=0
i=0
while[ $i -le $1 ]
doSUM=$[$SUM+$i]i=$[$i+1]
done
echo "sum= $SUM"

 

7、read 读取控制台输入

 

# 基本语法
read [选项] [参数]
# 常用选项-p : 指定读取值时的提示符-t : 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不等待
# 常用参数变量:指定读取值的变量名# 应用实例1: 读取控制台输入的 num 值 并打印
#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "您输入的值时num1=$NUM1"# 应用实例2: 读取控制台输入的 num 值,在10秒内输入,并打印
#!/bin/bash
read -t 10 -p "请输入一个数num2=" NUM2
echo "您输入的值时num2=$NUM2"

 

8、函数

 
shell 编程和其他编程语言一样,有系统函数,也可以自定义函数。

8.1、常用系统函数 basename

 

# basename 函数功能:返回完整路径最后 / 的部分,常用于获取文件名
# suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
basename [pathname] [suffix]
# 应用示例: 返回/home/aaa/test.txt 的 "test"部分
basename /home/aaa/test.txt  .txt
# 应用示例: 返回/home/aaa/test.txt 的 "test.txt"部分
basename /home/aaa/test.txt

 

8.2、常用系统函数 dirname

 

# dirname 函数功能:返回完整路径最后 / 的前面部分,常用于返回路劲部分
# 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回目录部分。
dirname 文件绝对路径# 应用实例: 返回 /home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt

 

8.3、自定义函数

 

# 基本语法
[ function ] funname[()]
{Action;[return int;]
}
# 调用直接写函数名: funname [值]# 应用实例:计算输入两个参数的和 (read),getSum
#!/bin/bash
function getSum() {SUM=$[$n1+$n2]echo "sum=$SUM"
}read -p "请输入第一个数n1" n1
read -p "请输入第二个数n2" n2getSum $n1 $n2

 

9、shell 综合案例

 
需求:

  • ① 每天凌晨 2:10 备份数据库 myDb 到 /data/backup/db

  • ② 备份开始和备份结束,能够给出相应的提示信息

  • ③ 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2023-08-28_230201.tar.gz

  • ④ 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。

在 /usr/sbin 目录下创建 mysql_db_backup.sh 脚本

vim /usr/sbin/mysql_db_backup.sh

编写 mysql_db_backup.sh 脚本

#!/bin/bash
# 备份的路径
BACKUP=/data/backup/db
# 当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo "==开始备份数据库myDb=="
echo "==备份的路径是 $BACKUP/$DATETIME.tar.gz=="
# 主机
HOST=localhost
# 用户名
DB_USER=root
# 密码
DB_PWD=root
# 备份数据库名称
DATABASE=myDB
# 创建备份的路径
# 如果备份的路径文件夹存在就直接使用,否则就创建
[ ! -d "$BACKUP/$DATETIME" ] &&  mkdir -p "$BACKUP/$DATETIME"
# 执行 mysql 的备份数据库的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST  $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
# 打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
# 删除临时目录
rm -rf $BACKUP/$DATETIME
# 删除10天前的备份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "==备份文件成功=="

crontab 设置定时任务

10 2 * * * /usr/sbin/mysql_db_backup.sh

 
 
 
 
 
 
 
.

相关文章:

Linux 之 shell 脚本

Linux 之 shell 脚本 1、脚本的格式要求2、shell 脚本常用执行方式2.1、绝对路径或相对路径方式2.2、sh脚本方式&#xff08;不推荐&#xff09; 3、shell 的变量3.1、定义 shell 变量3.2、将命令返回值赋值给变量 &#xff08;重点&#xff09;3.3、设置环境变量3.4、位置参数…...

如何去阅读开源的第三方库的源码

2023年9月2日&#xff0c;周六晚上 今天探索了一天如何去阅读第三方库的源码&#xff0c;终有所获。 再结合以前看cereal项目的源码的经验&#xff0c;于是就有了这篇博客。 我个人认为&#xff1a; 在阅读一个开源的第三方库之前&#xff0c;要先学会这个第三方库的一些简单…...

浅析Linux虚拟网络技术

文章目录 概述Tap/tun设备tun/tap的工作机制 Bridge网桥Bridge的工作机制Bridge IP 相关参考 概述 在传统的网络环境中&#xff0c;一台物理主机包含一张或多张网卡&#xff0c;要实现与其它物理主机之间的通信&#xff0c;需要将自身的网卡通过路由器或者交换机连接到外部的物…...

设计模式之九:迭代器与组合模式

有许多方法可以把对象堆起来成为一个集合&#xff08;Collection&#xff09;&#xff0c;比如放入数组、堆栈或散列表中。若用户直接从这些数据结构中取出对象&#xff0c;则需要知道具体是存在什么数据结构中&#xff08;如栈就用peek&#xff0c;数组[]&#xff09;。迭代器…...

官方推荐:6种Pandas读取Excel的方法

Pandas提供了多种读取Excel文件的方法&#xff0c;以下是官方推荐的6种方法&#xff1a; 1. 使用pd.read_excel()函数 这是最常用的方法&#xff0c;可以读取Excel文件&#xff0c;并将其转换为Pandas数据框。可以指定工作表名和列名的行号。 df pd.read_excel(data.xlsx, …...

Redis与Mysql区别

一、关系型数据库 mysql&#xff0c;pgsql,oracle ,sqlserver 支持连表关联查询&#xff08;会有一些特定的语法特特性&#xff09; 二、非关系型数据库 redis,mongodb,memcache &#xff08;key-value&#xff09; 三、关系型数据库与非关系型数据库的区别&#xff1a; 1&am…...

Black-Box Tuning for Language-Model-as-a-Service

本文是LLM系列的文章&#xff0c;针对《Black-Box Tuning for Language-Model-as-a-Service》的翻译。 语义模型即服务的黑盒调整 摘要1 引言2 背景3 方法4 实验5 讨论与未来工作 摘要 GPT-3等超大的预训练语言模型&#xff08;PTM&#xff09;通常作为服务发布。它允许用户设…...

通用的ARM64架构镜像

#此链接包含x86架构和ARM架构的pytorch镜像&#xff0c;镜像里面已下载好各种第三方库&#xff0c;GPU版本的pytorch可用。缺点&#xff1a;镜像有点大 测试环境&#xff1a;操作系统麒麟银河V10&#xff0c;ARM64处理器&#xff08;cpu&#xff09;&#xff0c;显卡为T4显卡 …...

git大文件推送报错

报错信息 不多掰扯&#xff0c;直接上报错信息和截图 Delta compression using up to 8 threadsRPC failde; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large从以上的报错信息不难看出推送仓库的时候&#xff0c;请求体过大&#xff0c;为…...

RDMA性能优化经验浅谈

一、RDMA概述 首先我们介绍一下RDMA的一些核心概念&#xff0c;当然了&#xff0c;我并不打算写他的API以及调用方式&#xff0c;我们更多关注这些基础概念背后的硬件执行方式和原理&#xff0c;对于这些原理的理解是能够写出高性能RDMA程序的关键。 Memory Region RDMA的网…...

day 44 | ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 此外&#xff0c;在返回的时候&#xff0c;由于状态234都是卖出的状态&#xff0c;所以要比较其最大值进行返回。 func maxProfit(prices []int) int {dp : make([][]int, len(prices))dp[0] make([]int, 4)dp[0][0] -prices[0]for i : 1; i &…...

电子科大软件系统架构设计——系统分析与设计概述(含课堂作业、练习答案)

系统分析与设计概述 信息系统概述 what 信息系统是一种能够完成对业务数据进行采集、转换、加工、计算、分析、传输、维护等信息处理&#xff0c;并能就某个方面问题给用户提供信息服务的计算机应用系统。 组成 信息化基础设施&#xff08;计算机、计算机网络、服务器、系统…...

【SpringMVC】@RequestMapping注解(详解)

文章目录 前言1、RequestMapping注解的功能2、RequestMapping注解的位置3、RequestMapping注解的value属性4、RequestMapping注解的method属性1、对于处理指定请求方式的控制器方法&#xff0c;SpringMVC中提供了RequestMapping的派生注解2、常用的请求方式有get&#xff0c;po…...

8.(Python数模)马尔科夫链预测

Python实现马尔科夫链预测 马尔科夫链原理 马尔科夫链是一种进行预测的方法&#xff0c;常用于系统未来时刻情况只和现在有关&#xff0c;而与过去无关。 用下面这个例子来讲述马尔科夫链。 如何预测下一时刻计算机发生故障的概率&#xff1f; 当前状态只存在0&#xff08;故…...

什么是浏览器缓存(browser caching)?如何使用HTTP头来控制缓存?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浏览器缓存和HTTP头控制缓存⭐ HTTP头控制缓存1. Cache-Control2. Expires3. Last-Modified 和 If-Modified-Since4. ETag 和 If-None-Match ⭐ 缓存策略⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击…...

谁需要了解学习RPA?什么地方可以使用RPA?

RPA&#xff08;Robotic Process Automation&#xff09;是一种通过软件机器人自动化执行特定任务和流程的技术。以下是一些需要了解RPA的人群&#xff1a; 企业决策者&#xff1a;企业决策者需要了解RPA的潜在收益和风险&#xff0c;以及如何将其纳入企业的数字化转型战略中。…...

Qt各个版本下载及安装教程(离线和非离线安装)

Qt各个版本下载链接&#xff1a; Index of /archive/qthttps://download.qt.io/archive/qt/ 离线安装 &#xff0c;离线安装很无脑&#xff0c;下一步下一步就可以。 我离线下载 半个小时把2G的exe下载下来了...

使用爬虫代码获得深度学习目标检测或者语义分割中的图片。

问题描述&#xff1a;目标检测或者图像分割需要大量的数据&#xff0c;如果手动从网上找的话会比较慢&#xff0c;这时候&#xff0c;我们可以从网上爬虫下来&#xff0c;然后自己筛选即可。 代码如下&#xff08;不要忘记安装代码依赖的库&#xff09;&#xff1a; # -*- co…...

代码随想录算法训练营第39天 | ● 62.不同路径 ● 63. 不同路径II

文章目录 前言一、62.不同路径二、63.不同路径II总结 前言 动态规划 一、62.不同路径 深搜动态规划数论 深搜&#xff1a; 注意题目中说机器人每次只能向下或者向右移动一步&#xff0c;那么其实机器人走过的路径可以抽象为一棵二叉树&#xff0c;而叶子节点就是终点&#…...

《网站建设:从规划到发布的全过程详解》

一、引言 在数字时代&#xff0c;网站已经成为企业和个人在互联网上的重要存在。一个优质网站的建立需要周全的规划、设计、开发、测试和发布。本文将详细介绍网站建设的全过程&#xff0c;帮助读者了解和掌握网站建设的流程和方法。 二、网站建设的意义 网站建设具有以下意…...

1分钟实现 CLIP + Annoy + Gradio 文搜图+图搜图 系统

多模态图文搜索系统 CLIP 进行 Text 和 Image 的语义EmbeddingAnnoy 向量数据库实现树状结构索引来加速最近邻搜索Gradio 轻量级的机器学习 Web 前端搭建 文搜图 图搜图 CLIP图像语义提取功能&#xff01;...

用树形dp+状压维护树上操作的计数问题:0902T3

发现操作数 k ≤ 6 k\le6 k≤6&#xff0c;可以考虑对操作进行状压。 然后找找性质&#xff0c;发现要么删掉一棵子树&#xff0c;要么进去该子树。可以视为每种操作有两种情况。 然后分讨一下当前该如何转移。 树形dp的顺序&#xff1a; 合并子树考虑当前往上的边的方向 …...

【python爬虫】批量识别pdf中的英文,自动翻译成中文上

不管是上学还是上班,有时不可避免需要看英文文章,特别是在写毕业论文的时候。比较头疼的是把专业性很强的英文pdf文章翻译成中文。我记得我上学的时候,是一段一段复制,或者碰到不认识的单词就百度翻译一下,非常耗费时间。本文提供批量识别pdf中英文的方法,后续文章实现自…...

Android笔记--Hilt

Hilt 是 Android 的依赖项注入库&#xff0c;可减少在项目中执行手动依赖项注入的样板代码。执行手动依赖项注入要求您手动构造每个类及其依赖项&#xff0c;并借助容器重复使用和管理依赖项。依赖注入的英文是Dependency Injection&#xff0c;简称DI,简单说一个类中使用的依赖…...

Oracle常用权限处理

对于Oracle来说&#xff0c;用户等于Schema&#xff0c;创建用户即创建Schema -- 创建用户 create user TCK_TEXT identified by "TCKTCK"; --赋予登陆权限 grant connect to TCK_TEXT; --查看权限列表 select * from user_role_privs ; select * from user_sys_priv…...

Stable Diffuse 之 本地环境部署 WebUI 进行汉化操作

Stable Diffuse 之 本地环境部署 WebUI 进行汉化操作 目录 Stable Diffuse 之 本地环境部署 WebUI 进行汉化操作 一、简单介绍 二、汉化操作 附录&#xff1a; 一、Install from URL 中出现 Failed to connect to 127.0.0.1 port 7890: Connection refused 错误&#xf…...

r 安装源码包 安装本地r包

总结一下手动安装R包 - 简书 (jianshu.com)https://www.jianshu.com/p/2a7a36414734 #BiocManager::install("simplifyEnrichment") #BiocManager::install("EnsDb.Hsapiens.v86")#下载包 之后 手动安装 #install.packages("~/datasets/EnsDb.Hsapien…...

webservice调用对接第三方系统

#webservice调用对接第三方系统# 最近接到一个任务&#xff0c;需要对接第三方数据&#xff0c;第三方提供对接方式的是通过webservice调用&#xff0c;webservice调用有好几种方式&#xff0c;具体可以自行了解&#xff0c;我选择的是通过wsdl文件自动生成客户端代码对接。 …...

实现不同局域网文件共享的解决方案:使用Python自带HTTP服务和端口映射

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用…...

[Android 四大组件] --- Activity

1 Activity是什么 ​​Activity​​是一个Android的应用组件&#xff0c;它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口&#xff0c;窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。 一个应用通常是由多个彼此松散联系的Activity组成&…...