我的shell笔记

shell:

.linux内核与用户之间的解释器程序(默认为/bin/bash)
负责向内核翻译及传达用户/程序指令
linux中解释器存放的位置:/etc/shells
.规范的脚本构成
#! 声明的解释器
# 注释信息
.变量:(unset取消变量)
规则:等号两边不可有空格
变量名称不能以数字,特殊字符,下划线开头
若指定变量名称已经存在,相当于重新赋值
变量名由数字字母下滑线组成,区分大小写
脚本的执行方式
-加x执行权限 [绝对路径 相对路径] 开启子进程
-bash 脚本文件;sh 脚本文件 开启子进程
-source 脚本文件;. 脚本文件 不开启子进程

ping
-c选项可以设置ping的次数,
-i选项可以设置多次ping之间的间隔时间(单位秒)
-W选项可以设置ping不通时的超时时间(单位秒)

if判断
-if单分支结构:
if 条件测试;then
命令序列
fi
-if双分支结构:
if 条件测试1;then
命令序列1
else
命令序列2
fi
-if多分支结构:
if 条件测试1;then
命令序列1
elif 条件测试2;then
命令序列2
elif 条件测试n;then
命令序列n
else
命令序列n+1
fi

for循环
for 变量名 in 值列表
do
命令序列
done

while循环 无限循环(死循环)
while 条件测试
do
命令序列
done

随机数$RANDOM

case判断格式
case 变量 in
模式1)
命令序列1 ;;
模式2)
命令序列2 ;;
… …
*)
默认命令序列
esac

函数的定义方法
方法一:
function 函数名 {
命令序列
… …
}

方法二:
函数名() {
命令序列
… …
}
函数的调用
直接使用“函数名”的形式调用,如果该函数能够处理位置参数,则可以使用“函数名 参数1 参数2 … …”的形式调用。

.变量的种类
①环境变量:变量名通常都大写,由系统维护,用来设置工作环境,只有个别变量用户可以直接修改
USER(当前登录的系统用户) UID(当前登录用户的uid)
PWD(当前所在路径) HOME(当前用户家目录)
PS1(一级提示符) PS2(二级提示符)

—env:列出所有的环境变量
—set:列出所有变量

②位置变量: bash内置,存储执行脚本是提供参数
$1 执行脚本时,后面跟的第1个参数
$2 执行脚本时,后面跟的第2个参数
.
.
$n 执行脚本时,后面跟的第n个参数
③预定义变量:bash内置,一类有特殊用途的变量,可直接调用但是不赋值或者修改
$0 当前所在的进程号或脚本名
$$ 当前运行进程的PID
$? 命令执行后的返回状态,0表示正常,1或其他值表示异常
$# 已加载的位置变量的个数
$* 所有位置变量的值
$! 保存后台(最后一个进程)的PID号

" "双引号 界定范围
’ '单引号 界定范围,屏蔽特殊符号
反撇号 可以获取命令执行的结果,还可以使用$()
read 从键盘读入变量值完成赋值
格式:read [-p “提示信息”] 变量名
-t 指定超时秒数
终端显示控制
stty -echo:关闭终端输出(无显示)
stty echo:恢复终端显示 (显示)

局部变量:
新定义的变量默认在当前shell环境中有效
无法在子shell环境中使用
全局变量:
全局变量在当前shell及子shell环境中有效
使用export可将局部变量声明为全局变量
export -n 取消指定变量的全局属性

④自定义变量:由用户自主设置,修改及使用

5整数运算

①expr运算工具
.+ - * /
例子: expr 2 + 1 或 expr $a + $b
expr 2 - 1 或 expr $a - $b
expr 2 * 1 或 expr $a * $b
expr 2 / 1 或 expr $a / $b
expr 2 % 1 或 expr $a % $b

②$[]算式替换
[ ] 或 []或 [](()):*无需转义,运算符两侧可以无空格
:引用变量可省略$
例子:echo $[1+1] 或 echo $[a+1] echo $((a+1))

③变量自增减
$[]或者let

例子:echo $[a+=1]或者 let a++

④bc实现小数运算
-支持高精度数值运算
-直接运行bc可进入交互式界面,quit退出
-设置scale=n可约束小数位
例子:
root@svr7 ~]# bc
3.14+3.14
6.28
scale=3
3.141+3.141
6.282
[root@svr7 ~]# echo “KaTeX parse error: Expected 'EOF', got '#' at position 32: …5 [root@svr7 ~]#̲ echo "a*3.14;KaTeX parse error: Expected 'EOF', got '#' at position 37: …9 [root@svr7 ~]#̲ echo 'scale=2;…a<=KaTeX parse error: Expected 'EOF', got '#' at position 23: …1 [root@svr7 ~]#̲ echo "a>$b”|bc
0

测试操作:
格式: -test 选项 参数
:[ 选项 参数 ]
字符串比较:
-z 字符串的值为空
-n 字符串的值不为空
== 两个字符串相等
!= 两个字符串不相等
[root@svr7 ~]# [ -z “”]&& echo yes || echo no
yes

[root@svr7 ~]# [ -z " " ]&& echo yes || echo no
no
整数值比较:

-eq 等于 -ne 不等于
-ge 大于等于 -le 小于等于
-gt 小于 -lt 小于

文件状态测试:
-e 判断是否存在,不区分文件或目录
-d 判断是否为目录
-f 判断是否为文件
-r 判断是否可读(对root用户无效)
-w 判断是否可写(对root用户无效)
-x 判断是否可执行
取反测试:加!

逻辑判断:
- && 且 前面任务成功,才执行后续任务
- || 或 前面任务失败,才执行后续任务
- ; 前后无逻辑关系 前面执行完毕后,继续执行后面任务
字符串的截取:

子串截取的用法:${变量名:起始位置:长度} //起始位置从0开始
初值的检测及设置: 变 量 名 : − w o r d 变 量 值 存 在 不 为 空 则 返 回 变 量 , 当 变 量 值 为 空 时 返 回 w o r d 子 串 替 换 的 用 法 : 只 替 换 第 一 个 匹 配 结 果 : {变量名:-word}变量值存在不为空则返回变量,当变量值为空时返回word 子串替换的用法: 只替换第一个匹配结果: wordword{变量名/old/new}
替换全部匹配结果: 变 量 名 / / o l d / n e w 字 符 串 掐 头 去 尾 : 从 左 向 右 , 最 短 匹 配 删 除 : {变量名//old/new} 字符串掐头去尾: 从左向右,最短匹配删除: //old/new{变量名#关键词}
从左向右,最长匹配删除:KaTeX parse error: Expected '}', got '#' at position 5: {变量名#̲#*关键词} 从右向左,最短匹…{变量名%关键词
}
从右向左,最长匹配删除:${变量名%%关键词*}

正则表达:使用"一串符号"来描述有共同属性的数据

正则
基本正则
. 匹配任意单个字符

  • 匹配前一个字符任意次数(不允许单独使用)
    ^ 匹配行首
    $ 匹配行尾
    []集合,匹配集合中的任意单个字符
    [^] 对集合取反
    {n,m} 匹配前一个字符n到m次
    {n} 匹配前一个字符n次
    {n,} 匹配前一个字符n次及n次以上
    () 保留

扩展正则
.+ 最少匹配一次
? 最多匹配一次
{n,m} 匹配n到m次
{n} 匹配n次
{n,} 匹配n次以上
() 保留
| 或者

整体及边界匹配

() 组合为整体
\b 单词边界
< 单词的开头
> 单词的结束
\w 字母数字下划线
\s表示,只要出现空白就匹配
\S表示,非空白就匹配
\d 匹配数字
\ 屏蔽特殊符号,转义符

eg:用正则匹配http日志信息
在这里插入图片描述

在这里插入图片描述

linux 的三剑客 sed egrep awk

sed:流体编辑器

非交互,基于模式匹配过滤及文本修改
逐行处理,并将结果输出到屏幕
可实现增删改查等操作
匹配正则时需要使用//

格式1:前置命令 | sed [选项] ‘条件指令’
格式2:sed [选项] ‘条件指令’ 文件… …

常用选项:
-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)
-r(让sed支持扩展正则)
-i(sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响)
打印§:
sed -n ‘条件’ 文件
第2行:2p
2~5行:2,5p
2和5行:2p;5p
第2以及后面的5行:2,+5p
奇数行:1~2p
偶数行:2~2p
包含root的行:/root/p ## /正则/p
$=:输出文件的行数

删除(d):
2~5行:2,5d
包含root的行:/root/d
不包含root的行:/root/! ##!符号表示取反
文件的最后一行:$d

替换(s/old/new/option):
每行中第一个aaa替换为AAA:s/aaa/AAA/
每行中的第3个aaa替换为AAA:s/aaa/AAA/3’
所有的aaa替换为AAA:s/aaa/AAA/g’
所有的aaa都删除:s/aaa//g ##替换为空字符串
替换操作的分隔“/”可改用其他字符,如#、&等,便于修改文件路径

#sed [选项] ‘条件指令’ 文件

选项:

-n 屏蔽默认输出

-r 支持扩展正则

-i 修改源文件

条件:

行号 4 4,5 4~2 4,+10

/正则/

指令:

p 打印

d 删除

s 替换s/旧/新/g

a 追加

i 插入

c 替换行
sed的高级用法

文件导入导出:
-r 结合i选项才会存入,否则只会输出
-w 以覆盖的方式另存为新文件

[root@svr7 ~]# sed -n ‘1p;4p’ /etc/passwd 打印第1和第4行

[root@svr7 ~]# sed -n ‘1,4p’ /etc/passwd 打印第1到4行

[root@svr7 ~]# sed -n ‘3,+10p’ /etc/passwd 打印第3以及后面的10行

[root@svr7 ~]# sed -n ‘1~2p’ /etc/passwd 打印奇数行

[root@svr7 ~]# sed -n ‘2~2p’ /etc/passwd 打印偶数行

[root@svr7 ~]# sed -n ‘/root/p’ /etc/passwd 打印包含root的行

[root@svr7 ~]# sed -n ‘/^root/p’ /etc/passwd 打印以root开头的行

[root@svr7 ~]# sed -n ‘/bash$/p’ /etc/passwd 打印以bash结尾的行

[root@svr7 ~]# sed -n ‘$=’ /etc/passwd 打印输出文件的行数

[root@svr7 ~]# sed -n ‘/^$/p’ /etc/passwd 打印空行

[root@svr7 ~]# sed -n ‘$p’ /etc/passwd 打印最后一行

[root@svr7 ~]# sed -n ‘p’ /etc/passwd 输出文件中的所有内容

*删除的话将后面的所有p换成d就可以

[root@svr7 ~]# cat /opt/data.txt
2019 2019 2020
2018 2019 2024
2019 2018 2020

[root@svr7 opt]# sed ‘s/2019/6666/’ data.txt 将每行的2019提换成6666

[root@svr7 opt]# sed ‘s/2019/6666/3’ data.txt 将每行的第3个2019提换成6666

[root@svr7 opt]# sed ‘s/2019/6666/g’ data.txt 将所有行的2019提换成6666

[root@svr7 opt]# sed ‘s/2019//g’ data.txt 将所有行的2019提换成空

[root@svr7 ~]# sed ‘s#/bin/bash#/bin/sh#’ /etc/passwd 将文件中每行的第一个/bin/bash换成/bin/sh
[root@svr7 ~]# sed ‘s/^/#/’ /opt/data.txt 将所有的行加上#注释

[root@svr7 ~]# sed ‘s/^#//’ /etc/httpd/conf.d/welcome.conf 去掉所有行的注释
[root@svr7 ~]# sed ‘1,2s/^/#/’ /opt/data.txt 将文件中的1~2行添加注释

[root@svr7 opt]# sed ‘s/.//2;s/.KaTeX parse error: Expected 'EOF', got '#' at position 46: …[root@svr7 opt]#̲ sed -r 's/^(.…/\3\2\1/’ data.txt 将最后一个字符与第一个字符调换
[root@svr7 opt]# sed -r ‘s/[0-9]//’ data.txt 将文件中的每行的第一个数字替换成空
[root@svr7 opt]# sed -r ‘s/[0-9]//g’ data.txt 将文件中所有的数字删除

[root@svr7 opt]# sed -r ‘s/([A-Z])/(\1)/g’ grade.txt 将文件中的所有大写字母加上()—>([A-Z])此小括号是正则中的复制,(\1)这个小括号为添加小括号

[root@svr7 opt]# sed ‘2a ni hao’ data.txt 在文件的第二行下面添加 “ni hao”

[root@svr7 opt]# sed ‘2i ni hao’ data.txt 在文件的第二行上面添加“ni hao”

[root@svr7 opt]# sed ‘2c ni hao’ data.txt 将文件的第二行替换成(整行替换) “ni hao”

删除文档中所有数字
[root@svr7 opt]# sed -i ‘s/[0-9]//g’ 1.txt

egrep过滤工具(grep -E)

-i 忽略大小写
-v 条件取反
-c 统计匹配行数
-q 静默,无任何输出,一般用于检测
-n 显示行号
–color 标红显示的字符串

①行首及单字符匹配
^ 匹配行首
$ 匹配行尾
. 匹配单个字符
②未定匹配次数

  • 最少匹配一次
    a+ 一个或多个连续的a
    (abc)+ 一个或者多个连续的abc
    ? 最多匹配一次
    a? 0个或者1个a
    (abc)? 0个或者1个abc
  • 匹配任意次数
    a* 0个或者多个连续的a
    (abc)* 0个或者多个连续的abc
    .* 任意长度的任意字符

[root@svr7 ~]# egrep -c ‘/bin/bashKaTeX parse error: Expected 'EOF', got '#' at position 48: …3 [root@svr7 ~]#̲ egrep '/bin/ba…’ /etc/passwd | wc -l

[root@svr7 opt]# egrep ‘^r’ user.txt 输出以r开头的行

[root@svr7 opt]# egrep ‘root|daemon’ user.txt 或者
[root@svr7 opt]# egrep ‘^(root|daemon)’ user.txt 输出以root或者以daemon开头的行

[root@svr7 opt]# ifconfig |egrep ‘127.0.0.1’ 输出以127.0.0.1的行

[root@svr7 opt]# egrep -q ‘127.0.0.1’ /etc/hosts && echo yes ||echo no 静默输出与/dev/null的效果类似
yes
[root@svr7 opt]# egrep ‘^#’ /etc/inittab 输出以#开头的行

[root@svr7 ~]# egrep -m9 ‘/sbin/nologin$’ /etc/passwd 仅过滤文件前9次

[root@svr7 ~]# egrep ‘.$’ /opt/grade.txt 过滤以点结尾的行

[root@svr7 opt]# egrep ‘^$’ /opt/grade.txt 过滤空行

[root@svr7 opt]# egrep ‘n+’ grade.txt 过滤文中n至少出现一次的行

[root@svr7 opt]# egrep ‘nnn*’ grade.txt 过滤n出现两次后及以上的行

[root@svr7 opt]# egrep ‘.*’ grade.txt 输出任意(所有)

[root@svr7 opt]# egrep ‘^J.*26$’ grade.txt 输出以J开头,中间任意,以26结尾的行

[root@svr7 opt]# egrep ‘(ee){2}’ grade.txt 输出连续的ee出现2次的行

[root@svr7 opt]# egrep ‘(ab){2,4}’ grade.txt 连续输出 abab 2~4次的行

[root@svr7 opt]# egrep ‘ab[cdez]’ grade.txt 输出ab后面跟c d e z任何中的一个就符合条件的行
[root@svr7 opt]# egrep ‘[A-Z]’ grade.txt 输出文件中大写的行

[root@svr7 opt]# egrep ‘\b4712\b’ grade.txt 输出包含4712的行严格匹配

[root@svr7 opt]# egrep ‘<4712>’ grade.txt 输出包含4712的行严格匹配

awk工具概述

-awk编程语言/数据处理引擎
-基于模式匹配检查输入文本,逐行处理并输出
-通常用在shell脚本中,获取指定的数据
-单独使用时,可对文本数据统计
-print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔
格式1:前置命令 | awk [选项] ‘[条件]{指令}’
格式2:awk [选项] ‘[条件]{指令}’ 文件… …

awk常用内置变量:
-F:指定分隔符,可省略(默认空格)

FS 保存或设置字段分隔符,与-F功能一样

$0 文本当前行的全部内容

$1 文本的第1列

$2 文件的第2列

$3 文件的第3列,依此类推

NR 文件当前行的行号

NF 文件当前行的列数(有几列)

数值比较
== 等于、 != 不等于

大于、 >= 大于等于
< 小于、 <= 小于等于

逻辑比较
&& 逻辑与:期望多个条件都成立
|| 逻辑或:只要有一个条件成立即满足要求

变量运算
.+ - * / %
++ – -= += *= /=

~ 包含 !~ 不包含

awk处理的时机

awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行之后做一些总结性质的工作。

BEGIN{print“abc”}
逐行处理
END{print “xyz”}

-在所有行前处理,BEGIN{},读入第一行文本之前执行,一般用来初始化操作
-逐行处理,{},逐行读入文本执行相应的处理,是最常见的编辑指令块
-在所有行后处理,END{},处理完最后一行文本之后执行,一般用来输出处理结果

[root@svr7 ~]# awk -F: ‘BEGIN{print “User\tUID\tHome”}{print $1"\t"$3"\t"$6 }END{print “总计"NR"行” }’ /etc/passwd

[root@svr7 ~]# ifconfig eth0 | awk ‘/RX p/{print"eth0网卡接收流量是:" $5}’
eth0网卡接收流量是:495613
[root@svr7 ~]# ifconfig eth0 | awk ‘/TX p/{print"eth0网卡发送流量是:" KaTeX parse error: Expected 'EOF', got '}' at position 2: 5}̲' eth0网卡发送流量是:4…/{print"根分区的容量" $4}’
根分区的容量14G

查找user.txt文档中第六列包含i的行
[root@svr7 ~]# awk -F: ‘$6~/i/{print}’ /opt/user.txt
bin:.x:1:1:bin:/bin:/sbin/nologin
daemon:.x:2:2:daemon:/sbin:/sbin/nologin
输出UID小于等于10的行
[root@svr7 ~]# awk -F: ‘$3<=10{print}’ /etc/passwd

严格匹配第一列为bin的行
[root@svr7 ~]# awk -F: ‘$1==“bin”{print}’ /etc/passwd
输出第二行
[root@svr7 ~]# awk ‘NR==2{print}’ /opt/user.txt

假设我们有这样一个待处理的文件grade.txt,内容如下:
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
题目1:打印整个文件
[root@svr7 opt]# awk ‘{print}’ grade.txt
题目2:打印第一和第四个列
[root@svr7 opt]# awk ‘{print $1,$4}’ grade.txt
题目3:打印表头Name Belt,然后显示文档第一列和第四列
[root@svr7 opt]# awk ‘BEGIN{print “Name\t\tBrown”}{print $1"\t\t"$4}’ grade.txt
题目4:打印第四列包含Brown的行
[root@svr7 ~]# awk ‘$4~/Brown/{print}’ /opt/grade.txt

题目5:打印第三列包含48的行
[root@svr7 ~]# awk ‘$3~/48/{print}’ /opt/grade.txt
题目6:显示第三列是48的行
[root@svr7 ~]# awk ‘$3==“48”{print}’ /opt/grade.txt
题目7:显示第七列不超过40的行
[root@svr7 ~]# awk ‘$7<=“40”{print}’ /opt/grade.txt
题目8:打印第四列不是Brown-2的行
[root@svr7 ~]# awk ‘$4!=“Brown-2”{print}’ /opt/grade.txt

题目9:当第六列大于第七列时,显示:$6 大于 $7
[root@svr7 ~]# awk ‘$6>$7{print “$6>$7”}’ /opt/grade.txt
题目10:当第一列的第四个字符是a时,显示该行
[root@svr7 ~]# awk ‘$1~"^…a"{print}’ /opt/grade.txt

题目11:显示包含Yellow或Brown的行 (提示:$0表示所有列)
[root@svr7 ~]# awk ‘/Yellow|Brown/{print $0}’ /opt/grade.txt

sort
利用sort对提取结果排序
-n: 按数字升序排列
-k: 针对指定的列进行排序
-r: 反向排序

cpu负载
[root@svr7 ~]# uptime | awk ‘{print $NF}’
查看eth0网卡接收流量
[root@svr7 ~]# ifconfig eth0 | awk ‘/RX p/{print $5}’
查看内存剩余空间
[root@svr7 ~]# free -h | awk ‘/Mem/{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲' 查看根分区剩余空间 [ro…/{print $4}’

查看当前用户账号数量
[root@svr7 ~]# cat /etc/passwd |wc -l
[root@svr7 ~]# sed -n ‘$=’ /etc/passwd
[root@svr7 ~]# awk ‘END{print NR}’ /etc/passwd
查看当前登录的用户
[root@svr7 ~]# who | wc -l
查看当前进程数量
[root@svr7 ~]# ps aux | wc -l
查看当前已经安装的软件包
[root@svr7 ~]# rpm -qa | wc -l

清屏 clear
睡眠 sleep 单位为s

过滤帐户名失败的命令(登陆日志文件为/var/log/secure)
[root@svr5 ~]# awk ‘/Invalid user/{print $10}’ /var/log/secure
过滤密码失败的命令
[root@svr5 ~]# awk ‘/Failed password/{print $11}’ /var/log/secure

[root@svr7 ~]# awk -F: ‘NR==2{print}’ //输出第二行的内容

[root@svr7 ~]# awk -F[😕] ‘NR==1{print $9}’ /etc/passwd
bin //输出第一行的第9列的内容,[😕]跟或者有点相似,遇到:或者是/都算作一列

[root@svr7 ~]# awk ‘NR<=6&&NR>=4{print}’ /etc/passwd //输出第四行到六行的内容

[root@svr7 ~]# awk -F: ‘$1==“root”||$1==“bin”{print}’ /etc/passwd
第一列是root或者第一列是bin的行

[root@svr7 ~]# seq 20 | awk ‘$1%6==0’ 1-20个数字输出是6的倍数的行

[root@svr7 ~]# awk -F: ‘{if($7~/bash/){x++}}END{print x}’ /etc/passwd或者
[root@svr7 ~]# awk -F: ‘BEFIN{x=0}{if($7~/bash/){x++}}END{print x}’ /etc/passwd //查找系统中有多少人用了bash解释器–>单分支

[root@svr7 ~]# awk -F: ‘{if($7~/bash/){x++}else{y++}}END{print x,y}’ /etc/passwd或者
[root@svr7 ~]# awk -F: ‘BEDIN{x=0;y=0}{if($7~/bash/){x++}else{y++}}END{print x,y}’ /etc/passwd //if双分支–> 查找用bash的人与不用bash的人有多少个

[root@svr7 ~]# awk -F: ‘{if($7~/bash/){x++}else if($7~/nologin/){y++}else{z++}}END{print x,y,z}’ /etc/passwd
[root@svr7 ~]# awk -F: ‘BEGIN{x=0;y=0;z=0}{if($7~/bash/){x++}else if($7~/nologin/){y++}else{z++}}END{print x,y,z}’ /etc/passwd
if多分支查找多少人用bash,nologin,与其他解释器的人有多少个

[root@svr7 ~]# awk ‘{ip[$1]++}END{for(i in ip){print ip[i],i}}’ /var/log/httpd/access_log | sort -nr //查看多少人访问网站,分别是那些ip地址访问多少次,以降序的方式排列

[root@svr7 ~]# awk ‘{ip[$1]++}END{for(i in ip){print i,ip[i]}}’ /var/log/httpd/access_log | sort -nr -k 2 // -k是以定义其他列

[root@svr7 ~]# awk ‘/Failed password/{ip[$11]++}END{for(i in ip){print ip[i],i} }’ /var/log/secure | awk ‘$1>=3’ //查看大于等于3次登录失败的记录

[root@svr7 ~]# awk ‘/Failed p/&&$9!~/invalid/{ip[$11]++}END{for(i in ip){print ip[i],i} }’ /var/log/secure 查找输入密码失败的记录同时排除用户名输入错误的记录,避免筛选结果错乱

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值