linux笔记

Linux 系统笔记

笔记来源-B站尚硅谷视频+菜鸟教程+各种网页补充+本计算机截图
适合刚入门小白,主要内容为Linux下面常用命令,Shell编程内容。

linux简介

应用领域

  1. 服务器领域-最常见,开源免费,稳定高效
  2. 嵌入式领域
  3. 个人桌面领域 -薄弱环节,比不上Mac OS 及windows,其实ubuntu还不错了。

linux内核与发行版

  • 一个完整的 Linux发行版包括了内核 与一些其他与文件相关的操作,用户管理系统,和软件包管理器等一系列软件。
    在这里插入图片描述

  • 可用uname -a (英文全拼:unix name)命令显示系统信息

在这里插入图片描述

Linux 文件系统

目录结构

  • 在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构,根节点使用/表示。

  • 使用 ls 查看根目录

  • 在这里插入图片描述

  • 根目录示意图
    在这里插入图片描述

目录作用
/bin存放着linux这个目录存放着最经常使用的命令
/sbinSuperuser Binaries ,这里存放的是系统管理员使用的系统管理程序
/bin /sbin /usr/bin /usr/sbin 下面命令在任意路径下面都可以用,对于其他的可执行文件如果想要在任意路径下面都可用,需要写入$PATH中
/boot启动 Linux 时使用的一些核心文件, 最初给系统分区时候,必须创建该分区
/dev该目录下存放的是 Linux 的外部设备,比如磁盘,Linux将硬件映射为文件来使用
/media类windows的其他设备,例如U盘、光驱等等,识别后linux会把设备放到这个目录下
/etc目录用来存放所有的系统管理所需要的配置文件
/home在 Linux 中,每个用户都有一个自己的目录,相当于Windows中的User
/liblib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库
/root该目录为系统管理员,也称作超级权限者的用户主目录
/usrusr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户安装的应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录
/var经常被修改的目录放在这个目录下。包括各种日志文件。
/mnt临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了
/tmp用来存放一些临时文件的

文件操作命令

  • 绝对路径:从根目录/出发的路径

  • 相对路径:相对路径不是从根目录 / 开始写起,而是从当前所在的工作目录开始写起。其中用 . 表示当前目录和用 … 表示父目录。linux对于每个文件夹都隐藏了两个特殊的目录
    在这里插入图片描述

  • 常见命令

    • pwd
      • 打印当前目录的绝对路径
    • cd
      • 切换当前工作目录,可使用绝对路径和相对路径。
      • cd / 返回根目录; cd ~ 返回home目录; cd .. 返回上层目录。
    • ls [选项] [目录地址]
      • 显示当前目录中的文件及文件夹
      • 其中选项 -a 表示显示隐藏,-l 为列表显示,常用 ls -la 简写ll
    • mkdir [新建目录名]
      • 创建单级目录 mkdir aaa/bbb/ ccc 注意aaa/bbb 需要存在。
      • 创建多级目录 mkdir -p 目录名称
    • rm [选项] [文件或目录名称]
      • 删除文件或者文件夹,需要文件夹为空
      • -r 递归删除,可以删除非空文件夹 -f 表示强制删除不需要提示
    • touch [filename]
      • 创建一个空文件,touch file1 file2 可以同时创建很多文件
    • cp [ src] [des]
      • 完成源文件向目的文件/目录 或者 源目录向目的目录的复制(需要-r)
      • -r 递归复制,使用后可以复制源目录
      • cp -r src_dir des_dir ----->将src_dir整个文件夹复制到des文件夹下, 生成 det_dir/src_dir
      • cp -r src_dir/* des_dir ------>将src_dir下的所有内容复制到des文件下
    • mv [ src] [des]
      • 移动文件 mv a.txt b/
      • 重命名文件 mv a.txt b.txt

    查看文件内容命令

    • cat [file]

      • 只读方式查看一个文件内容,文件多页时会一下子显示完,导致前面的看不到
      • 常用 cat - n a.txt|more,其中-n显示行号,|为管道符将前面的结果送到后面,more分页显示
    • more [file]

      • more以后可以使用空格换页,回车换行,Ctrl+F下滚屏,Ctrl+B上滚屏,Ctrl+C 停止
    • less [file]

      • 常用来查看日志等大文件,不是一次读入所有内容,根据显示需要加载内容。
    • 输出重定向符号> 删除重建方式 ,>>追加方式

      • ls -la> a.txt
      • echo “export PYTHONPATH= newPythonPath:$PYTHONPATH” >> ~/.bashrc 上述echo打印字符串重定向追加到bashrc文件中。 字符串可以永久增加newPythonPath到PYTHONPATH中。
    • head [选项] [filename]

      • 默认显示文件的头10行, 可以使用-n 指定
      • head -n 1 data.json 显示data.json 第一行内容
    • tail [选项] [filename]

      • 默认显示文件的尾10行, 可以使用-n 指定
      • tail -f filename 可以实时显示文件更新
    • ln -s src dst

      • 软链接,类似于window中的快捷方式。
      • 删除软链接直接就 rm 软链接名称
      • cd 到软链接dst文件夹会跳到src的文件夹

    • find

      • find [搜索路径] -name filename 按照指定完整文件名称查找

      • find [搜索路径] -user username 按照用户名查找

      • find 范围 -size +20M(表示大于20M) (-20k小于20k的文件,等于直接输入数字)

    • grep “regex”

      • 实现过滤查找,常与管道符|结合 ls -la | grep “.txt” 查找列表包含以.txt内容
      • -n 显示行号 -i 忽略大小写

    压缩与解压缩

    • gzip/guzip file
    • zip/uzip file
    • tar [选项] [file/dir]
      • tar -zcvf a.tar.gz a1.txt a2.txt — 将 a1.txt a2.txt打包压缩为a.tar.gz
      • tar -zxvf a.tar.gz -C 解压的目录 —将a.tar.gz 解压到指定目录
      • 选项 中 -c 产生打包文件 -v 显示详细信息 -f 指定压缩后的文件名称 -z 打包时候压缩/解压 -x 解包t

用户管理+组管理

  • Linux 系统是一个多用户多任务的操作系统(典型的可以多个用户同时使用SSH访问一台设备)
  • 用户的角色是通过用户ID(UID)和组ID(GID)识别的,一个UID是唯一标识一个系统用户的账号,每个用户都可以有自己的home目录
  • 组常用来管理权限,比如指定develper组拥有对某些文件读写权限,将用户加入developer后组后, 该用户拥有对这些文件的读写权限
  • 用户与组对应关系:每个用户至少属于一个组,一个组包括任意数量用户
  • 在/etc 目录中四个文件与用户和组管理相关,其中 /etc/passwd - 用户相关信息, /etc/shadow 用户密码 ,/etc/group-组信息,/etc/gshadow- 密码

用户管理

  • 查看所有用户-- 在 /etc/passwd 中查看,每一行为一个用户,包括7个字段,字段间使用:分开,字段一次代表用户名:密码:UID:GID:用户描述:home dir:使用的shell类型

  • 添加用户

    • sudo useradd -m username #ubuntu中使用-m后才能产生该用户的家目录,同时默认创建一个同名的组。
    • sudo useradd -g groupid username # 创建用户时指定组
  • 重置密码:passwd 用户名

  • 删除用户:userdel 用户名

  • 查看当前用户:whoami

  • 查询任意用户:id 用户名 返回UID,GID,group

  • 修改用户: usermod [选项] 用户名

    • 其中 -s 用户使用的shell , -g 组编号
cat /etc/passwd
  #root:x:0:0:root:/root:/bin/bash
  #daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
  #bin:x:2:2:bin:/bin:/usr/sbin/nologin
  #sys:x:3:3:sys:/dev:/usr/sbin/nologin
  #sync:x:4:65534:sync:/bin:/bin/sync
  #games:x:5:60:games:/usr/games:/usr/sbin/nologin
  #...
  #ws:x:1000:1000:ws,,,:/home/ws:/bin/bash
  #ajia:x:1001:1000::/home/ajia:/bin/sh
  ########################
  #用户名:密码:id号:group号:用户描述:home dir:使用的shell类型
  # root id=0, gid=0  超级用户
  # bin,sys  程序用户,编号1~499:这个范围是保留给系统用户使用的UID
  # ws,ajia  普通账户UID,编号500~65535
  sudo useradd -m tom # 添加用户tom
  id tom 
  #用户id=1001(tom) 组id=1002(tom) 组=1002(tom) 默认创建一个同名的组
  sudo passwd tom # 为tom设置密码
  whoami #ws
  id ws #用户id=1000(ws) 组id=1000(ws) 组=1000(ws)
  sudo usermod -g 1000 tom #将tom 加入 组1000中
  id tom #用户id=1001(tom) 组id=1000(ws) 组=1000(ws)
  sudo userdel tom #删除tom
  id tom # id: “tom”:无此用户

组管理

  • 查看用户所在的所有组 groups

  • 添加组 groupadd [-g GID] 组名

  • 删除组 groupdel 组名

  • 更改组 groupmod [-g GID -n groupname] 组名

    groups ws #查看ws所在的所有组
    #ws : ws adm cdrom sudo dip plugdev lpadmin lxd sambashare
    sudo groupadd -g 1200 lol # 添加组lol,设置GID=1200
    cat /etc/group #配置文件/etc/group中查看组添加情况
    # lol:x:1200:
    sudo usermod -a -G lol  ws 
    # 使用usermod 配合参数-a -G 组名,将ws加入lol组,而不离开自己原先组
    groups ws 
    # ws : ws adm cdrom sudo dip plugdev lpadmin lxd sambashare lol
    sudo groupdel lol #删除组 lol
    groups ws
    #ws : ws adm cdrom sudo dip plugdev lpadmin lxd sambashare
    

文件权限管理

文件和目录权限 对于每个文件或者目录都有三种权限需要设置,文件所有者权限,所在组权限,其他组权限
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wZAaY3IB-1640445769574)(C:\Users\wspra\AppData\Roaming\Typora\typora-user-images\image-20211225220657357.png)]
文件权限修改:

​ rwx作用于文件,r表示文件可读,w表示文件可写,x表示文件可执行;

​ rwx作用与目录, r可以使用ls查看,w表示对目录内内容创建删除及重命名该目录,x表示可cd

  • chown 用户名 文件名 #change owner 修改文件的所有者

  • chgrp 组名 文件名 #改变了组但是没有更改文件所有者

  • 修改具体rwx权限 chmod命令

    • 使用运算符配合各种组的简称来更改权限

      简称 u(user-所有者)、 g(group-组)、o(other-其他组) 、a( all)

      = 表示直接赋予 chmod u=rwx,g=rw,o=r 文件名

      -表示减少一个权限 g-r

      +表示添加一种权限 g+r

    • 使用数字变更权限(推荐)其中r=4, w=2,x=1

      chmod u=rwx,g=rx,o=x a.sh 相当于 chmod 751 a.sh

ws@ws-System-Product-Name:~/Public$ ls -l
总用量 8
-rw-rw-r-- 1 ws ws    0 1225 15:13 a.txt
-rw-rw-r-- 1 ws ws    0 1225 15:13 b.txt
-rw-rw-r-- 1 ws ws    0 1225 15:21 c.txt
-rw-rw-r-- 1 ws ws  117 1225 16:53 d.tar.gz
drwxrwxr-x 2 ws ws 4096 1225 16:56 ws_pic
ws@ws-System-Product-Name:~/Public$ sudo chown tom a.txt #将a.txt让tom拥有
#-rw-rw-r--  1 tom ws    0 12月 25 15:13 a.txt
ws@ws-System-Product-Name:~/Public$ sudo chgrp lol a.txt #将a.txt让组lol拥有
#-rw-rw-r--  1 tom lol    0 12月 25 15:13 a.txt
ws@ws-System-Product-Name:~/Public$ sudo chmod u=rwx,g=rw a.txt 
#a.txt 受用者权限为 rwx,所在组权限rw,其他为默认自读权限
#-rwxrw-r--  1 tom lol    0 12月 25 15:13 a.txt*
ws@ws-System-Product-Name:~/Public$ sudo chmod 764 b.txt 
#-rwxrw-r--  1 ws  ws     0 12月 25 15:13 b.txt*

资源管理

磁盘管理

  • 总体磁盘使用查询: df -h

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y1gKnVM6-1640445769575)(C:\Users\wspra\AppData\Roaming\Typora\typora-user-images\image-20211225225649720.png)]

  • du [选项] [目录名称] --disk usage命令用于显示目录或文件的大小。
    • -h 显示计量单位,以K,M,G为单位,提高信息的可读性
    • -a 包含所有文件
    • -s 只显示包含汇总信息
    • –max-depth=<目录层数> 超过指定层数的目录后,予以忽略
      在这里插入图片描述
  • 常用命令
    • 查询某目录下面文件个数:ls -l | grep “^-”| wc -l # (wc 查询字节、word、line 个数)
    • 递归查询某目录下面文件个数:ls -lR | grep “^-”| wc -l
    • 查询某目录下面目录个数:ls -l | grep “^d”| wc -l
    • 递归查询某目录下面目录个数:ls -lR | grep “^d”| wc -l

进程管理

  • 进程概念
    在这里插入图片描述

  • 查看进程命令

    ps -aux: all 进程, user模式、x显示后台进程 ,配合 |grep 使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eiakIVa4-1640445769578)(C:\Users\wspra\Desktop\jincheng .png)]
​ ps -ef|grep xxx

  • 终止进程:

    kill -9 进程ID 先查询进程后终止。

Shell编程

Shell概念

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

​ 例子使用Shell 开启深度学习模型训练:

#!/bin/sh
CUDA_VISIBLE_DEVICES=0,1,2,3\
python examples/mgmt_source_pretrain.py \
-ds market1501 -dt dukemtmc\
-a resnet50_AB_mult_parts\
--margin 0.0 --num-instances 4 \
-b 64 -j 4 --warmup-step 10 \
--lr 0.00035 --milestones 40 70 \
--iters 200 --epochs 80 --eval-step 5 \
--logs-dir logs/market1501TOdukemtmc/mgmt_pretrain \
--data-dir /home/ws/submit/data/reid_dataset/ 
  • 脚本以#!/bin/bash 表示使用bash来解释
  • 长命令可通过加 \ 的方式来进行换行拆分,\后面不能有空格,便于阅读。比如上面python 命令参数过长
  • 单行注释使用#,多行注释使用 :<< ! 注释内容 !
  • 如果该文件有执行权限,可以 xxx/xx.sh执行;若无可以 sh xx.sh执行

Shell 变量

​ Shell 变量就起作用域来讲,可分为局部变量(函数内有效),全局变量(shell进程有效,我们开启的一个终端就是一个Shell进程),环境变量 (当前Shell进程进行及当前进程的子进程有效,如果我们在shell终端内,执行 sh xxx/xxx.sh,相当了开启了shell子进程),具体可见 Shell变量的作用域


  • Shell 普通变量定义 变量名=值 ,定义只读变量 readonly 变量名=值,注意 "="两端没有空格

  • 使用Shell变量 $变量名 或者 ${变量名}

  • 撤销变量: unset 变量名,其中只读变量不可unset

  • 有些系统设置好的变量,我们直接可使用,比如HOME、PWD、SHELL、USER等,可以使用set查看所有系统设置好的变量,建议使用set|more 分页查看。

  • Shell 支持一维数组,数组名=(值1 值2 … 值n), 使用时 ${数组名[下标]}

#!/bin/sh
echo "system variable USER=${USER}" 
echo "system variable SHELL= $SHELL"
echo "system variable PATH= $PATH"
VALUE_B=2
echo "VALUE_B=${VALUE_B}"
unset VALUE_B
echo "VALUE_B=${VALUE_B}"
###########output###########
system variable USER=ws
system variable SHELL= /bin/bash
system variable PATH= /home/ws/.vscode-server/bin/ccbaa2d27e38e5afa3e5c21c1c7bef4657064247/bin:/home/ws/anaconda3/bin:/home/ws/anaconda3/condabin:/home/ws/.vscode-server/bin/ccbaa2d27e38e5afa3e5c21c1c7bef4657064247/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/cuda-11.1/bin:/usr/local/cuda-11.1/bin
VALUE_B=2
VALUE_B=
###############################

export 定义环境变量,方便子线程使用。 在 shell 中执行程序时,shell 会提供一组环境变量。export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。export [变量名称]=[变量设置值], ok以一个例子来说,我们需要执行一个a.py 文件,但是该文件需要一些python包依赖,执行前我们需要将这些包导入到PYTHONPATH 系统设置的变量中,这样执行a.py 文件,我们可以找到相应包了

 export PYTHONPATH=$PYTHONPATH:/home/ws
 #PYTHONPATH变量值设为原来PYTHONPATH值($PYTHONPATH)+新加值(/home/ws),这是使用:分割相当于win7中的";", 提醒一点题外话,注意$PYTHONPATH:/home/ws 与 /home/ws:$PYTHONPATH的顺序,如果两个路径有相同的python package话,sys.path 是按顺序检查,注意别使用错package了。
 python a.py

未使用eport前:

在这里插入图片描述
使用eport后:

在这里插入图片描述
如果使用sh xx/a.sh命令启动shell脚本,shell 脚本中执行了python b.py, 其中shell脚本 a.sh及python文件b.py 中使用到的相当路径,都是相当于执行sh xx/a.sh命令的路径


位置参数变量:我们在执行Shell脚本时候,可以同时传入一些参数,位置参数变量就是为了获取命令行中的参数。

  • $n 其中 n位数字,$0 代表脚本本身,$1-$n表示脚本后续传入参数,其中大于10时候使用${10}表示第10个位置参数。
  • $* 表示将表示命令行中的所有位置参数,不过看成一个整体
  • $@ 表示将命令行中的所有位置参数 ,不过区分对待
  • $# 表示所有位置参数的个数
#!bash/bin
echo "$1 $2"
echo "$*"
echo "$@"
echo "number of parameters is $#"
###############output#############
#执行脚本时候输入位置参数 10 20
10 20
10 20
10 20
number of parameters is 2

Shell表达式

​ Shell中支持算术运算,算数运算符有加减乘除取余: + , − , ∗ , / , % +,-,*,/,\% +,,,/,%

  • $[expression] , $[4+5], 推荐
  • $((expression)), $((4+5))
  • `expr 4 + 5 ` , 注意使用的着重号,不是单引号。而且运算符和操作数间有空格

关系运算符还是常用的6组等于、不等于,大于,大于等于,小于,小于等于:-eq, -ne, -gt, -ge,-lt,-le

布尔运算符:使用[ ], 对于与和或运算符的前后表达式都执行,这点与||和&&不同。
在这里插入图片描述
逻辑运算符:!(取反),&&(与运算),||(或运算)。使用[[ ]], 注意与或运算同C一样,如果可以根据前面表达式推算出结果,后面表达式便不执行。

#!bash/bin
A=$[3+2]
B=$[3+3]
echo "A=${A},B=${B}"

if [ $A -lt $B ]
then
        echo "A < B"
elif [ $A -eq $B ]
then
        echo "A = B"
else
        echo "A > B"
fi

if [ $A -lt 6 -o $B -lt 6 ]
then
        echo "A,B 至少1个小于5"
fi

echo "######################"

if [[ $A -lt 6 || $B -lt 6 ]]
then
        echo "A,B 至少1个小于5"
fi

C=$(ls|grep ".txt")
echo "$C"

#############output##############
A=5,B=6
A < B
A,B 至少1个小于5
######################
A,B 至少1个小于5
a.txt
b.txt
c.txt

$(linux 命令),可以将Linux命令结果返回, 如上面C=$(ls|grep “.txt”)

Shell 控制语句

if
if [ 条件判断式 ]
then
	执行代码
fi

if [ 条件判断式1 ]
then
	执行代码1
elif [ 条件判断式1 ]
then
	执行代码2
else
	执行代码3
fi
#注意表达式两端空格	
case
case 变量 in
value1)
	执行代码1
;;
value2)
	执行代码2
;;
*)  
	执行default
;;
esac
for
for 变量 in value1 value2 value1
do
	代码
done
while
while [ 条件表达式 ]
do
    代码
done

Shell function

  • 函数定义,其中关键字function可有可无,没有形参,直接在函数体使用位置参数(或函数体使用某个变量,在调用时候需要输入相同变量名)
  • 函数调用 func 参数1 参数2
  • 如果函数有返回值,使用$?来临时表示,其中$?最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
  • 可以直接调用函数,将返回值作为if判断条件表达式,其中0为 True,非0为False,这点跟其他语言不同
function func(){
	代码
	[return xx]
}
#!/bin/bash
function getSum(){
       SUM=$[$1+$2]
       echo "SUM is ${SUM}"
       return ${SUM}
}
getSum 2 3
MYSUM=$?
echo "MYSUM is ${MYSUM}"

function demoFun1(){
   return 0
}
function demoFun2(){
   return 12
}

if demoFun1
then
   echo true
else
   echo false
fi

if demoFun2
then
   echo true
else
   echo false
fi
##################output##############
SUM is 5
MYSUM is 5
true
false

linux分区挂载卸载

挂载

​ 将物理硬盘的多个分区挂载在文件目录上面,通过访问这个目录其实就是访问这个磁盘上的内容
​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S5pkU4Zp-1640445769582)(C:\Users\wspra\Desktop\挂载.png)]

  • 查看挂载情况 lsblk -f
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bslG01Lh-1640445769583)(C:\Users\wspra\AppData\Roaming\Typora\typora-user-images\image-20211225223549709.png)]
  • 文件分区标号含义:
    • sda1 - sd 表示硬盘的类性 ,a 表示第几块物理硬盘 , 表示该物理硬盘上的第几号分区 (sda为我的机械硬盘)
    • nvme0n1 为我固态硬盘

如何挂载- 未测试

存储介质选择—》硬盘分区操作;创建分区来容纳文件系统;创建分区,这个分区可以是整个硬盘也可以是部分硬盘----》创建文件系统(我们在存储数据之前,你必须使用文件系统对其分区进行格式化)----》把它挂载到虚拟目录----》写入配置文件/etc/fstab

1. 添加硬盘以后使用 lsblk (-f) 就可以看到有一个未分区的硬盘
2.  创建分区: fdisk     /dev/磁盘名称
3. 格式化 mkfs -t ext4   /dev/分区
4. 挂载 mount /dev/sdb1 mount/(文件系统某目录) 取消挂载是umount 该文件目录/ 磁盘分区
5. 永久挂载 修改配置文件/etc/fstab,完成后 执行mount -a

其他命令

  • date

    • 显示标准的年月日时分秒

    • date “+%Y-%m-%d %H:%M:%S” #使用格式匹配显示自己想要的格式

  • cal

    • 显示日历
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值