linux+shell基础语法

6 篇文章 0 订阅

一.Linux系统

带你真正认识Linux 系统结构:https://www.linuxprobe.com/linux-system-structure.html

1.1查看文件指定行,统计行数

head -2 test.txt
tail -2 test.txt
head -4 test.txt|tail -2

wc -l test.txt#查看行数
wc -w test.txt#查看单词
wc -c test.txt#查看字符

1.2查看文件状态(stat)

  • Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间
  • Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。
  • Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。

1.3 top

动态查看系统的整体运行

1.4 系统硬件配置查询

  • ifconfig
  • cat /proc/cpuinfo :查看CPU信息processor
  • df -h :查看硬盘/dev/vda1
  • free -m :查看内存
  • date

1.5 权限

Linux下文件的权限类型一般包括读,写,执行。对应字母为 r(4)、w(2)、x(1)。
Linux下权限的属组有 拥有者(u) 、群组(g) 、其它组(o) 三种。每个文件都可以针对这三个属组(粒度),设置不同的rwx(读写执行)权限。

-rw------- (600)    只有拥有者有读写权限。
-rw-r--r-- (644)    只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700)    只有拥有者有读、写、执行权限。
-rwxr-xr-x (755)    拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711)    拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666)    所有用户都有文件读、写权限。
-rwxrwxrwx (777)    所有用户都有读、写、执行权限。

chmod +x abc:给所有用户添加执行的权限
chmod a+r abc:给所有用户添加读的权限
chmod -R 777 abc:给文件夹和子文件的所有用户赋予读写执行权限

二.Shell基础

shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。

目前主要有下列版本的shell。

  • Bourne Shell:是贝尔实验室开发的。

  • BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell。

  • Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。

  • C Shell:是SUN公司Shell的BSD版本。

2.1 变量

  • 变量定义和逻辑控制,是⼀门语⾔的基本
  • 变量不需要定义,可以直接使
2.1.1 定义变量

变量名的命名须遵循如下规则:

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。

  • var=“xxx”。= 左右不要有空格。需要的时候,必须⽤”或 者’括起来
  • 也可以使⽤命令的输出作为变量的内容 var=`ls`。$() 与反引号类似
2.1.2 使用变量
  • 使⽤$var 或 ${var}来访问变量。后者更为严谨。$var_x ${var}_x 是不同的。
  • 变量不需要定义也可以使⽤。引⽤未定义的变量,默认为空值。
2.1.3 系统变量
  • echo $PWD
  • echo $USER
  • echo $HOME
  • echo $PATH
2.1.4 数组变量

使⽤()来定义数组变量,中间使⽤空格隔开
array=(1 2 3 4 5 6)

#读取数组元素
echo ${array[2]}
#读取整个数组
echo ${array[*]} 
#或者
echo ${array[@]} 
#取得数组单个元素的长度
echo ${#array[*]}
#或者
echo ${#array[@]} 
2.1.5 字符串变量
#提取子字符串
string="runoob is a great site"
# 输出 unoo
echo ${string:1:4} 
#获取字符串长度
echo ${#string}
#${#array[*]}和${#array[@]}表⽰数组中元素的个数

#字符串拼接--将两个字符串并排放在一起就能实现拼接
name="Shell"
url="http://www.baidu.com/shell/"
#**中间不能有空格**($name $url)
str1=$name$url  
str2="$name $url"  #如果被双引号包围,那么中间可以有空格
str3=$name": "$url  #中间可以出现别的字符串
str4="$name: $url"  #这样写也可以
str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
2.1.6 特殊符号的使⽤
  • ‘’ 以单引号’ '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。
  • “” 以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。
  • \ 反斜线,某些情况下表⽰转义。
  • $(ls) 表⽰执⾏ls后的结果。与``类似。不过可以嵌套
  • `反引号。⽤法⽐较独特,代表命令的输出
  • $(()) (())对整数进行运算, 获取运算结果,可以进行变量操作。⽐如相加 获取运算结果,可以进行变量操作。⽐如相加 获取运算结果,可以进行变量操作。如相加((a+b))
2.1.7 删除变量
unset var

2.2基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符
    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

2.2.1算术运算符

表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法expr $a + $b 结果为 30。
-减法expr $a - $b 结果为 -10。
*乘法expr $a \* $b 结果为 200。
/除法expr $b / $a 结果为 2。
%取余expr $b % $a 结果为 0。
=赋值a=$b 把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

注意:条件表达式要放在中括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。

2.2.2关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。
2.2.3布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。
2.2.4逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||逻辑的 OR[[ $a -lt 100
2.2.5字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否不相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否不为 0,不为 0 返回 true。[ -n “$a” ] 返回 true。
$检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。
2.2.6文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

操作符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
-p file检测文件是否是有名管道,如果是,则返回 true。[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。

2.3逻辑控制

  • 条件 if
  • 分⽀ case
  • 循环 for while until select
  • && ||
  • Break 和 continue
2.3.1 If结构
  • if [ condition ] ; then …;fi
  • if [ condition ] ; then …;else …;fi
  • if [ condition ] ; then …;elif …;fi
  • if [ condition ] ; then …;elif …;else …;fi
  • 简单的逻辑可以使⽤ && || 去替代
#单行语句一般要用到分号来区分代码块
#若写作多行,用换行符来区分代码块,则无需用到分号
a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi
2.3.2 case … esac (选学)

case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。

case … esac 语法格式如下:

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

示例:

#!/bin/sh
site="runoob"
case "$site" in
   "runoob") echo "菜鸟教程"
   ;;
   "google") echo "Google 搜索"
   ;;
   "taobao") echo "淘宝网"
   ;;
esac
2.3.3 for循环
  • bash shell支持C式for循环
for((i=0;i<10;i++)); 
do   
echo $i ; 
done
  • For 遍历循环

⽤于迭代数组,还可以迭代以空格隔开的字符串序列。或者是某个命令的返回值。

for f in $array[*]; 
dodone

#示例:
ss="aa bb cc dd";for x in $ss;do echo $x ;done 
for x in \`ls\` ;do echo  $x ;done 
ss=(aa bb cc "sss dd");for x in "${ss[@]}";do echo $x ;done

2.3.4 While 循环

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。

#语法格式为:
while condition
do
    command
done



#实例1
#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

#let 命令的替代表示形式是: ((算术表达式))

#实例2
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done
2.3.5 until 循环(选学)

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

#语法格式为:
until condition
do
    command
done


#实例
#!/bin/bash

a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

#expr整数运算
2.3.6退出控制
  • return 函数返回
  • exit 脚本退出
  • break 退出当前循环
  • continue 跳过当前循环,进入下一次循环

Shell 中的 break 和 continue 却能够跳出多层循环,也就是说,内层循环中的 break n和 continue n 能够跳出外层循环。

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done


#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done
2.3.7 Shell 输⼊输出
  • Read ⽤来读取输⼊,并赋值给变量
  • echo ,printf可以简单输出变量。
  • > file 将输出重定向到另⼀个⽂件
  • >> 表⽰追加 等价于tee -a
  • < file 输⼊重定向 (wc -l < 1.txt显示行数)
  • | 表⽰管道,也就是前⼀个命令的输出传⼊下⼀个命令 的输

2.4脚本

2.4.1 函数
# return后跟数值n(0-255),返回的是状态码
[ function ] funname [()]

{

    action;

    [return int;]

}


#!/bin/bash
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
#注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。



  • Function 可以省略。除了可以在脚本⽂件中使⽤函数外, 还可以shell中定义。这些定义会在本次shell结束后消失。
  • 如果没有return,返回值是最后⼀句指令的返回值。
2.4.2 传参
  • $0 表⽰执⾏的程序,是相对于执⾏⽬录的路径
  • $1 ,$2 ,$3 分别表⽰第⼏个参数。默认shell只⽀持9个参数
  • $@,$* 表⽰所有的参数,不含$0

三.linux三剑客

3.1 grep

#大小写不同意义不同
grep -A 
grep -B
grep -C
#忽略大小写
grep -i
#查看压缩文件
zgrep 
zcat

3.2 awk

3.2.1awk简介

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本

3.2.2调用awk
  • awk [选项参数] ‘script’ var=value file(s)
  • awk [选项参数] -f scriptfile var=value file(s)
3.2.2选项参数
  • -F fs or –field-separator fs
    如果不加-F指定,则以空格或者tab为分隔符
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:

  • -v var=value or –asign var=value
    赋值一个用户定义变量。

  • -f scripfile or –file scriptfile
    从脚本文件中读取awk命令。

  • -mf nnn and -mr nnn
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

  • -W compact or –compat, -W traditional or –traditional
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

  • -W copyleft or –copyleft, -W copyright or –copyright
    打印简短的版权信息。

  • -W help or –help, -W usage or –usage
    打印全部awk选项和每个选项的简短说明。

  • -W lint or –lint
    打印不能向传统unix平台移植的结构的警告。

  • -W lint-old or –lint-old
    打印关于不能向传统unix平台移植的结构的警告。

  • -W posix
    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符和=不能代替=;fflush无效。

  • -W re-interval or –re-inerval
    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

  • -W source program-text or –source program-text
    使用program-text作为源代码,可与-f命令混用。

  • -W version or –version
    打印bug报告信息的版本。

3.2.3基本操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-laeo2aKc-1649323121090)(https://boostnote.io/api/teams/dlm1ZMj21/files/b45453d37e548ff9bb2f84babebb2a28ad8c021c3e76dd578c2fb65a13108fff-1089507-20170126222420597-662074402.jpg)]

#分割。

last -n 5 |awk '{print $1}'
awk -F":" '{ print $1 }' /etc/passwd
awk -F":" '{ print $1 $3 }' /etc/passwd
awk -F":" '{ print $1 " " $3 }' /etc/passwd
awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd


#赋值一个用户定义变量-v。


#log.txt文本内容如下:

#2 this is a test
#3 Are you like awk
#This's a test
#10 There are orange,apple,mongo

$ awk -va=1 '{print $1,$1+a}' awktest.txt
$ awk -va=1 -vb=s '{print $1,$1+a,$1b}' awktest.txt


3.2.4运算符
运算符描述
= += -= *= /= %= ^= **=赋值
?:C条件表达式
&&逻辑与
~ 和 !~匹配正则表达式和不匹配正则表达式
< <= > >= != ==关系运算符
空格连接
+ -加,减
* / %乘,除与求余
+ - !一元加,减和逻辑非
^ ***求幂
++ –增加或减少,作为前缀或后缀
$字段引用
in数组成员
#过滤第一列大于2的行:
$ awk '$1>2' log.txt    #命令
#过滤第一列大于2并且第二列等于’Are’的行:
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' awktest.txt    

3.2.5、内建变量
变量描述
$n当前记录的第n个字段,字段间由FS分隔
$0完整的输入记录
ARGC命令行参数的数目
ARGIND命令行中当前文件的位置(从0开始算)
ARGV包含命令行参数的数组
CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO最后一个系统错误的描述
FIELDWIDTHS字段宽度列表(用空格键分隔)
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
IGNORECASE如果为真,则进行忽略大小写的匹配
NF一条记录的字段的数目
NR已经读出的记录数,就是行号,从1开始
OFMT数字的输出格式(默认值是%.6g)
OFS输出字段分隔符,默认值与输入字段分隔符一致。
ORS输出记录分隔符(默认值是一个换行符)
RLENGTH由match函数所匹配的字符串的长度
RS记录分隔符(默认是一个换行符)
RSTART由match函数所匹配的字符串的第一个位置
SUBSEP数组下标分隔符(默认值是/034)
# 输出顺序号 NR, 匹配文本行号
awk '{print NR,FNR,$1,$2,$3}' awktest.txt

# 指定输出分割符
awk '{print $1,$2,$5}' OFS=" $ "  awktest.txt
3.2.6、使用正则表达式
# 输出第二列包含 "th",并打印第二列与第四列
awk '$2 ~ /th/ {print $2,$4}' awktest.txt

#'~,!~'表示指定变量与正则表达式匹配(代字号)或不匹配(代字号、感叹号)的条件语句

awk参考资料

3.3 sed

sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑

3.3.1 sed的使用方法
  • 在命令行指定sed指令对文本进行处理:sed +选项 ‘指令’ 文件

  • 先将sed指令保存到文件中,将该文件作为参数进行调用:sed +选项 -f 包含sed指令的文件 文件

3.3.2sed的常用选项

-r:使用扩展正则表达式

-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项

-f:后跟保存了sed指令的文件

-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改

-n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行

3.3.3sed中的编辑命令
  • a:追加 向匹配行后面插入内容

  • c:更改 更改匹配行的内容

  • i:插入 向匹配行前插入内容

  • d:删除 删除匹配的内容

  • s:替换 替换掉匹配的内容

  • p:打印 打印出匹配的内容,通常与-n选项和用

示例1:向文件中添加或插入行

sed '3ahello' sedtest.txt   #向第三行后面添加hello,3表示行号
sed '/123/ahello' sedtest.txt #向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加
示例2:更改文件中指定的行


sed  '1chello'  sedtest.txt  #将文件1.txt的第一行替换为hello

sed  '/123/chello'  sedtest.txt  #将包含123的行替换为hello

示例3:删除文件中的行
sed  '4d'  sedtest.txt    #删除第四行
sed   '1,2d'  sedtest.txt   #删除1~2行

sed   '/123\|abc/!d'  sedtest.txt    #删除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反

示例4:替换文件中的内容

sed  's/123/hello/'   sedtest.txt   #将文件中的123替换为hello,默认只替换每行第一个123

sed  's/123/hello/g'  sedtest.txt #将文本中所有的123都替换为hello

示例5:打印文件中的行

sed  -n '3p'  sedtest.txt   #打印文件中的第三行内容
sed  -n '3,$p'  sedtest.txt  #打印从第3行到最后一行的内容

sed  -n '/123/p'  sedtest.txt   #逐行读取文件,打印匹配you的行

示例6:修改文件中的行并生效
sed -i '/123/ahello' sedtest.txt
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值