shell常用命令

=============================================================================
1.  cat /etc/shells 
    #查看shell支持情况
    #/bin/sh Linux里面常用的shell,指向/bin/bash
    #/bin/bash Linux里面常用的shell,也是默认使用的shell
    #Linux系统中的主流shell是bash
=============================================================================
2.  echo $SHELL  或者 echo $shell 或者 grep root /etc/passwd
    #查看Linux的默认shell
=============================================================================
3.  bash --version
    #查看bash版本
    #如果版本太低,可通过yum -y update bash
    #rpm -qa bash
    #CentOS和Red Hat Linux下默认的shell均为bash。因此,在写shell脚本的时候,
    #脚本的开头即使不加“#!/bin/bash”,它也会交给bash解释。建议读者养成好的编程
    #习惯,不管什么脚本最好都加上相应的开头解释器语言标识,养成shell编程规范
=============================================================================
4.  bash script-name 或者 sh script-name
    #shell脚本的执行方法一
    #这是当脚本文件本身没有可执行权限时时使用的方法,或者脚本文件开头没有指定
    #解释器时需要使用的方法。推荐使用。
=============================================================================
5.  path/script-name 或者 ./script-name 
    #shell脚本的执行方法二
    #path/script-name(指绝对路径) ./script-name(相对路径,在当前目录下执行)
    #指在当前路径下执行脚本(脚本需要有执行权限),需要将脚本的文件的权限先改
    #为可执行(即文件权限性加x位),具体方法为chmod +x script-name。然后通过
    #脚本绝对路径或相对路径就可以直接执行脚本了。
=============================================================================
6. shell
#shell是一个命令解释器
#它的作用是解释执行用户输入的命令及程序等,用户输入一条命令,shell就解释执行一条。
#这种从键盘一输入命令,就可以立即得到回应的对话方式,被称之为交互的方式。
#常用操作系统默认的shell,通过命令查看操作系统的默认shell:echo $SHELL
#Linux下默认的Shell是Bourne Again Shell(bash)
=============================================================================
7. shell脚本
#当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序就被称为shell脚本。
#如果在shell脚本里内置了很多条命令,语句及循环控制,然后将这些命令一次性执行完毕,这种通过文件执行
#脚本的方式称为非交互的方式。
#用户可以在shell脚本中敲入一系列的命令及命令语句组合。这些命令、变量和流程控制
=============================================================================
8. 编译型语言与解释型语言
#编译型语言
#(1)执行前要编译成二进制程序,例如典型的C语言的编译过程.configure make make install
#(2)编译完后执行就不需要执行环境了
#(3)执行速度理论上要快
#(4)常见的的有C C++
#(5)相当于到饭店吃饭,别人已经提前做好了
#(6)比较适合打的项目程序。
#解释型语言
#(1)常见的有shell php python perl ruby
#(2)不需要编译
#(3)执行的时候有一个解释器解释执行
#(4)依赖程序执行环境
#(5)相当于到饭店点菜现做,洗菜,切菜,炒菜等等现做。
#(6)理论上速度要慢一些,但是现在的计算机硬件在处理非极端的程序其实在速度上是差不多的,感觉不出来。
#擅长处理和系统底层相关的业务,例如文件对象拷贝以及处理。Linux系统内部的很多应用(有的是应用的一部分)都是使用shell脚本
#语言开发的,因为有1000多个Linux系统命令为它做支撑,特别是Linux正则表达式及三剑客grep、awk、sed等命令。
#使用shell更符合Linux运维简单、易用、高效的三大基本原则。
#PHP语言的优势在于小型网站系统的开发;
#Python语言的优势在于开发复杂的运维工具软件、Web界面的管理工具和Web业务的开发(例如:CMDB自动化运维平台、跳板机、批量管理
#软件Saltstack、云计算OPenStack软件)等。
#Python可以替代shell,但是成本高,Python相对来说还是比shell更麻烦。
==============================================================================
9. shell脚本语言的种类
#shell脚本语言是弱类型语言(无需定义变量的类型就可以使用)
#在Unix/Linux中主要有两大类shell,一类是Bourne shell,另一类是C shell
#cat /etc/redhat-release查看Linux版本
#cat /etc/shells查看支持的shell
#/bin/sh -> bash
#早期的bash与sh稍有不同,bash还包含了csh和ksh的特色,但大多数脚本都可以不加修改地在sh上运行。
#如果发现用sh不行的时候,你就用bash。不过这种区别非常少。在写脚本的时候看你的习惯来用。
#bash -version查看bash的版本
#env x='() {:;}; echo be careful' bash -c "echo this is a test" 检测bash是否存在漏洞
#如果返回be careful就要立即打上补丁了
#升级方法为yum -y update bash 升级后查看一下rpm -qa bash
#执行shell脚本的方法一 /bin/sh oldboy.sh或者/bin/bash oldboy.sh或者sh oldboy.sh或者bash oldboy.sh 直接加解释器,解释器可以不用加全路径,环境变量PATH里面已经包括了,
#这是当脚本文件本身没有可执行权限(即文件权限属性x位为-号),bash本质上是一个可执行程序,相当于我们执行了bash程序,然后把xx.sh作为argv[1]传给bash
#时常使用的方法,或者脚本文件开头没有指定解释器时需要使用的方法。这也是老男孩推荐使用的方法。
#执行shell脚本的方法二 需要先给脚本添加执行权限 chmod +x oldgirl.sh 然后./oldgirl.sh或者全路径/data/oldgirl.sh执行
#执行shell脚本的方法三  source oldgirl.sh 或者 . oldgirl.sh 这种方法shell脚本文件不需要有执行权限,source这个命令是用来执行脚本程序的。
#执行shell脚本的方法四  sh<oldgirl.sh  cat oldgirl.sh|bash 脚本文件不需要执行权限
==============================================================================
10. shell规范
#(1)shell脚本的第一行是指定脚本解释器,通常为#!/bin/bash 或者 #!/bin/sh
#(2)shell脚本的开头会加版本、版权等信息
#(3)在shell脚本中尽量不用中文
#(4)shell脚本的命名应以.sh为扩展名
#(5)shell脚本应存放在固定的路径下
#成对的符号应尽量一次性写出来,然后退格在符号里面增加内容,以防止遗漏。
#这些成对的符号包括:{} [] '' `` ""
#[]内侧两边必须要有空格,写成[ oldboy ],[[ oldboy ]]这是语法规则。
#对于流程控制语句,应一次性将格式写完,再添加内容
#比如,一次性完成if语句的格式,应为:
#if 条件内容
#  then (注意:这个地方两个空格)
#    内容  (注意:这个地方四个空格)
#fi
#一次性完成for循环语句的格式,应为:
#for 
#do 
#    内容   (注意:这个地方四个空格)
#done
#while和until,case等语句也是一样
#通过缩进让代码更易读
#对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格
===============================================================================
11. shell变量
#变量名(变量)
#变量的值
#=赋值.
#oldboy="I am oldboy" 变量定义并赋值,变量的内容一般要加双引号,以防止出错,特别是当值的内容之间有空格时。
#弱类型语言不需要定义变量的类型,当然,如果需要指定shell变量的类型,也可以使用declare显示定义变量的类型。
#但在一般的情况下没有这个需求,shell开发者在开发脚本时需要自行注意shell脚本中变量的类型。
#echo $oldboy 输出变量
#变量的赋值方式为:先写变量名称,紧接着是“=”这个符号,最后是值,中间无任何空格,
#变量可分为两类:环境变量(全局变量)和普通变量(局部变量)
#环境变量也可称为全局变量,可以在创建它们的shell及其派生出来的任意子进程shell中使用,环境变量又可以分为自定义环境变量
#和bash内置的环境变量
#普通变量可以称为局部变量,只能在创建它们的shell函数或shell脚本中使用,普通变量一般由开发者在开发脚本程序时创建。
#简单地说,变量就是用一个固定的字符串(也可能是字符、数字等的组合)代替更多、更复杂的内容,该内容里可能还会包含变量、路径、
#字符串等其他的内容。
#变量是暂时存储数据的地方及标记数据,所存储的数据存在于内存空间中,通过正确地调用内存空间中变量的名字就可以取出与变量对应的数据。
#使用变量的最大好处就是是程序开发方便。
#变量的赋值方式为:先写变量名称,紧接着是“=”这个字符,最后是值,中间无任何空格,通过echo命令加上$oldboy即可输出oldboy变量的值,变量的
#内容一般要加双引号,以防止出错,特别是当值里的内容之间有空格时。
#默认情况下,在bash Shell中是不会区分变量类型的,例如:常见的变量类型为整型数、字符串、小数等。这和其他强类型语言(例如:Java/C语言)
#是有区别的,当然,如果需要指定Shell变量的类型,也可以使用declare显示定义变量的类型,但是在一般情况下没有这个需求,Shell开发者在开发
#脚本时需要自行注意Shell脚本中变量的类型。

===============================================================================
12.环境变量
#变量可分为两类:环境变量(全局变量)和普通变量(局部变量)
#环境变量也可以称为全局变量,可以在创建它们的shell及其派生出来的任意子进程shell中使用,环境变量又可以分为自定义环境变量和bash内置的环境变量
#普通变量也可称为局部变量,只能在创建它们的shell函数或shell脚本中使用。普通变量一般由开发者在开发脚本程序时创建。
#环境变量用export定义
#export PATH="/application/mysql/bin:$PATH"在命令行中定义的话,只能临时保存,要想永久生效需把这条命令添加到
#文件/etc/profile中,source /etc/profile即时生效
#export LANG=en
#echo $USER  
#echo $HOME
#echo $SHELL
#echo $UID  等等这些都是系统内置的环境变量
#env查看所有的环境变量,不包括局部变量
#env|tail显示后10行
#env|head显示前10行
#set输出所有的变量,包括全局变量和局部变量
#set -o 显示bash SHELL的所有参数配置信息
#declare输出所有的变量、函数、整数和已经导出的变量
#环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,
#因此,如果希望永久保存环境变量,可在用户家目录下的.bash_profile或.bashrc(非用户登入模式
#特有,例如远程SSH)文件中,或者全局配置/etc/bashrc(非用户登入特有,例如远程SSH)或/etc/profile中
#定义。在将环境变量放入上述的文件中后,每次用户登入时这些变量都将被初始化。
#按照系统规范,所有的环境变量的名字均采用大写形式。在将环境变量应用于用户进程程序之前,都应
#该用export命令导出定义,例如export OLDGIRL=1
#有些环境变量,比如HOME、PATH、SHELL、UID、USER等,在用户登入之前就已经被/bin/login程序设置好了
#通常环境变量被定义并保存在用户家目录下的.bash_profile文件或者全局的配置文件/etc/profile中
PATH:全局PATH路径,命令搜索路径。一个由冒号分隔的目录列表,shell用它来搜索命令,默认路径由系统来决定,
并且由安装bash的管理员来设置。


=================================================================================
13.自定义环境变量
#使用export命令,其实,除了export命令,带-x选项的declare内置命令也可以完成同样的功能。
#三种设置环境变量的方法
#(1)export 变量名=value 这种方法用的最多
#(2)变量名=value;export 变量名
#(3)declare -x 变量名=value
范例:
export NAME=oldboy
declare -x NAME=oldboy
NAME=oldboy; export NAME

#用户的变量永久生效的配置方法
#对于用户的环境变量设置,比较常见的是用户家目录下的.bashrc和.bash_profile
#建议在用户家目录下配置.bashrc 例如/home/book/.bashrc  /root/.bashrc  优先推荐这种
#/home/book/.bash_profile  /home/oldboy/.bash_profile
#全局环境变量的配置方法
#/etc/profile
#/etc/bashrc  优先推荐这种
#/etc/profile.d
#若要在登入后初始化或显示加载内容,则把脚本文件放在/etc/profile.d/下即可(无须加执行权限)
#设置登入提示的两种方式
#方式一:在文件/etc/motd里面增加提示的字符串 
#方式二:在文件夹/etc/profile.d下面增加脚本 例如
#打印环境变量
#echo $HOME
#printf "$HOME\n" 一般不用,复杂
#消除本地变量和环境变量
#unset USER 注意:没有$符号  
#例如a=1 
#echo $a 
#unset a
#echo $a
#局部(普通)变量定义及赋值的经验小结
#常规普通变量定义:
#(1)若变量的内容为连续的数字或字符串,赋值时,变量内容两边可以不加引号,例如a=123。
#(2)变量的内容很多时,如果有空格且希望解析内容中的变量,就加双引号,例如a="/etc/rc.local $USER",
#      此时输出变量会对内容中的$USER进行解析然后再输出。
#(3)
====================================================================================
14. $n
#sh p.sh {a..z}
#$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0是表示脚本的文件名;如果n大于9,
#则用大括号括起来,例如${10},接的参数以空格隔开
#在shell中存在一些特殊且重要的变量,例如:$0、$1、$#,我们称之为特殊位置参数变量。要从
#命令行、函数或脚本执行等处传递参数时,就需要在shell脚本中使用位置参数变量。
#$1的实际使用
#/etc/init.d/sshd start   参数start传入$1中
#189 case "$1" in
#190         start)
#191                 rh_status_q && exit 0
#192                 start
#193                 ;;
#/etc/init.d/rpcbind start   参数start传入$1中
#76 case "$1" in
#77   start)
#78         start
#79         RETVAL=$?
#80         ;;
#81   stop)
#82         stop
#83         RETVAL=$?
#84         ;;
#85   status)
#86         status $prog
#87         RETVAL=$?
#88         ;;
#89   restart | reload| force-reload)
#90         stop
#91         start
#92         RETVAL=$?
#93         ;;
#94   condrestart | try-restart)
#95         if [ -f /var/lock/subsys/$prog ]; then
#96                 stop
#97                 start -w
#98                 RETVAL=$?
#99         fi
#100         ;;
#101   *)
#$0 获取当前执行的shell脚本的文件名,如果执行脚本包含了路径,那么输出就包括脚本路径。
#cat a.sh 
#echo $0
#bash a.sh
#a.sh
#bash /data/a.sh   执行脚本包含了路径
#/data/a.sh        那么输出就包括脚本路径
#企业应用
#echo $"Usage: $0 {start|stop|restart|reload|force-reload|condrestart|try-restart|status}"
#Usage: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status} 
#$#获取当前执行的shell脚本后面接的参数的总个数
#cat a.sh 
#echo $0
#echo $#
#sh a.sh 1 2 3 4 是看a.sh后面接的参数的总个数,现在接的是4个,所示输出4
#a.sh
#4
================================================================================================
15.  函数
#使用shell函数的优势:
#(1)把相同的程序段定义成函数,可以减少整个程序的代码量,提升开发效率
#(2)增加程序的可读性、易读性、提升管理效率。
#(3)可以实现程序功能模块化,使得程序具备通用性(可移植性)。
#对于shell来说,Linux系统里的近2000个命令可以说都是shell的函数。
#其标准写法:
#写法一:   推荐写法
#function 函数名() {       函数名()前后都有一个空格
#    指令集...              四个空格
#    return n               四个空格
#}
#写法二:   不推荐
#function 函数名 {         函数名()前后都有一个空格
#    指令集...              四个空格
#    return n               四个空格
#}
#写法三:   推荐写法       function可以省略
#函数名() {                函数名()前后都有一个空格
#    指令集...              四个空格
#    return n               四个空格
#}
================================================================================================
16. Shell调用脚本的模式说明
#在主脚本中嵌套脚本的方式有很多,常见的为fork、exec、source三种模式。

17. #!/bin/bash
#脚本第一行一般都是:#!/bin/bash ;指定使用bash执行该脚本
#在ubuntu上面默认使用的解释器sh其实不是bash,而是dash。dash是ubuntu中默认使用的脚本解释器
#脚本中的注释使用#,#开头的行是注释行。如果有多行需要注释,每行前面都要加#。
#shell程序的正文,由很多行shell语句构成。
#shell就是把以前命令行中键入执行的命令写成了程序
#shell其实就是为了避免反复的在命令行下手工输入而发明的一种手工输入步骤记录下来,然后通过执行shell
#脚本程序就能再次复述原来记录的手工输入过程的一种技术。就像拍电影,演员演一次然后拍下来,看的人可以随时
#看(执行),演的人不用重复演。
#shell编辑完可以直接运行(不需编译)
================================================================================================
18. if条件语句
第一种语法:
if <条件表达式>
  then
    指令
fi
第二种语法:
if <条件表达式>;then
    指令
fi
================================================================================================
19. for循环语法结构
第一种:
for 变量名 in 变量取值列表
do 
    指令...
done

在这种for循环语句语法中,for关键字后面会有一个“变量名”,变量名依次获取in关键字后面的变量取值列表
内容(以空格分隔),每次仅取一个,然后进入循环(do和done之间的部分)执行循环内的所有指令,当执行到
done时结束本次循环。之后,“变量名”再继续获取变量列表里面的下一个变量值,继续执行循环内的所有指令,
当执行到done时结束返回,以此类推,直到取完变量列表里的最后一个值并进入循环执行到done结束为止。

第二种:称为C语言型for循环语句,其语法结构如下:
for((exp1; exp2; exp3))
do 
    指令...
done

例1:
#!/bin/sh

for((i=1; i<=3; i++))
do 
        echo $i
done

结果:
1
2
3

以上for循环语句可以改为while循环语句:
#!/bin/sh
i=1
while((i<=3))
do 
        echo $i
        ((i++))
done
结果:
1
2
3
特别说明:
(1)如果希望程序持续运行,则多用while,包括守护进程。
(2)如果是有限次循环,则多用for,实际工作中使用for的机会会更多。

举例:竖向打印5 4 3 2 1 这5个数字
参考答案1:直接列出元素的方法
#!/bin/sh
for num in 5 4 3 2 1  #提示:5 4 3 2 1需要用空格隔开
do 
        echo $num
done

结果:
5
4
3
2
1

参考答案2:利用大括号{}生成数字序列的方法。
#!/bin/sh
for n in {5..1}
do 
        echo $n
done

结果:
5
4
3
2
1

参考答案3:采用seq生成数字序列的用法
#!/bin/sh
for n in `seq 5 -1 1`  #把命令用反引号引起来,不推荐,因为容易和单引号混淆
do 
        echo $n
done

结果:
5
4
3
2
1

#!/bin/sh
for n in $(seq 5 -1 1)   #把命令用$()括起来,推荐使用这种方法
do 
        echo $n
done

例2:获取当前目录下的目录或文件名,并将其作为变量列表打印输出
实现代码如下:
#!/bin/sh
for filename in `ls`
do 
        echo $filename
done
执行结果如下:打印出当前目录下的目录及文件名
num.sh
test

20.shell中的变量定义和引用
(1)shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言,变量没有明确类型
就是弱类型语言), c语言是强类型语言。在shell编程中定义变量不需要制定类型,也没有类型这个概念
(2)变量的定义可以初始化,使用=进行初始化赋值,需要注意的是:=两边是不能有空格的,C语言是不计较的
注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者有,而且不能随意有没有空格。
string="hello world"
echo $string
================================================================================================
21. if的典型应用
(1)判读文件是否存在。
if [ -f a.txt ]; then  #(-f)为文件是否存在的意思。-f前面有一个空格,.txt后面也有一个空格。
    echo "yes"
else
    echo "no"
    touch a.txt
fi
(2)判读目录是否存在(-d)
(3)判断字符串是否相等("str1"="str2")
if [ "abc" = "abc" ]; then
    echo "equal"
else
    echo "not equal"
fi
(4)判断数字是否相等(-eq,equal)、大于(-gt,greater than)、小于(-lt,less than),大于等于(-ge)、
小于等于(-le、less equal)
(5)判断字符串是否为空(-z)
if [ str = "" ]; then
    echo "yes"
else 
    echo "no"
fi

str="tao"
if [ -z $str ]; then
    echo "yes"
else    
    echo "no"
fi
(6)逻辑或(-o)
if [ 122 -eq 12 -o "abcd" = "abcd" ]; then
    echo "yes"
else    
    echo "no"
fi 
(7)逻辑与&&和逻辑或||与简写的if表达式相结合
str="olll"
[ -z $str ] || echo "fei kong"   #若[ -z $str ]为真则 echo "fei kong"执行  

[ -z $str ] && echo "fei kong"   #若[ -z $str ]为假则 echo "fei kong"不会执行  

21.shell中的循环结构
(1)for循环
for i in 1 2 3 4 5
do
    echo $i
done

for i in `ls`
do 
    echo $i
done

(2)while循环
i=2
j=11
while [ $i -lt $j ]; do
    echo $i
    i=$(($i + 2))
done
 
i=2
j=11
while [ $i -lt $j ]
do
        echo $i
        i=$(($i + 2))
done
(3)case语句
  7 var=2
  8 case $var in
  9 1) echo "1" ;;  #分支是以两个分号结尾
 10 2) echo "2" ;;
 11 esac
 shell中的 case语句语句天生没有break,也不需要break,和c语言中的switch case不同。
 shell中的case默认就是匹配上哪个执行哪个,不会说执行完了还去执行后面的其他case(就
 好像shell中的case语言默认都带了break)。

case "找老公条件" in 
    家里有房子)
        嫁给你...        #<==钱
        ;;
    家里有背景)
        嫁给你...        #<==权
        ;;
    很努力吃苦)
        先谈谈男女朋友...    #<==潜力股
    *)
        good bye!!...        #<==淘汰
esac

22.while循环和case语言和传参结合
(1)shell中的break关键字和c语言中的意义相同(都是跳出来)但是用法不同,因为shell中case
语句默认不用break的,因此在shell中break只用于循环跳出。所以当while中内嵌case语句时,
case中的break是跳出外层的while循环的,不是用来跳出case语句的。
(2)shell中的$#、$1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变。
shift指令有点像左移运算符,把我们给shell程序的传参左移了一个移出去了,原来的$2变成了
新的$1,原来的$#少了1个
echo $# $1
shift;
echo $# $1

source oldgirl.sh  aa bb cc
3 aa
2 bb
shift指令有点像左移运算符
23. 调用shell程序的传参
(1) C语言中可以通过main函数的argc和argv给程序传参
(2)shell程序本身也可以在调用时传参给他,在shell程序内部使用传参也是使用的一些
特定符号来表示的,包括:
$#表示调用该shell时传参的个数。($#计数时只考虑真正的参数个数)
$0、$1、$2......则依次表示传参的各个参数。
$0是执行这个应用程序shell的名字,如sh,bash等
source oldgirl.sh  aa bb cc  $#=3,$0是执行这个shell程序的解析程序的名字,$1是第一个
有效参数的值,这里是aa...,$2是第二个有效参数的值,依次类推。
C语言:./a.out aa bb cc      argc = 4(C语言把./a.out也算一个参数),argv[0]=./a.out,argv[1]
是第一个有效参数...

23. Shell脚本开发环境的配置和优化实践
(1)使用vim而不是vi编辑器
vi编辑器的功能类似于Windows下的记事本,比较适合编辑普通文件,但是用于编写脚本代码就不太适合了,
例如缺少高亮显示代码、自动缩进等重要的功能;而vim编辑器则相当于Windows下的高级编辑器,类似
emeditor、editplus、notpad++等,为了提高开发效率,需要使用vim而不是vi。当然了,vi也是可以用来
编写代码的,只不过效率不高而已。
因此,首先要做如下调整,以便使用vim作为脚本的工具:
root@ubuntu:~# echo "alias vi='vim'">>/etc/profile
root@ubuntu:~# source /etc/profile
经过上述调整后,当用vi命令时,会自动被vim替换
(2)Linux环境下的vim编辑器默认功能不够强大,如果要进行Shell脚本的开发,还需要进行适当的设置,
从而达到高效开发的目的。vim编辑器有一个可用用来调整配置的配置文件,默认放置在用户家目录下,
全路径及名字组合为:~/.vimrc(全局路径为/etc/vimrc),这是一个隐藏文件,下面是老男孩在企业
里开发shell脚本时,对.vimrc进行的一个常用设置,供大家参考,具体参数及内容说明如下:


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值