LinuxC/Shell/make相关概念以及命令

Linux相关概念

什么是shell
用户与内核沟通的桥梁

1、shell命令、shell、shell脚本的区别
shell命令:用户系统内核发出的控制请求
shell(也称为终端):是一个命令行解释器,可以实现用户和内核之间的交互
shell脚本:一堆命令的集合

1、1shell命令的格式****
命令名称 [选项] [参数]
注意:[ ]表示可以省略
比如:ls—>命令名称
ls -l:名称名称 选项
ls -l / :命令名称 选项 参数
注意:
(1)一条命令的三要素之间要用空格隔开
(2)若将多个命令在一行书写,用分号将各个命令隔开
在这里插入图片描述
(3)如果一条命令不能再一行写完,在行尾使用反斜杠(\)标明该条命令味结束
在这里插入图片描述

1、2## 用户系统相关命令
用户切换命令(su)
su - 用户名
注意:尽量不要使用root用户,如果使用在命令的最前面加sudo(sudo:临时管理权限)

2、## 系统管理命令

2、1 ps
ps:显示当前系统中运行的进程列表
ps -ef:查看所有进程及其PID(进程号)
ps -aux:除了可以显示ps -ef所有内外外,还可以显示CPU以及内存占有率
2、2 kill
kill:输出特定的信号给指定PID(进程号)的进程
-l : 列出所有可用的信号名称
在这里插入图片描述
kill -9 进程号(杀死相应进程)

2、3 fdisk
fdisk —>可以查看硬盘分区情况
fdisk -l:列出文件系统的分区情况
**注意:**fdisk 必须使用root权限(eg:sudo fdisk -l)
free:查看当前系统的内存使用情况
df:查看文件系统的磁盘占用情况
du:统计目录(或文件)所占磁盘的空间大小(统计当前目录下)

3、## 文件目录相关命令

cd、ls、mkdir、rm 、cp、mv…………

3、1## chmod

chmod作用:改变文件的访问权限
ls -l
drwxrwxr-x 8 farsight(用户) farsight(数组用户) 4096 3月 7 19:12 22021
第一个字母表示的是文件的属性
在LinuxOS下有7种文件类型
(1)-:普通文件
(2)d:目录文件
(3)c:字符设备文件
(4)b:块设备文件
(5)p:管道文件
(6)l:链接文件 ---->相当与Windows的快捷方式
(7)s:socket文件(套接字文件)
在这里插入图片描述

rwx rwx r-x
文件拥有者 属组用户 其他

第一种方式
文件拥有者:u
数组用户: g
其他人:o
所有者:a
+:代表增加权限
-:删除权限
=:设置权限
在这里插入图片描述
第二种方式:
-:表示没有权限–>用0表示,1表示有权限

在这里插入图片描述

4、2## chown

chown:修改文件所有者和组别

修改问件所有者
在这里插入图片描述
修改文件组别
在这里插入图片描述
同时修改文件所有者和组别

在这里插入图片描述

4、3## chgrp
chgrp:修改文件组的所有权
在这里插入图片描述
**注意:**chown 和 chgrp 必须使用root权限(前面加个sudo)

4、4grep
grep作用:在指定文件中搜索特定的内容

grep 字符串 文件在这里插入图片描述
-n:显示行号
在这里插入图片描述

4、5## alias
alias作用:给变量起别名
双引号和单引号都可以
在这里插入图片描述
**注意:**起的别名是一次性的,关闭终端或者在其他终端无效
想要永久失效加入到家目录的.bashrc中—加到配置文件里(vim.bashrc)
注意:alias 后面有空格,其余不能有空格

4、6反引号****
`:加上反引号后以命令输出
在这里插入图片描述

关机:sudo shutdown -h 时间(10 ----->表示10分钟后关机) (now---->表示立刻关机
重启:sudo reboot

特殊字符

1、1管道
管道—>(|)单独使用没有意义
将前一个命令的输出作为后一个命令的输入
![在这里插入图片描述](https://img-blog.csdnimg.cn/4cdf63f655454183926c3c14632b2bba.png
在这里插入图片描述
如上所示,在day1目录文件中查找是否有test.c文件,它将ls的结果作为grep的输入
1、2文档的查看方式
cat 文件名:适合查看比较短的文档
在这里插入图片描述
more 文件名:适合看比较长的文档(按空格向下翻一页,按回车向下翻一行,按q退出)
less 文件名:加强版的more。支持上下箭头
1、3文件的统计
wc: 作为文件的统计 ,可以统计有多少个字节,也可以统计多少行
wc -c:统计有多少个字节
wc -l:统计有多少行
在这里插入图片描述
1、4重定向

:输出重定向 如果文件不存在则新建、如果文件存在覆盖文件中的内容

:追加重定向 如果文件不存在则新建 如果文件存在则追加到问价末尾

在这里插入图片描述
2> 或 &> :将错误信息输入到文件中,如果文件不存在则新建, 如果文件存在则覆盖文件中的内容
在这里插入图片描述
<:输入重定向(该命令不常用)
在这里插入图片描述
将test.c作为wc的输入文件,统计test.c的行数,再将结果输出到1.txt中

1、5通配符
:匹配任意长度的字符串 所有带.c文件移到day1里面—>.c表示 所有.c文件
在这里插入图片描述
?:匹配任意一个长度的字符
![在这里插入图片描述](https://img-blog.csdnimg.cn/05c484d48b5447b083d75157985cf39f.png在这里插入图片描述
[…]:[内容] 匹配指定内容中的任意一个字符
在这里插入图片描述
[ - ]:匹配指定字符范围的单个字符。
在这里插入图片描述
[^…]:除了其中指定的字符外的任意一个字符(也可以理解---->匹配指定外的所有单个字符(指定内容可以是范围))
在这里插入图片描述

注意:以上通配符命令只能表示一个字符,两个或多个字符除外

2、In
作用:用于在文件之间建立链接
LinuX 中有两种类型的链接:(1)硬链接 (2)软连接

硬链接:利用LinuX 中为每个文件分配的物理编号——inode建立链接
在这里插入图片描述
软连接:利用文件的路径名建立链接(相当于windows下的快捷方式)—>用的最多
在这里插入图片描述
软硬链接的共同点:
软硬链接的操作都会影响源文件的改变。

软硬链接的区别:
1.软链接:会在用户选定的路径下生成一个文件镜像,不会重复占用磁盘空间。(使用最广泛)
2.硬链接:会在用户指定的路径下生成一个和源文件大小相同的文件。
3.若删除源文件,软链接失效而硬链接不会失效。

3、压缩打包相关命令
3、1gzip bzip2
压缩工具:gzip,bzip2(只能压缩单个文件,不能压缩目录)

压缩文件
gzip hello.c---->hello.c.gz
在这里插入图片描述
bzip2 hello.c---->hello.c.bz2
在这里插入图片描述
解压文件:-d(将压缩文件解压)
gzip -d hello.c.gz
在这里插入图片描述
gunzip hello.c.gz
在这里插入图片描述
bzip2 -d hello.c.bz2
bunzip2 hello.c.bz2

3、2 tar
tar(对文件或目录打包解包后缀为.tar)
注意:压缩时用的gzip解压时就用gzip,压缩用bzip2解压也得用bzip2

-c:打包。
-x:解包。
-v:处理过程中输出相关信息。显示过程。
-f:指定包文件名。(必须放在最后)
-z:调用gzip/gunzip压缩打包解压文件。
-j:调用bzip2/bunzip2压缩打包解压文件。

文件压缩的时候:先打包再压缩
打包如下图:
在这里插入图片描述
解压如下图:
在这里插入图片描述
解压的时候(先解压,在解包)

解压如下图:
在这里插入图片描述
解包如下图:

在这里插入图片描述
将打包压缩一体话(加-z参数):

在这里插入图片描述
解压+解包
在这里插入图片描述
bzip2
打包+压缩
在这里插入图片描述
解压+解包
在这里插入图片描述

常见压缩文件的压缩解压操作
在这里插入图片描述
4、Linux环境变量

env :查看系统中所有的环境变量
环境变量格式:变量名=内容1:内容2(中间用 :隔开,“=”左右两边不能有空格)

4.1 临时添加

临时添加只对当前的终端有效,如果当前终端关闭,添加的环境变量就不存在了
export PATH=$PATH:绝对路径
在这里插入图片描述
**注意:**等号的左右两边不能有空格

4.2 永久添加
1、进入/etc/profile
sudo vim /etc/profile
2、在文件末尾添加
export PATH=$PATH:绝对路径
3、重启(sudo reboot),关机(sudo shutdown -h now) source /etc/profile

5、共享文件夹

5.1 Ubuntu
虚拟机—>设置—>选项—>共享文件夹—>总是启用
共享文件夹在/mnt/hgfs/之下

5.2 Debian
以上方法使用与所有的LinuxOS

在这里插入图片描述

6、Linux用户管理命令

6、1相关配置文件

(1)/etc/passwd :系统能够识别的用户清单。
(2)/etc/shadow :加密的用户清单。
(3)/etc/group :组的列表。

6、2创建用户
eg:sudo adduser 用户(zhangsan)
在这里插入图片描述
6、3修改用户密码
eg:sudo passwd 用户名(zhangsan)
在这里插入图片描述
6、4删除用户
eg:sudo deluser --remove-home 用户名
在这里插入图片描述
6、5新建组
eg:sudo groupadd 组名
在这里插入图片描述
6、6修改用户所在组
eg:sudo usermod -g 组名 要修改的用户
在这里插入图片描述

6、7删除组
sudo groupdel 组名
在这里插入图片描述

7、Linux软件管理

dpkg -L : 列出安装的软件包清单
7、1测试网络
ping www.baidu.com
在这里插入图片描述
7、2Linux网络配置

7、2、1Ubuntu
(1)虚拟机—>设置—>网络适配器—>桥接模式
(2)编辑—>虚拟网络编辑器
在这里插入图片描述
在这里插入图片描述
(3)
在这里插入图片描述
(4)
在这里插入图片描述

7.2.2 debian
(1)虚拟机—>设置—>网络适配器—>桥接模式
(2)输入命令:nmtui
在这里插入图片描述
7.2.3 windows ip配置

在这里插入图片描述
7.3 软件源配置文件

vim /etc/apt/sources.list

7.4 下载软件

sudo apt-get update(更新)
sudo apt-get install 包名(版本高可以省略get)

有趣命令
sudo apt -get install XXX(XXX填下列命令即可完成安装)

(1)oneko:追鼠标的猫。
(2)xeyes:眼睛。
(3)sl:火车。
……

7.5 卸载软件
sudo apt-get remove 包名

8、Linux网络基础知识
IP地址:主机的唯一表示
IP地址:由网络地址和主机地址组成
IP地址的分类:A、B、C、D、E

8.1 A类IP地址
1个字节网络地址+3个字节的主机地址组成
网络地址的最高位为0,地址范围:1.0.0.0 ~ 126.255.255.255

8.2 B类IP地址
2个字节的网络地址+2个字节的主机地址
网络地址的最高位为10,地址范围:128.0.0.0 ~ 191.255.255.255

8.3 C类IP地址
3个字节的网络地址+1个字节的主机地址
网络地址的最高位为110,地址范围:192.0.0.0 ~ 223.255.255.255
在这里插入图片描述
在这里插入图片描述

8.4 D类
8.5 E类

8.6 子网掩码
网络地址全是1,主机地址全是0
C类:3个字节的网络地址+1个字节的主机地址(每一个字节8个bit位)
11111111 11111111 11111111 00000000
255 255 255 0
子网掩码的作用:判断主机发送的数据包是向外网发送还是向内网发送

 192.168.0.23    192.168.0.34    192.  168.2.24(与操作子网掩码----->有0则为0)

& 255.255.255.0 255.255.255.0 255.255.255.0
192.168.0.0 192.168.0.0 192.168.2.0

8.7DNS服务器
DNS服务器由解析器和服务器组成
www.baidu.com(域名) –>解析为14.215.177.39
在这里插入图片描述

注意:主机在和百度服务器进行连接之前,必须通过域名服务器的解析,得到百度服务器的实际IP地址

1、shell脚本

c语言是编译性语言、强类型语言(对数据类型分的很清楚)
eg:1.c gcc 1.c (编译) ./a.out(运行)

shell解释性语言(不需要编译直接能运行)、弱类型语言
eg:1.sh ./1.sh(后缀为.sh)

shell脚本:一堆命令的集合
1、1创建一个shell脚本
(1)touch1.sh
(2)编辑1.sh

在这里插入图片描述
(3) 运行的时候没有执行的权限,需要我们人为的添加chmod 777 1.sh
(4) 运行./1.sh

2、shell变量

2.1用户自定义变量
shell 允许用户建立 变量存储类型,但它不支持数据类型
**注意:**任何赋值变量的值都被shell解释为一串字符

变量名的命令规范
(1)由数字,字母,下划线组成。且首字母不能为数字
(2)不能使用标点符号
(3)取名见名知意。shell中的变量一般用大写表示
在这里插入图片描述
注意:
(1)shell 中的字符串用双引号或者单引号引起都可以
(2)变量再赋值的时候 = 左右两边不能有空格
(3)shell中要访问变量的值 ,必须是$加变量名
在这里插入图片描述
2、2位置参数
![在这里插入图片描述](https://img-blog.csdnimg.cn/c88327a05f29454585b3b919bff94d9e.png
2、3预定义变量
在这里插入图片描述

$#:包含命令行参数的个数
$@:包含所有命令行参数
$*:包含所有命令行参数
$$:包含正在执行进程的ID号
$?:包含前一个命令的退出的状态,正常退出返回位0,反之为非0 (在shell中0为真,反之为假)

在这里插入图片描述

2、4环境变量
env:显示所有环境和变量

3、shell程序和语句

3、1说明性语句
说明性语句 #号表示注释

3、2功能性语句

3、2、1 输出语句
echo“hello world”------>默认换行
echo -n"hello world"------>加-n表示不换行

3、2、2输入语句
read 输入语句
在这里插入图片描述
在这里插入图片描述
**注意:**双引号之后需要加空格

没有加空格效果都下图:
在这里插入图片描述

在这里插入图片描述
2.3.3 算术运算
+、-、*、/、%

在这里插入图片描述
注意:
(1)expr (只能用于整数的运算)
(2)expr 和变量以及变量运算符之间都得加空格

可不可以将expr求得的结果赋值一个变量----->可以
在这里插入图片描述
注意:
要将expr求得的结果赋值给一个变量,必须加反引号
在这里插入图片描述
*在被当作通配符来处理,如果想要表示乘法的话,必须加上\

2.3.4 test命令(主要是用来测试文件属性的)
test可以测试---->字符串 整数 文件属性

(1)字符串测试
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1字符串的长度是否为0
-n s1 测试s1字符串的长度是否不为0(非0)
在这里插入图片描述
在这里插入图片描述
注意:“[“ 的右边 ”]“ 的左边以及符号的左右两边需要加空格

(2)测试整数
a -eq b 测试a和b是否相等(a=b)
a -ne b 测试a和b是否不相等(a!=b)
a -gt b 测试a是否大于b(a>b)
a -ge b 测试a是否大于等于b(a>=b)
a -lt b 测试a是否小于b(a<b)
a -le b 测试a是否小于等于b(a<=b)
在这里插入图片描述
(3)测试文件
-d name 测试name是否为一个目录。
-f name 测试name是否为普通文件。
-L name 测试name是否为符号链接。
-r name 测试name是否为存在且可读。
-w name 测试name是否存在且为可写。
-x name 测试name是否为存在且为执行。
-s name 测试name是否为存在且其长度不为0。
f1 -nt f2 测试文件f1是否比f2更新。
f1 -ot f2 测试文件f1是否比f2更旧。
在这里插入图片描述

4、选择语句

4.1 单分支选择语句

if[表达式]
then
语句;
fi
在这里插入图片描述
在这里插入图片描述
4.2 双分支if语句
if [表达式1]
then
语句1;
else
语句2
fi
在这里插入图片描述
4.3 多分支if语句
if [表达式1]
then
语句1
elif [表达式2]
then
语句2
elif [表达式3]
then
语句3
………
elif [表达式n]
then
语句 n
else
语句 n+1
fi
在这里插入图片描述
case 字符串变量 in
模式1)
命令表1
;;
模式2)
命令表2
;;
………………
模式n)
命令表n
;;
*)
命令n+1
;;
esac
在这里插入图片描述

1、循环语句

1、1for语句
for 变量名 in 单词表
do
语句
done
第一种情况
在这里插入图片描述
第二种情况
在这里插入图片描述
第三种情况
在这里插入图片描述
第四种情况(基本上用不上)
在这里插入图片描述

1、2while语句

while[命令或表达式]
do
语句
done
在这里插入图片描述
求1~100的和
在这里插入图片描述

2、shell函数

2、1函数定义
(1)方式1
函数名()
{

}
(2)方式2
function函数名()
{

}
**注意:**一般使用的是方式2

2、2函数调用

(1)方式1
变量=函数名 参数列表(函数名和参数列表是用反引号引起来的)
(2)方式2
函数名 参数列表
注意:一般使用的方式2
在这里插入图片描述

由上图得知:
(1) 函数中的 n 并 非 脚 本 中 的 n并非脚本中的 nn
(2) 函数的所有标准输出传递给了主程序的变量

3、结构体

3、1概念
结构体是一种自定义的数据类型,是一类相关事物属性的集合

3、2定义
struct 结构体名
{
属性1;
属性2;
};
比如:描述一个人的姓名,身高
struct person
{
char anme[20];
int height;
};
定义了一个结构体,结构体的数据类型类型 struct person

3、3初始化
数据类型 变量名
int a = 0;
struct 结构体名 变量名 = {………………};
struct person per = {“zhangsan”,18};

3、4 访问
3、4、1通过结构体变量名访问成员
变量名.成员名
在这里插入图片描述
3.、4、2通过结构体指针访问成员变量
指针变量名–>成员
//指针变量
数据类性 *指针变量名
int a;
int *p = &a;
struct person *p = NULL;
在这里插入图片描述
3、5字节对齐
一次性分配多少个字节
自然对齐(32OS)
char:1字节对齐方式
short:2字节对齐方式
int:4字节对齐方式
float:4字节对齐方式
double:占8个字节,4字节对齐方式,需要分配两次
在这里插入图片描述
**注意:**结构体字节对齐:选成员成最大的那个对齐

3.6 结构体节省空间的方法
(1)将数据类型最大的放在最前面
(2)位域/位段
未优化之前:
在这里插入图片描述
优化之后:
在这里插入图片描述
**注意:**位域不能用scanf输入案例如下图:
在这里插入图片描述

1、给结构体起别名

单算移关与,异或逻条赋
单目运算符,算术运算符,左移右移,关系运算符,按位&、异或、或|,逻辑运算符,条件运算符,赋值

方式1:
在这里插入图片描述
方式2:
在这里插入图片描述
2、malloc 函数

在这里插入图片描述
2、1 malloc头文件
#include <stdlib.h>

2、2 malloc函数
void *malloc(size_t size);
函数功能:申请空间
参数:要申请的空间的大小
返回值:成功返回该空间的首地址,失败返回NULL
void free(void *ptr);
函数功能:释放空间
参数:要释放的空间的首地址
**注意:**malloc申请到的是一片连续的内存空间

3、自定义头文件
.h文件
1、头文件
2、宏定义
3、结构体类型的定义
4、枚举类型定义
5、函数声明
在这里插入图片描述
“”:编译器从用户的工作路径开始搜索头文件
<>:编译器从标准库路径搜索头文件

3.1 文件编译
作用:为了避免头文件重复引用

#ifndef 标号(标号一般与文件同名,一般用大写来表示,将所有的.换成_)
#define 标号
1、 头文件
2、 宏定义
3、 结构体类型的定义
4、 枚举类型的定义
5、 函数声明
#endif

1、gcc工作原理

gcc的编译分为4个阶段:预处理、编译、汇编、链接
方式1:
1、预处理。
1.处理#开头的文件。
gcc -E test.c -o tset.i
2、编译。
1.编译为汇编语言。
gcc -S test.i -o test.s
3、汇编。
1.将输入的汇编文件转变为机器代码。
gcc -c test.s -o test.o
4、链接。
1.将所有的.o文件生成可执行文件。
gcc [test.o a.o b.o…] -o test
将前三步合三为一:
gcc test.c -o test.o

**方式2:**将四个阶段合四为一
gcc test.c -o test

2、多文件编译

2.1 将gcc的前三步合三为一
比如: gcc stu.c -o stu.o
gcc io.c -o io.o
gcc sort.c -o sort.o
gcc swap.c -o swap.o
gcc calPmaxAge.c -o calPmaxAge.o
gcc sumScores.c -o sumScores.o

2.2 最后整合
比如: gcc stu.o io.o sort.o calPmaxAge.o swap.o sumScores.o -o stu

在这里插入图片描述

3、Make工程管理器
Linux下的工程管理器
在这里插入图片描述
make命令会在当前路径下找一个叫做Makefile/makefile的文件
**注意:**大写的M或小写的m都可以

3.1 Makefile规范
(make编译注意一点:你之前改的哪个文件make就编译的哪个文件)
目标文件1:依赖文件1
(Tab键)依赖文件1如何生成目标文件1
目标文件2:依赖文件2
(Tab键)依赖文件2如何生成目标文件2
注意:
1、 两个目标文件之间没有任何关系,系统默认只执行目标文件1
2、 一个Makefile中可以有多个目标文件
3、 调用make时,需要告诉它目标是什么,如果没有指定目标,那么make以Makefile文件中定义的第一个目标作为执行目标
在这里插入图片描述
**注意:**make会在构建yyds之前先构建test
在这里插入图片描述
图1

在这里插入图片描述
下图1是图1简化出来的

在这里插入图片描述

3.2 解决假目标的办法
在clean前面加上.PHONY
注意:.PHONY必须是大写
在这里插入图片描述
3.3 预定义变量

		Makefile预定义变量包含了编译器常见的名称及其编译选项
		CC :c编译器的名称,默认为cc
		CFALGS: c编译器的选项,无默认值
		RM : 文件删除程序的名称,默认为rm -rf

在这里插入图片描述
3.4 自定义变量

 OBJ:用于存放可执行文件的名字
 OBJS:用于存放所有的目标文件

3.5 自动变量

$@:表示目标文件
$^:表示所有的依赖文件
$<:表示第一个依赖文件

3.6 变量定义的两种方式

3.6.1 递归展开方式 VAR=var
在这里插入图片描述
后面的值会影响前面的结果

3.6.2 简单方式 VAR:=var**(建议用简单方式的这种)**
在这里插入图片描述

3.7 嵌套Makefile
(1)创建目录
include(.h文件) 、src(.c文件)、obj(.o文件)、bin(可执行文件)
(2)编写总控Makefile,书写自定义变量或者预定义变量
在这里插入图片描述(3)进入src目录,编写Makefile(将所有的.c文件编译生成.o文件,并移动到obj目录中)
在这里插入图片描述

(4)进入obj目录,编写Makefile(将所有的o文件编译生成可执行文件,并移动到bin目录中)
在这里插入图片描述

(5)编辑总控Makefile(先执行src中的makefile(make -C src),然后再执行obj中的Makefile(make – C obj))
在这里插入图片描述
4、枚举
作用:是程序变得简洁、语义化
宏定义
#define INPUT 1
#define OUTPUT 2
#define SORT 3
#define SWAP 4
在这里插入图片描述
5、共用体+大小端
特点:所有成员的首地址的是一样的(所占的内存空间有成员中最大的来决定)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如何判断是大端序还是小端序
union un
{
int a;//4个字节
char c;//1个字节
};
union un u;
u.a = 0x12345678;
u.c = 0x12;//大端序
u.c = 0x78;//小端序
在这里插入图片描述
6、递归
定规则,自己运行
自己可以调用自己的函数
5! return 120
54! return 524
43! return 46
32! return 32
21! return 21
1! return 1
在这里插入图片描述

7、函数指针
指向函数的指针
定义一个指向int型变量的指针:int *
定义一个指向char型变量的指针 :char *
定义一个指向整型指针的指针:int **
定义一个指向数组的指针,该数组有3个int型元素:int (*p)[3]
定义一个指向结构体的指针
typedef struct student
{
char name[20];
int age;
}Stu;
Stu stu;
Stu * p = &stu;
定义一个指向函数的指针,该函数分别有两个int型的参数,返回值也为int型
int sum(int m, int n);//函数的数据类型:int (int,int)
int (*p)(int,int);//函数指针

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值