linux基础

本人学习linux系统采用Ubuntu服务器20.04,从零基础开始学习,记录学习的过程。

一、linux常用管理命令

常用命令

ctrl + c : 终止执行当前命令(换行)(避免死循环)

ctrl + u : 删除当前行命令(写错了不用一个一个删,便捷)

ls : 列出当前目录下所有文件 

tab : 可以补全命令和文件名(补全不了可以按两下,显示备选文件)、

ls -l : 表示出文件的详细信息

ls -l(h) :命令的简化

ls -a :显示所有文件(包括隐藏文件)

pwd : 显示当前目录

cd :进入xxx目录下

cd ·· :返回上一层目录

cd -: 返回上一个demo的目录 (一直操作就来回循环)

cp : 复制 + 粘贴 + 重命名 (cp a/tmp.txt b) 

cp -r :复制整个文件夹,包括文件 (cp a b -r)

mkdir : 创建文件夹 (mkdir a)

mkdir - p : 连续创建文件夹 (mkdir a/b/c -p)

rm : 删除文件

rm - r :删除文件夹

touch :创建文件

rm * : 正则表达式(rm *.txt 删除所有同名文件)

mv : 剪切 + 粘贴 + 重命名

ctrl + insert : 复制文本

shift + insert :粘贴文本

二、 tmux和vim

tmux

每执行一次tmux,就是建立一个session,其中包含一个window ,window下包含一个pane,pane里打开了一个shell对话框。

常用操作

部分仅支持Ac teminal

ctrl + a 松开 + % :将pane左右半分

ctrl + a 松开 + “ : 将pane上下半分

ctrl + d :关闭一个pane

ctrl + a 松开 + z :将pane全屏 / 退出全屏

ctrl + a 松开 + d :挂起当前session

tmux a :打开之前挂起的session

ctrl + a + s :  选择session

shift :选择文本

ctrl + a + c :在session 中创建一个新的window

vim 

功能

命令行下的文本编辑器,根据文件名判断编程语言,支持代码缩进,代码高亮等功能。

使用方式

vim + filename,如果存在该文件,则将它打开,如果不存在, 则打开一个文件,并命名为filename。

模式

1.一般命令模式:默认模式。类似游戏里的召唤师技能,支持复制粘贴等快捷操作。

2.编辑模式:在一般命令模式下按i,按Esc退出编辑模式。

3.命令行模式:在一般命令模式下,按:/ ? 任意一个,会进入命令模式。命令模式下可以查找、替换、保存等功能。

        (1) i:进入编辑模式
        (2) ESC:进入一般命令模式
        (3) h 或 左箭头键:光标向左移动一个字符
        (4) j 或 向下箭头:光标向下移动一个字符
        (5) k 或 向上箭头:光标向上移动一个字符
        (6) l 或 向右箭头:光标向右移动一个字符
        (7) n<Space>:n表示数字,按下数字后再按空格,光标会向右移动这一行的n个字符
        (8) 0 或 功能键[Home]:光标移动到本行开头
        (9) $ 或 功能键[End]:光标移动到本行末尾
        (10) G:光标移动到最后一行
        (11) :n 或 nG:n为数字,光标移动到第n行
        (12) gg:光标移动到第一行,相当于1G
        (13) n<Enter>:n为数字,光标向下移动n行
        (14) /word:向光标之下寻找第一个值为word的字符串。
        (15) ?word:向光标之上寻找第一个值为word的字符串。
        (16) n:重复前一个查找操作
        (17) N:反向重复前一个查找操作
        (18) :n1,n2s/word1/word2/g:n1与n2为数字,在第n1行与n2行之间寻找word1这个字符串,并将该字符串替换为word2
        (19) :1,$s/word1/word2/g:将全文的word1替换为word2
        (20) :1,$s/word1/word2/gc:将全文的word1替换为word2,且在替换前要求用户确认。
        (21) v:选中文本
        (22) d:删除选中的文本
        (23) dd: 删除当前行
        (24) y:复制选中的文本
        (25) yy: 复制当前行
        (26) p: 将复制的数据在光标的下一行/下一个位置粘贴
        (27) u:撤销
        (28) Ctrl + r:取消撤销
        (29) 大于号 >:将选中的文本整体向右缩进一次
        (30) 小于号 <:将选中的文本整体向左缩进一次
        (31) :w 保存
        (32) :w! 强制保存
        (33) :q 退出
        (34) :q! 强制退出
        (35) :wq 保存并退出
        (36) :set paste 设置成粘贴模式,取消代码自动缩进
        (37) :set nopaste 取消粘贴模式,开启代码自动缩进
        (38) :set nu 显示行号
        (39) :set nonu 隐藏行号
        (40) gg=G:将全文代码格式化
        (41) :noh 关闭查找关键词高亮
        (42) Ctrl + q:当vim卡死时,可以取消当前正在执行的命令
    异常处理:
        每次用vim编辑文件时,会自动创建一个.filename.swp的临时文件。
        如果打开某个文件时,该文件的swp文件已存在,则会报错。此时解决办法有两种:
            (1) 找到正在打开该文件的程序,并退出
            (2) 直接删掉该swp文件即可

三、shell语法

概论

shell是我们通过命令行和操作系统沟通的语言。

Ac terminal中的命令行可以看作一个“shell脚本在逐行执行”。

学习技巧不要死记硬背,遇到含糊不清的问题,在Ac terminal里面执行一下。

Linux中常见的shell脚本有很多种,常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
zsh

Linux系统中一般默认使用bash,所以接下来重点学习bash语法。

文件开头需要加#! /bin/bash ,这个指令是文件解释器,类似c++中的头文件。

脚本示例(Hello world)

新建一个test.sh文件。

#! /bin/bash
echo "Hello world!"

运行方式

用可执行文件执行

chmod +x  test.sh       #作为可执行文件

./ test.sh                      #当前路径下运行

/home/acs/test.sh       #在绝对路径下运行

~/test.sh                      #在家目录下运行  

用解释器执行

bash test.sh     

单行注释 注释

# 这是一行注释

echo 'Hello World'  #  这也是注释

多行注释
格式

:<<EOF
第一行注释
第二行注释
第三行注释
EOF
其中EOF可以换成其它任意字符串。

:<<abc
第一行注释
第二行注释
第三行注释
abc

:<<!
第一行注释
第二行注释
第三行注释
!

变量

定义变量

name=yxc

name='yxc'

name="yxc"

使用变量 

加上$符号,或者${}符号。{}是可选的,主要是为了给解释器一个识别的边界。

name=yxc

echo $name

echo ${name}

echo ${name}acwing

 只读变量

使用readonly或者declare可以将变量变为只读

name=yxc

readonly name

declare -r name

name=abc    #会报错,因为那么为只读

 删除变量

使用unset可以删除变量

name=yxc

unset name

echo $name #输出空行

变量类型

自定义变量:

子进程不能访问的变量

环境变量:

子进程可以访问的变量

自定义变量变为环境变量:

name=yxc

export name   #第一种写法

declare -x       #第二种写法 

环境变量变为自定义变量

name=yxc

export name=yxc   #第一种写法

declare +x      #第二种写法

字符串

字符串可以用双引号,单引号,也可以不用引号。 

单引号和双引号的区别

单引号中的内容会原样输出,不会执行,不会取变量

双引号中的内容可以执行,可以取变量

name=yxc  # 不用引号
echo 'hello, $name \"hh\"'  # 单引号字符串,输出 hello, $name \"hh\"
echo "hello, $name \"hh\""  # 双引号字符串,输出 hello, yxc "hh"

 获取字符串长度

name=yxc

echo ${#name}   #输出3

提取字串

name=yxc

echo ${name:0:3}  #从0开始的三个字符

 默认变量

在执行shell脚本时,可以向脚本传递参数。$1是第一个参数,$2是第二个参数...以此类推。特殊的$0是文件名(绝对路径)

#! /bin/bash

echo "文件名:"$0
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
echo "第四个参数:"$4

 acs@9e0ebfcd82d7:~$ chmod +x test.sh 
acs@9e0ebfcd82d7:~$ ./test.sh 1 2 3 4
文件名:./test.sh
第一个参数:1
第二个参数:2
第三个参数:3
第四个参数:4

其它参数相关变量 

$# :代表文件中传入参数的个数,上例为4

$@:由所有参数构成的用空格隔开的字符串,如上例中值为"$1 $2 $3 $4"

$* : 每个参数分别用双引号括起来的字符串,如上例中值为"$1" "$2" "$3" "$4"

$? : 上一条命令的退出状态(exit code)。0表示正常推出,其它值表示错误

$():  返回命令的stdout(可嵌套

``:    返回命令的stdout(不可嵌套

 数组

数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。
数组下标从0开始

 定义

 数组用小括号表示,元素之间用空格隔开。例如:

array=(1 2 3 4)

也可以直接定义数组中某个元素的值

array[0]=1

array[1]=2

array[1000]=3

读取某个元素的值

格式:

${array[index]}    #  ${array[1]}

 读取整个数组的值

${array[@]}  

${array[*]}

 数组长度

${#array[@]}

${#array[*]}

 expr命令

expr用来求表达式的值

格式为:expr 表达式

表达式说明

用空格隔开每一项

用反斜杠放在shell特定的字符前面(发现表达式运行错误时,可以试试转义)

expr会在stdout中输出结果。如果为逻辑关系表达式,则1为真,0为假

expr会在exit code中输出结果。如果为逻辑关系表达式,则0为真,其它值为假

字符串表达式

length string :求字符串的长度

index string charset :CHARSET中任意单个字符在STRING中最前面的字符位置,下标从1开始。如果在STRING中完全不存在CHARSET中的字符,则返回0。

substr string possition length :返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串。如果POSITION或LENGTH为负数,0或非数值,则返回空字符串。

str="Hello World"

echo `expr length"$str"`                #输出11

echo `expr charset "$str"  aWd`    #下标从1开始,输出7

echo `expr substr "$str" 2 3`         #下标从1开始,从2开始输出3个字符,ell

整数表达式

注意:* ( ) 三个运算符需要转义符号

示例:

a=3
b=4

echo `expr $a + $b`  # 输出7
echo `expr $a - $b`  # 输出-1
echo `expr $a \* $b`  # 输出12,*需要转义
echo `expr $a / $b`  # 输出0,整除
echo `expr $a % $b` # 输出3
echo `expr \( $a + 1 \) \* \( $b + 1 \)`  # 输出20,值为(a + 1) * (b + 1)

 逻辑关系表达式

第一个参数为非空且非0 ,返回第一个参数的值,不会计算第二个参数的值

否则,如果第二个参数为非空且非0,返回第二个参数

           第二个参数为空或者0,则返回0

&

如果两个参数都为非空且非0,则返回第一个参数,否则返回0。

如果第一个参数为空或者0,则不会计算第二个参数的值

< <= = == != >= >
比较两端的参数,如果为true,则返回1,否则返回0。”==”是”=”的同义词。”expr”首先尝试将两端参数转换为整数,并做算术比较,如果转换失败,则按字符集排序规则做字符比较。

 ()可以改变优先级,但需要用反斜杆转义

a=3
b=4

echo `expr $a \> $b`  # 输出0,>需要转义
echo `expr $a '<' $b`  # 输出1,也可以将特殊字符用引号引起来
echo `expr $a '>=' $b`  # 输出0
echo `expr $a \<\= $b`  # 输出1

c=0
d=5

echo `expr $c \& $d`  # 输出0
echo `expr $a \& $b`  # 输出3
echo `expr $c \| $d`  # 输出5
echo `expr $a \| $b`  # 输出3

read命令

read命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code为1,否则为0。

参数说明

-p: 后面可以接提示信息
-t:后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令
实例:

read name

acwing yxc  

echo $name   #输出acwing yxc

交互效果:

read -p "Please input your name: "  -t 30 name  # 读入name的值,等待时间30秒

acwing yxc                      

echo $name  #输出acwing yxc

echo命令

echo用于输出字符串。

格式:echo string

显示普通字符串

echo "Hello world"

echo Hello world     #引号可以省略

显示转义字符

echo "\"Hello AC Terminal\""  # 注意只能使用双引号,如果使用单引号,则不转义
echo \"Hello AC Terminal\"  # 也可以省略双引号
 

显示变量

name=yxc

echo "My name is $name"

显示换行

 echo -e "Hi\nyxc"     #-e开启转义 \n 换行

#输出:Hi

            yxc

显示不换行

echo -e "Hi \c" # -e 开启转义 \c 不换行
echo "acwing"
输出结果:Hi acwing

显示结果定向至文件

echo "Hello World" > output.txt  # 将内容以覆盖的方式输出到output.txt中 

原样输出字符串,不进行转义或取变量 

name=yxc

echo '$name\"'

输出:$name\"

显示命令的执行结果

echo `date`  #显示当时的时间

printf命令

printf命令用于格式化输出,类似于C/C++中的printf函数。

将,替换成【space】键

例如:

printf "%10d\n" 123    

test命令与判断符号[]

逻辑运算符&&和||

&&

expr1 && expr2         #如果expr1为假时,则直接忽略expr2  

expr1 || expr2            #如果expr1为真时,则直接忽略expr2

表达式的exit code 为0(正常退出),表示真,非0为假 (与c ++ 不同)

经常用来作if判断

test命令

在命令行中输入man test,可查看test命令的用法

test命令常用来判断文件类型,以及对变量作比较

test命令用exit code作为结果,而不是stdout。0为真,非0为假

例如

test 2 -lt 3    # 结果为真 , 返回0 

echo $?       #输出上一个命令的返回值,为0 

文件类型判断

test -e :判断文件是否存在

test -f  :判断是否为文件

test -d  :判断是否为文件夹

例:

test -e -filename 

文件权限判断

test -r :判断文件是否可读

test -w :判断文件是否可写

test -x : 判断文件是否可以执行

test -s :判断文件是否为空位件

例:

test -r -filename

 整数间的比较

test $a -eq $b   #a是否等于b

-eq 等于

-ne 不等于

-gt  大于

-lt   小于

-ge 大于等于

-le  小于等于

字符串的比较

test -z string  : 判断是否为空

test -n string  :判断是否非空(-n可以省略)

test str1 == str2 :判断字符串是否相等

test str1 != str2 :判断字符串是否不相等 

多重条件判定

test -r filename -a -x filename 

-a    两条件是否同时成立
-o    两条件是否至少一个成立
!    取反。如 test ! -x file,当file不可执行时,返回true

判断符号[]

[ 2 -lt 3 ]  # 结果为真 ,返回0

echo $?   #输出0

ls  # 列出当前目录下的所有文件
homework  output.txt  test.sh  tmp 

[ -e test.sh ] && echo "exist " || echo "Not exist"   #test.sh文件存在

[ -e test2.sh] && echo "exist" || echo "Not exist"  #test2.sh文件不存在

注意:

[]中的每一项都要用空格隔开

   中的变量最好用双引号括起来

   中的常量最好用单或双引号括起来

例如

name=acwing yxc

[ $name == "acwing yxc" ]   # 错误  等价于 [ acwing yxc == "acwing yxc" ],参数太多

[ "$name" == "acwing yxc" ] #正确

判断语句 

 if...then格式

a=3

b=4

if [ $a -gt $b ]

then

        echo "3 < 4"

fi

单个if ...else格式
a=3
b=4
if [ $a -gt $b ]
then
    echo "3 > 4"
else
    echo "3 < 4"
fi            

多层if..elif...elif...else

a=4

if [ $a -eq 1 ]
then
    echo ${a}等于1
elif [ $a -eq 2 ]
then
    echo ${a}等于2
elif [ $a -eq 3 ]
then
    echo ${a}等于3
else
    echo 其他
fi
           

case...esac形式

类似c/c++ 中的switch语句 

a=4

case $a in
    1)
        echo ${a}等于1
        ;;  
    2)
        echo ${a}等于2
        ;;  
    3)                                                
        echo ${a}等于3
        ;;  
    *)
        echo 其他
        ;;  
esac

循环语句

for...in...do...done

命令格式:

for var in val1 val2 val3

do

        语句1

        语句2

done

示例 :

for i in a 2 cc

do

        echo $i

done

输出:a

           2

           cc

for file in `ls`

do

        echo $file

done

输出路径下所有文件名

for i in `seq 1 10`

do

        echo $i

done

输出1~10

for i in {1..19}

do

        echo $i

done

输出1~19

for ((...;...;...)) do...done(类似c++)

for (( i = 1 ; i <= 10 ; i ++ ))

do 

        echo $i

done

输出1~10

五、git

git的基本概念

工作区:仓库的目录。工作区是独立于各个分支的。
暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。
版本库:存放所有已经提交到本地仓库的代码版本
版本结构:树结构,树中每个节点代表一个代码版本。

git的常用命令

全局设置:

git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中
git config --global user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中
git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中

常用命令:
git add XX:将XX文件添加到暂存区
git add .:将所有待加入暂存区的文件加入暂存区
git commit -m "给自己看的备注信息":将暂存区的内容提交到当前分支
git status:查看仓库状态

查看命令:
git diff XX:查看XX文件相对于暂存区修改了哪些内容
git log:查看当前分支的所有版本
git reflog:查看HEAD指针的移动历史(包括被回滚的版本)

git branch:查看所有分支和当前所处分支
代码回滚:

git reset --hard HEAD^ 或 git reset --hard HEAD~:将代码库回滚到上一个版本
git reset --hard HEAD^^:往上回滚两次,以此类推
git reset --hard HEAD~100:往上回滚100个版本
git reset --hard 版本号:回滚到某一特定版本
远程仓库:

git remote add origin git@git.acwing.com:xxx/XXX.git:将本地仓库关联到远程仓库
git push -u (第一次需要-u以后不需要):将当前分支推送到远程仓库
git push origin branch_name:将本地的某个分支推送到远程仓库
git clone git@git.acwing.com:xxx/XXX.git:将远程仓库XXX下载到当前目录下
git checkout -b branch_name:创建并切换到branch_name这个分支
git checkout branch_name:切换到branch_name这个分支
git merge branch_name:将分支branch_name合并到当前分支上
git branch branch_name:创建新分支
git push --set-upstream origin branch_name:设置本地的branch_name分支对应远程仓库的branch_name分支
git pull:将远程仓库的当前分支与本地仓库的当前分支合并
git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前分支合并
git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程的branch_name1分支与本地的branch_name2分支对应
git checkout -t origin/branch_name 将远程的branch_name分支拉取到本地

删除命令:

git rm --cached XX:将文件从仓库索引目录中删掉

git checkout — XX或git restore XX:将XX文件尚未加入暂存区的修改全部撤销

git branch -d branch_name:删除本地仓库的branch_name分支

git push -d origin branch_name:删除远程仓库的branch_name分支
 

stash暂存:
git stash:将工作区和暂存区中尚未提交的修改存入栈中
git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
git stash drop:删除栈顶存储的修改
git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素
git stash list:查看栈中所有元素

七、管道,环境变量与常用命令

管道

概念:

类似与文件的重定向,接收前一个命令的stdout重定向到下一个命令的stdin

要点:

1、管道命令仅处理stdout,忽略stderr

2、管道右边的命令必须能够接收stdin

3、多个管道命令可以串联

举例:

find . -name  '*.py' | xargs cat | wc -l

环境变量

查看:

env  # 显示当前用户的变量
set  # 显示当前shell的变量,包括当前用户的变量;
export  # 显示当前导出成用户变量的shell变量

echo $path  #输出某个环境变量的值

 修改:

环境变量的定义、修改、删除操作可以参考3. shell语法——变量这一节的内容。

为了将对环境变量的修改应用到未来所有环境下,可以将修改命令放到~/.bashrc文件中。
修改完~/.bashrc文件后,记得执行source ~/.bashrc,来将修改应用到当前的bash环境下。

为何将修改命令放到~/.bashrc,就可以确保修改会影响未来所有的环境呢?

每次启动bash,都会先执行~/.bashrc。
每次ssh登陆远程服务器,都会启动一个bash命令行给我们。
每次tmux新开一个pane,都会启动一个bash命令行给我们。
所以未来所有新开的环境都会加载我们修改的内容

常见环境变量

HOME:用户的家目录
PATH:可执行文件(命令)的存储路径。路径与路径之间用:分隔。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序。
LD_LIBRARY_PATH:用于指定动态链接库(.so文件)的路径,其内容是以冒号分隔的路径列表。
C_INCLUDE_PATH:C语言的头文件路径,内容是以冒号分隔的路径列表。
CPLUS_INCLUDE_PATH:CPP的头文件路径,内容是以冒号分隔的路径列表。
PYTHONPATH:Python导入包的路径,内容是以冒号分隔的路径列表。
JAVA_HOME:jdk的安装目录。
CLASSPATH:存放Java导入类的路径,内容是以冒号分隔的路径列表。

 常用命令

系统状况

top(linux的任务管理器):

打开top后按M:按内存排序

打开top后按P:按cpu排序

打开top后按q:退出任务管理器

df -h :查看硬盘使用情况

free -h :查看内存使用情况

du -sh :查看当前目录占用内存的情况

ps aux :查看所用进程,精确找到进程(通常使用管道)

kill -9 pid :杀死一个进程

netstat -nt :查看网络连接

w :列出当前登录的用户

ping www.baidu.com : 查看网址是否联网

文件检索

find /path/to/directory/ -name '*.py':搜索某个文件路径下的所有*.py文件
grep xxx:从stdin中读入若干行数据,如果某行中包含xxx,则输出该行;否则忽略该行。
wc:统计行数、单词数、字节数

既可以从stdin中直接读入内容;也可以在命令行参数中传入文件名列表;
wc -l:统计行数
wc -w:统计单词数
wc -c:
统计字节数
tree:展示当前目录的文件结构
tree /path/to/directory/:
展示某个目录的文件结构
tree -a:展示隐藏文件
ag xxx:搜索当前目录下 的所有文件,检索xxx字符串
cut:分割一行内容
从stdin中读入多行数据
echo $PATH | cut -d ':' -f 3,5:输出PATH用:分割后第3、5列数据
echo $PATH | cut -d ':' -f 3-5:输出PATH用:分割后第3-5列数据
echo $PATH | cut -c 3,5:输出PATH的第3、5个字符
echo $PATH | cut -c 3-5:输出PATH的第3-5个字符

sort:将每行内容按字典序排序
可以从stdin中读取多行数据
可以从命令行参数中读取文件名列表

xargs:将stdin中的数据用空格或回车分割成命令行参数
find . -name '*.py' | xargs cat | wc -l:统计当前目录下所有python文件的总行数

查看文件内容

more:浏览文件内容
回车:下一行
空格:下一页

b:上一页
q:退出
less:与more类似,功能更全
回车:下一行
y:上一行
Page Down:下一页
Page Up:上一页
q:退出
head -3 xxx:展示xxx的前3行内容
同时支持从stdin读入内容

tail -3 xxx:展示xxx末尾3行内容
同时支持从stdin读入内容

工具

md5sum:计算md5哈希值
可以从stdin读入内容
也可以在命令行参数中传入文件名列表;

time command:统计command命令的执行时间
ipython3:交互式python3环境。可以当做计算器,或者批量管理文件。
! echo "Hello World":!表示执行shell脚本
watch -n 0.1 command:每0.1秒执行一次command命令
tar:压缩文件
tar -zcvf xxx.tar.gz /path/to/file/*:压缩
tar -zxvf xxx.tar.gz:解压缩
diff xxx yyy:查找文件xxx与yyy的不同点

安装软件

sudo command:以root身份执行command命令
apt-get install xxx:安装软件
pip install xxx --user --upgrade:安装python包

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值