Linux_Shell知多少—1

SHELL

有多少我们可以使用的 shells
cat /etc/shells
/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 预设的 shell)
/bin/ksh (Kornshell 由 AT&T Bell lab. 収展出来的,兼容于 bash)
/bin/tcsh (整吅 C Shell ,提供更多的功能)
/bin/csh (已经被 /bin/tcsh 所叏代)
/bin/zsh (基于 ksh 収展出来的,功能更强大的 shell)

命令别名设定功能: (alias)
alias lm='ls -al'
取消别名:
unalias lm

Bash shell 的内建命令: type
type [-tpa] name
选项与参数:
不加任何选项与参数时,type 会显示出 name是外部指令还是 bash 内建指令
-t             :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义:
file         :表示为外部指令
alias     :表示该指令为命令别名所设定定的名称;
builtin :表示该指令为 bash 内建的指令功能;
-p             :如果后面接的 name 为外部指令时,才会显示完整文件名;
-a             :会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias


如果指令串太长的话,如何使用两行来输出
cp /var/spool/mail/root /etc/crontab /
> /etc/fstab /root


变量
定义:让某一个特定字符串代表不固定的内容
变量的设定规则
1. 变量与变量内容以一个等号『=』来连结,如下所示: 『myname=VBird』
2. 等号两边不能直接接空格符,如下所示为错误:『myname = VBird』或『myname=VBird Tsai』
3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:『2myname=VBird』
4. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但双引号内的特殊字符如$等,可以保有原本的特性。
5. 可用跳脱字符『 / 』将特殊符号(如 [Enter], $, /, 空格符, '等)变成一般字符;
6. 在一串指令中,还需要藉由其他的指令提供的信息,可以使用反单引号『`指令`』或 『$(指令)』。
例如想要取得核心版本的设定:『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
7. 若该变量为扩增变量内容时,则可用"$变量名称"或${变量}累加内容,如下所示『PATH="$PATH":/home/bin』
8. 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量:『export PATH』
9. 通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断
10.取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的设定:『unset myname』

要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录
三种都正确拍方法:
[root@www ~]# PATH=$PATH:/home/dmtsai/bin
[root@www ~]# PATH="$PATH":/home/dmtsai/bin
[root@www ~]# PATH=${PATH}:/home/dmtsai/bin

在一般的状态下,父程序的自定义变量是无法在子程序内使用的。但是透过 export 将变量变成环境变量后,就能够在子程序底下应用了

如何进入祷蝥目前核心的模块目录?
cd /lib/modules/`uname -r`/kernel
cd /lib/modules/$(uname -r)/kernel

列出目前的 shell 环境下的所有环境变量与其内容
env
env 是 environment (环境) 的简写啊,上面的例子当中,是列出来所有的环境变量
set
set    观察所有变量 (含环境变量与自定义变量)
set 除了环境变量之外, 还会将其他在 bash 内的变量通通显示出来

设置自己的PS1
o /d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"
o /H :完整的主机名。举例来说,鸟哥的练习机为『www.vbird.tsai』
o /h :仅叏主机名在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略
o /t :显示时间,为 24 小时格式的『HH:MM:SS』
o /T :显示时间,为 12 小时格式的『HH:MM:SS』
o /A :显示时间,为 24 小时格式的『HH:MM』
o /@ :显示时间,为 12 小时格式的『am/pm』样式
o /u :目前使用者的账号名称,如『root』;
o /v :BASH 的版本信息,如鸟哥的测试主板本为 3.2.25(1),仅叏『3.2』显示
o /w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 叏代;
o /W :利用 basename 凼数取得工作目录名称,所以仅会列出最后一个目录名。
o /# :下达的第几个指令。
o /$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~

一般的PS1
echo $PS1
[/u@/h /W]/$
新设定:w显示目录路径:
export PS1='[/u@/h /w]/$ '

shell 的 PID        
echo $$            <==显示出当前shell的pid

上个执行指令的回传值
echo $?        <==上一条命令如果没问题返回0  有问题返回一串数字


export: 自定义变量转成环境变量
[root@www ~]# export 变量名称
env 与 set 所谓的环境变量与自定义变量,那么这两者之间有啥差异呢?
该变量是否会被子程序所继续引用


变量键盘读取、数组与宣告: read, array, declare
read
要读取来自键盘输入的变量,就是用 read 这个指令了
read [-pt] variable
选项与参数:
-p :后面可以接提示字符!
-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!

范例一:让用户由键盘输入一内容,将该内容发成名为 atest 的变量
[root@www ~]# read atest
This is a test             <==此时光标会等待你输入!请输入左侧文字看看
[root@www ~]# echo $atest
This is a test             <==你刚刚输入的数据已经发成一个发量内容!

范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的发量内容
[root@www ~]# read -p "Please keyin your name: " -t 30 named
Please keyin your name: xujinqiang <==注意看,会有提示字符喔!
[root@www ~]# echo $named
xujinqiang <==输入的数据又发成一个发量的内容了!

declare / typeset
declare 或 typeset 是一样的功能,就是在『宣告变量的类型』。
[root@www ~]# declare [-aixr] variable
选项与参数:
-a :将后面名为 variable 的变量定义成为数组 (array) 类型
-i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
-x :用法与 export 一样,就是将后面的 variable 变成环境变量;
-r :将变量设定成为 readonly 类型,该变量不可被更改内容,也不能 unset

范例一:让发量 sum 进行 100+300+50 的加总结果
[root@www ~]# sum=100+300+50
[root@www ~]# echo $sum
100+300+50
[root@www ~]# declare -i sum=100+300+50
[root@www ~]# echo $sum
450
范例二:将 sum 变成环境发量
[root@www ~]# declare -x sum
[root@www ~]# export | grep sum
declare -ix sum="450"
范例三:让 sum 变成只读属性,不可更动!
[root@www ~]# declare -r sum
[root@www ~]# sum=tesgting
范例四:让 sum 变成非环境发量的自定义变量
[root@www ~]# declare +x sum <== 将 - 发成 + 可以进行『取消』动作
[root@www ~]# declare -p sum <== -p 可以单独列出发量的类型
declare -ir sum="450" <== 看吧!只剩下 i, r 的类型,不具有 x !

数组 (array) 变量类型
在bash里头,数组的设定方式是:
var[index]=content
数组名为var,而这个数组的内容为var[1]=小明,var[2]=大明,var[3]=好明 .... 等等,index 就是一些数字啦,重点是用中刮号 ([ ]) 来设定的。
范例:设定var[1] ~ var[3] 的变数
[root@www ~]# var[1]="small min"
[root@www ~]# var[2]="big min"
[root@www ~]# var[3]="nice min"
[root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"
small min, big min, nice min

读取数组的方式:${数组} 的方式来读取   <===数组读取

变量内容的删除、取代与替换
[root@feed ~/shell]# path
[root@feed ~/shell]# path=${PATH}
[root@feed ~/shell]# echo $path
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:
假设我不喜欢 kerberos,所以要将前两个目录删除掉
[root@feed ~/shell]# echo ${path#/*kerberos/bin:}
${path#/*kerberos/bin:} 解释:
#    :代表从左边开始,符合取代文字的『最短的』那一个;
/    :代表从/路径开始
*    :任意匹配符
kerberos/bin :到这结束(从匹配到此都删除)

##    :符合取代文字的『最长的』那一个;
保留最后一个变量:
[root@feed ~/shell]# echo ${path##/*:}
/root/bin

从后面向前删除变量内容
用% 符号
[root@feed ~/shell]# echo ${path%:*bin}
保留第一个变量
[root@feed ~/shell]# echo ${path%%:*bin}

变量的取代功能:
[root@feed ~/shell]# echo ${ll}
/var/spool/mail/root
[root@feed ~/shell]# echo ${ll/root/ROOT}
/var/spool/mail/ROOT/
全局替换://
[root@feed ~/shell]# echo ${path//sbin/SBIN}


变量的测试与内容替换
测试一下是否存在 username 这个变量,若不存在则给予 usernn 内容为 root
[root@feed ~/shell]# echo $usernn

[root@feed ~/shell]# usernn=${usernn-jinqiang}
[root@feed ~/shell]# echo $usernn
jinqiang

否则:既,usernn变量值为jerry
[root@feed ~/shell]# usernn="jerry"
[root@feed ~/shell]# usernn=${usernn-xujinqiang}
[root@feed ~/shell]# echo $usernn
jerry

变量为空或不存在的情况:
:-    <==表示变量内容为空或者是未设定,都能够以后面的内容替换
[root@feed ~/shell]# usernn=""
[root@feed ~/shell]# echo $usernn

[root@feed ~/shell]# usernn=${usernn:-jinqiang}
[root@feed ~/shell]# echo $usernn
jinqiang

str 为空:
[root@feed ~/shell]# unset str;var=${str-newvar}
[root@feed ~/shell]# echo var="$var",str="$str"
var=newvar,str=                <==因为str不存在,所以var为newvar

str 为真
[root@feed ~/shell]# str="oldvar"; var=${str-newvar}
[root@feed ~/shell]# echo var="$var",str="$str"
var=oldvar,str=oldvar    <==因为str存在,所以var等于str的内容

要将旧变量内容也一起替换掉的话,那么就使用等号(=)
[root@feed ~/shell]# unset str;var=${str=newvar}
[root@feed ~/shell]# echo var="$var",str="$str"
var=newvar,str=newvar        <==因为 str 不存在,所以 var/str 均为 newvar
[root@feed ~/shell]# str="oldvar"; var=${str=newvar}
[root@feed ~/shell]# echo var="$var",str="$str"
var=oldvar,str=oldvar        <==因为 str 存在,所以 var 等于 str 的内容

如果旧变量不存在时,发个测试报告通知我『有错误』
『 ? 』帮忙啦
[root@feed ~/shell]# unset str; var=${str?无此发数}
-bash: str: 无此发数  <==因为 str 不存在,所以输出错误讯息

[root@feed ~/shell]# str="oldvar"; var=${str?novar}
[root@feed ~/shell]# echo var="$var", str="$str"
var=oldvar, str=oldvar <==<==因为 str 存在,所以 var 等于 str 的内容
   
路径与指令搜寻顺序
bash 的进站与欢迎讯息
[root@feed ~/shell]# cat /etc/issue
Red Hat Enterprise Linux Server release 5.1 (Tikanga)
Kernel /r on an /m

issue 这个档案的内容也是可以使用反斜杠作为变量取用
issue 内的各代码意义
/d 本地端时间的日期;
/l 显示第几个终端机接口;
/m 显示硬件的等级 (i386/i486/i586/i686...);
/n 显示主机的网络名称;
/o 显示 domain name;
/r 操作系统的版本 (相当亍 uname -r)
/t 显示本地端时间的时间;
/s 操作系统的名称;
/v 操作系统的版本。

ctrl alt + F1~F6  tty1 ~ tty6 进入控制台
alt + F7 退出控制台

login 与 non-login shell
login shell 会读取哪些配置文件?
1.     /etc/profile:这是系统整体的设定,你最好不要修改这个档案
2.    ~/.bash_profile 或 ~/.bash_login 或 ~/.profile 属于使用者个人设定,你要改自己的数据,就写入这里

~/.bashrc (non-login shell 会读)
[root@feed ~/shell]# rm /home/pica/.bashrc -rf
[root@feed ~/shell]# su - pica
-bash-3.1$ ls
恢复:
-bash-3.1$ cp /etc/skel/.bashrc /home/pica/
-bash-3.1$ source ~/.bashrc
[pica@feed ~]$

通配符与特殊符号

*                    代表『 0 个到无穷多个』任意字符
?                    代表『一定有一个』任意字符   <j??q == jinq jwhq 必定占一个字符>
[ ]                同样代表『一定有一个在括号内』的字符(非任意字符)。例[abcd]代表『一定有一个字符,可能是 a, b, c, d 这四个任何一个』
[ - ]            若有减号在中括号内时,代表『在编码顺序内的所有字符』例如 [0-9] 代表 0 刡 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ]            若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。 <<非abc开头的字符>>


#     批注符号:这个最常被使用在 script 当中,规为说明!在后的数据均不执行
/     跳脱符号:将『特殊字符或通配符』还原成一般字符
|     管线 (pipe):分隔两个管线命令的界定
;     连续指令下达分隔符
~     用户癿家目录
$     取用变量前导符
&     工作控制 (job control):将指令放到后台执行
!     逻辑运算意义上的『非』 not 的意思
/     目录符号:路径分隔的符号
>        数据流重导向:输出导向『取代』
>>     数据流重导向:输出导向『追加』
<        数据流重导向:输入导向
<<    数据流重导向:输入导向
' ' 单引号,不具有变量置换的功能
" " 具有变量置换的功能
` ` 两个『 ` 』中间为可以先执行的命令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ } 在中间为命令区块的组合


数据流重导向
1. 标准输入 (stdin) :代码为 0 ,使用 < 戒 <<
2. 标准输出 (stdout):代码为 1 ,使用 > 戒 >>
3. 标准错诨输出(stderr):代码为 2 ,使用 2> 戒 2>>
标准错误正确重定向
2>&1
find /home -name jerry > /mnt/1.txt 2>&1            覆盖
find /home -name jerry >> /mnt/1.txt 2>&1         追加   

standard input : < 与 <<
利用 cat 指令来建立一个档案的简单流程
[root@www ~]# cat > catfile
testing
cat file test
<==这里挄下 [ctrl]+d 来离开
[root@www ~]# cat catfile
testing
cat file test

用stdin取代键盘的输入以建立新档案的简单流程
[root@feed ~/shell]# cat > catfile < ~/.bashrc

EOF的应用:
[root@feed ~/shell]# cat > catfile << "eof"
> hahahahahha
> nihaome
> eof
[root@feed ~/shell]# cat catfile
hahahahahha
nihaome

&& 与 || 的应用:
cmd1 && cmd2
1. 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2。
2. 若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行
cmd1 || cmd2
1. 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。
2. 若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。


抽取命令:cut, grep
抽取讯息通常是针对『一行一行』来分析的, 并不是整篇讯息分析的
cut
这个指令可以将一段讯息的某一段给他『切』出来,处理的讯息是以『行』为单位
[root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符
[root@www ~]# cut -c 字符区间 <==用于排列整齐的讯息
选项与参数:
-d :后面接分隔字符。与-f一起使用;
-f :依据-d的分隔字符将一段讯息分割成为数段,用-f取出第几段的意思
-c :以字符(characters)的单位取出固定字符区间

找出变量PATH的第五列;
[root@feed ~/shell]# echo $PATH | cut -d":" -f 5
/sbin
找出变量PATH的第五列与七列:
[root@feed ~/shell]# echo $PATH | cut -d":" -f 5,7
/sbin:/usr/sbin

grep
[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 档案以 text 档案的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写规为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示


排序命令:sort, wc, uniq
sort        <==排序
可以依据不同的数据型态来排序
[root@www ~]# sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f :忽略大小写的差异,例如 A 与 a 规为编码相同
-b :忽略最前面的空格符部分
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法
-n :使用『纯数字』进行排序(默认是以文字型态来排序的)
-r :反向排序
-u :就是 uniq ,相同的数据中,仅出现一行代表
-t :分隔符,预设是用 [tab] 键来分隔
-k :以那个区间 (field) 来进行排序的意思

uniq        <==去掉重复行
[root@www ~]# uniq [-ic]
选项与参数:
-i :忽略大小写字符的不同
-c :进行统计

wc            <==统计
[root@www ~]# wc [-lwm]
选项与参数:
-l :仅列出行
-w :仅列出多少字(英文单字)
-m :多少字符

tee        <==双向重导向        同时将数据流分送到档案去与屏幕(screen)
[root@www ~]# tee [-a] file
选项与参数:
-a :以累加 (append) 的方式,将数据加入 file 当中

[root@feed ~/shell]# last | tee last.list
root     pts/2        10.8.17.135      Mon Nov 22 17:25   still logged in  
root     pts/1        10.8.17.135      Mon Nov 22 11:53 - 10:22  (22:28)  
[root@feed ~/shell]# cat last.list
root     pts/2        10.8.17.135      Mon Nov 22 17:25   still logged in  
root     pts/1        10.8.17.135      Mon Nov 22 11:53 - 10:22  (22:28) 


字符转换命令: tr, col, join, paste, expand
tr        <==可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换
[root@www ~]# tr [-ds] SET1 ...
选项与参数:
-d :删除信息当中的 SET1 这个字符串
-s :取代掉重复的字符

将小写字母调换成大写字母
[root@feed ~/shell]# last | tr '[a-z]' '[A-Z]'
ROOT     PTS/2        10.8.17.135      MON NOV 22 17:25   STILL LOGGED IN  
ROOT     PTS/1        10.8.17.135      MON NOV 22 11:53 - 10:22  (22:28)

删除/etc/passwd文件中的:号
[root@feed ~/shell]# cat /etc/passwd | tr -d ':'

col
[root@www ~]# col [-xb]
选项与参数:
-x :将 tab 键转换成对等的空格键
-b :在文字内有反斜杠 (/) 时,仅保留反斜杠最后接的那个字符

利用 cat -A 显示出所有特殊按键,最后以 col 将 [tab] 转成空白
[root@feed ~/shell]# cat /etc/man.config | col -x | cat -A | more

join            <==两个档案间的数据处理
他是在处理两个档案之间的数据
而且,主要是在处理『两个档案当中,有 "相同数据" 的那一行,才将他加在一起』的意思
[root@www ~]# join [-ti12] file1 file2
选项与参数:
-t :join 默认以空格符分隔数据,并且比对『第一个字段』的数据
-i :忽略大小写的差异
-1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思  -1 4 第一个文档的第四段
-2 :代表『第二个档案要用那个字段来分析』的意思                                        -2 3 第二个文档的第三段

将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏
[root@feed ~/shell]# head -n 3 /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

==> /etc/shadow <==
root:$1$nbmHTpDL$RWuoVOtS/phjfuWWIyzM71:14599:0:99999:7:::
bin:*:14599:0:99999:7:::
daemon:*:14599:0:99999:7:::

将两个档案第一字段相同者整合成一行
[root@feed ~/shell]# join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:$1$nbmHTpDL$RWuoVOtS/phjfuWWIyzM71:14599:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:14599:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:14599:0:99999:7:::

/etc/passwd 第四个字段是 GID ,那个 GID 记录在 /etc/group 当中的第三个字段,请问如何将两个档案整合
[root@feed ~/shell]# head -n 3 /etc/passwd /etc/group
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

==> /etc/group <==
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon

[root@feed ~/shell]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:root
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon

paste
直接『将两行贴在一起,且中间以 [tab] 键隔开』而已
[root@www ~]# paste [-d] file1 file2
选项与参数:
-d :后面可以接分隔字符。预设是以 [tab] 来分隔的!
- : 如果 file 部分写成 - ,表示来自 standard input 的资料的意思

[root@feed ~/shell]# paste /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash root:$1$nbmHTpDL$RWuoVOtS/phjfuWWIyzM71:14599:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:14599:0:99999:7:::


split        <==分割命令
帮你将一个大档案,依据档案大小或行数来分割,就可以将大档案分割成为小档案了
[root@www ~]# split [-bl] file PREFIX
选项与参数:
-b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等
-l :以行数来进行分割

按行分:
[root@feed ~/shell]# split -l 10 passwd passwd
把多个小文件还原成一个大文件:
[root@feed ~/shell]# cat passwd* >> passwd
按大小分
[root@feed ~/shell]# dd if=/dev/zero of=./man.file bs=10M count=5
[root@feed ~/shell]# split -b 10m man.file file

参数代换: xargs
[root@www ~]# xargs [-0epn] command
选项与参数
-0 :如果输入的 stdin 含有特殊字符
-e :这个是EOF(end of file)的意思,后面可以接一个字符串,当xargs分析到这个字符串时,就会停止继续工作
-p :在执行每个指令的argument(参数)时,都会询问使用者的意思
-n :后面接次数,每次command指令执行时,要使用几个参数的意思

将/etc/passwd内的第一栏取出,仅取三行,使用finger这个指令将每个账号内容秀出来
[root@feed ~/shell]# cat passwd | cut -d ':' -f1 | head -n 3 | xargs finger

[root@feed ~/shell]# cat passwd | cut -d ':' -f1 | head -n 3 | xargs -p finger

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值