模块六 Shell基础编程电子课件 Linux操作系统基础 .pptx

上传人:春哥&#****71; 文档编号:88331626 上传时间:2023-04-25 格式:PPTX 页数:82 大小:3.86MB
返回 下载 相关 举报
模块六 Shell基础编程电子课件 Linux操作系统基础 .pptx_第1页
第1页 / 共82页
模块六 Shell基础编程电子课件 Linux操作系统基础 .pptx_第2页
第2页 / 共82页
点击查看更多>>
资源描述

《模块六 Shell基础编程电子课件 Linux操作系统基础 .pptx》由会员分享,可在线阅读,更多相关《模块六 Shell基础编程电子课件 Linux操作系统基础 .pptx(82页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、模块六 Shell基础编程电子课件 Linux操作系统基础 模块6Shell基础编程01简单的Shell脚本Shell变量设置Shell脚本中的逻辑判断目录020304Shell脚本中的循环计划任务服务程序Shell脚本案例:批量创建特殊要求账户0506实训6编写并运行Shell脚本程序07本模块从简单的Shell脚本开始学习Shell变量设置、Shell脚本中的逻辑判断和循环语句,为了保证在固定时间去执行同一件任务,还要学习计划任务程序的定制。Shell存在于Linux操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系统,并处理各种各样的操作系统输出结果,然后输出到屏幕返回给用户

2、。通过本模块的学习,学生将达到以下职业能力目标和要求。了解Shell的强大功能和Shell命令的解释过程掌握Shell脚本的逻辑判断。掌握Shell脚本中的循环。掌握定制计划任务服务程序。模块6Shell基础编程6.1简单的Shell脚本Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令,又可以利用Shell脚本编程运行。随着Linux的企业应用越来越多,维护Linux日常工作频繁,仅仅单靠手工输入命令是非常困难的,所以学会熟练使用Shell编程是每个Linux运维管理员必备的功课。6.1简单的Shell脚本LinuxShell种类中常见的有BourneShell(/usr/

3、bin/sh或/bin/sh)、BourneAgainShell(/bin/bash)、CShell(/usr/bin/csh)、KShell(/usr/bin/ksh)等。最常用的Shell是Bash,也就是BourneAgainShell,由于易用和免费,Bash在日常工作中被广泛使用,也是大多数Linux系统默认的Shell。Shell脚本文件名一般以.sh结尾,同时文件第1行应该定义Shell解释器语言标识。在写Shell脚本时,脚本的开头即使不加“#!/bin/bash”,它也会交给Bash解释。如果写的脚本不希望使用系统默认的Shell解释,那么必须指定解释器,否则脚本文件执行后的

4、结果可能就不是用户所需要的。6.1简单的Shell脚本rootfishyoung#vimfirst.shrootfishyoung#catfirst.sh#!/bin/bash/第一行#filename:first.sh/第二行#function:toechohellowordandDATE/第三行#Writenbyfishyoung2018-04-24/第四行echohelloworlddaterootfishyoung#第1行在上面的内容已经说过。第2行到第4行的“#”表示注释,后面跟一些与脚本相关的注释内容,以及脚本名字、功能、作者和创建日期等。这些注释可写可不写,不过不建议省略,因为随

5、着工作时间的逐渐过渡,Shell脚本也会越来越多,如果有一天查看某个脚本,很有可能忘记该脚本是用来干什么的及何时写的,同时也方便其他管理员查看,因此写上注释是有必要的。6.1简单的Shell脚本脚本编写好了,下面就是脚本的运行阶段了,脚本的运行大概有以下两种方法。方法一:rootlocalhost#shfirst.shhelloworld2018年04月24日星期二11:25:55CSTrootlocalhost#6.1简单的Shell脚本方法二:rootfishyoung#llfirst.sh-rw-r-r-.1rootroot1314月2411:08first.shrootfishyoun

6、g#./first.sh-bash:./first.sh:权限不够rootfishyoung#chmodu+xfirst.shrootfishyoung#./first.shhelloworld2018年04月24日星期二11:58:34CSTrootfishyoung#6.1简单的Shell脚本用方法二运行Shell脚本时,一定要拥有“x”(可执行)权限。另外使用sh命令执行Shell脚本时,可以通过加“-x”选项来查看脚本执行的过程,这有利于调试排错。rootfishyoung#sh-xfirst.sh+echohelloworldhelloworld+dateTueApr2413:10:

7、34CST2018rootfishyoung#6.1简单的Shell脚本Shell脚本能帮助我们很方便地管理服务器,因为可以指定一个任务计划定时去执行某一个Shell脚本来实现我们的需求。运维管理员也可以在Linux服务器上部署监控的Shell脚本,如网络有异常流量突发、服务器负载突增等,就可以发一封邮件或者报警短信来进行告警,这样可以让我们随时了解掌握服务器的运行状况。6.1简单的Shell脚本6.2Shell变量设置Shell编程语言是非类型的解释型语言,不像C+、Java语言编程时需要事先声明变量,Shell给一个变量赋值,实际上就是定义了变量,在Linux支持的所有Shell中,都可以

8、用赋值符号“=”作为变量赋值。对于常规变量的字符串定义变量值应加双引号(“”),且等号前后不能有空格,需要强引用的(指所见即所得),则用单引号(),如果是命令的引用,则用反引号()(Esc键下面的那个键)代表执行命令后的结果再赋值。6.2Shell变量设置Shell变量可分为两类:局部变量和环境变量。局部变量只在创建它们的Shell脚本中使用,而环境变量则可以在创建它们的Shell及其派生出来的任意子进程中使用。变量又分为系统变量和用户变量,系统变量是系统自带的,用户变量一般是用户为了减少重复操作而设置的变量。6.2Shell变量设置例如,在脚本中定义一个变量score=123,引用变量使用$

9、score,把变量放在脚本中会出现什么样的效果呢?rootfishyoung#vimfirst.shrootfishyoung#catfirst.sh#!/bin/bashscore=100/定义变量score值为100echoMyscoreis$score/双引号,弱引用echohelloworlddateechoMyscoreis$score/单引号,强引用xianShi=ls/反引号,命令引用echo$xianShirootfishyoung#shfirst.shMyscoreis100/弱引用输出结果helloworldTueApr2413:36:26CST2018Myscoreis$

10、score/强引用输出结果1.txt2.txt3.txt省略部分信息test.txt/反引用输出结果rootfishyoung#6.2Shell变量设置Shell脚本还可以和用户进行交互使用,让用户通过键盘输入而执行相应的功能。例如:rootfishyoung#vimsecond.shrootfishyoung#catsecond.sh#!/bin/bashread-pEnteranumber:i/从键盘输入一个数read-pEnteranumberagain:j/再输入一个数sum=$i+j/两个数求和echoTheresultis$i+$j=$sum/输出rootfishyoung#shs

11、econd.shEnteranumber:3Enteranumberagain:4Theresultis3+4=7/检验结果rootfishyoung#6.2Shell变量设置read命令就用在这样的地方,用于与用户进行交互。还需注意的是,数学中的整数计算要用“”括起来,同时外面要带一个“$”,关于小数的计算可查阅bc命令的资料。6.2Shell变量设置Shell中常见的系统变量解析见表6-1。6.2Shell变量设置6.3Shell脚本中的逻辑判断通常,在Bash的各种条件结构和流程控制结构中,都要进行各种测试,根据测试结果执行不同的操作,有时也会与if等条件语句相结合来完成测试判断,以减少

12、程序运行的错误。执行测试表达式后通常会返回“真”或“假”,就像执行命令后的返回值为0表示真,非0表示假一样。测试表达式的语法比较复杂且容易混淆,表6-2列出了测试表达式test、和()的区别及应用范围。6.3Shell脚本中的逻辑判断符号测试表达式较多,容易混淆,这里建议使用,对其他语法了解即可,当有需要时可以查阅相关资料。关于字符边界是否需要空格的理解应该如图所示,测试表达式也建议留有空格。6.3Shell脚本中的逻辑判断前面已经多次提过,在Linux系统中一切皆为文件。例如,当要创建文档时,如果能判断此文档已经存在,就换一个名字,避免程序出错及无畏的资源浪费。在书写文件测试表达式时,对象可

13、以是文件(普通文件、目录)、字符串、数字等,通常可以使用表6-3中的文件测试操作符进行判断。6.3Shell脚本中的逻辑判断有时也会进行两个字符串的比较,如字符串是否相同、字符串的长度是否为零、字符串是否为NULL等,通常可以使用表6-4中的字符串测试操作符进行判断。6.3Shell脚本中的逻辑判断以上列举了比较常用的操作符,更多的操作符可通过查阅相关资料获得帮助。在Shell脚本中的逻辑判断用得比较多的是if和switch语句。if语句有三种基本的格式,在此基础上可以扩展一些其他格式。6.3Shell脚本中的逻辑判断单分支if语句可理解为汉语中的“如果那么”,它有两种语法,分别如下。第一种语

14、法为:if条件测试表达式;then操作语句(可以多条)fi第二种语法为:if条件测试表达式then操作语句(可以多条)fi6.3.1单分支if语句条件测试表达式见表6-2,每个if条件语句都以if开头,并有then,最后以fi结尾。条件语句还可以嵌套使用,即if条件语句里还包括if条件语句。需要注意的是,每个if语句都需要与下面最近的fi配对结尾,尽量让成对的条件语句关键字的缩进相对应,以方便阅读浏览。6.3.1单分支if语句语法结构为:if条件测试表达式;thenif条件测试表达式;then操作语句(可以多条)fifi6.3.1单分支if语句【例6-1】判断/root目录下是否存在/root

15、/A/B/C目录,如果存在则不执行任何操作,反之输入Y或者y进行创建。6.3.1单分支if语句【例6-2】开发Shell脚本,输出系统总内存及剩余内存的大小。rootfishyoung#vimif2.shrootfishyoung#catif2.sh#!/bin/bashtotalMem=free-m|sed-n“2,3”p|awk(sum1+=$2);ENDprintsum1freeMem=free-m|sed-n“2,3”p|awk(sum2+=$4);ENDprintsum2echo系统总内存为:$totalMemecho系统剩余内存为:$freeMemrootfishyoung#shi

16、f2.sh系统总内存为:1503系统剩余内存为:1228rootfishyoung#上面脚本中的“free-m”命令是以MB为单位获取内存情况的,后面使用了awk计算$2和$4各段的总和,里面的END表示所有的行都已经执行相加,这是awk特有的语法。同时需要注意的是反引号()的使用。6.3.1单分支if语句双分支if语句可理解为汉语中的“如果那么否则”,它的语法结构如下。if条件测试表达式;then操作语句1(可以多条)else操作语句2(可以多条)fi6.3.2双分支if语句【例6-3】编写Shell脚本复制文件,并判断文件1是否比文件2新,如果新则覆盖,反之则提示。6.3.2双分支if语句

17、【例6-4】编写Shell脚本,判断某主机是否在线(通过ping方法)。rootfishyoung#vimif3.shrootfishyoung#catif3.sh#!/bin/bashPing-c2-i0.1-W2$1&/dev/nullif$?-eq0;then判断命令执行后的状态是否等于0echo主机$1在线elseecho主机$1不在线firootfishyoung#shif3.sh192.168.244.1主机192.168.244.1在线rootfishyoung#shif3.sh192.168.244.111主机192.168.244.111不在线rootfishyoung#这里

18、的脚本主要使用ping命令来测试与对方主机的网络联通性,而Linux系统中的ping命令不像Windows一样尝试4次就结束,可以通过“-c”参数来规定尝试的次数,并使用“-i”参数定义每个数据包的发送间隔(单位:秒),以及使用“-W”参数定义等待超时时间(单位:秒)。6.3.2双分支if语句多分支if语句可理解为汉语中的“如果那么否则如果那么”,它的语法结构为:if条件测试表达式;then操作语句1(可以多条)elif条件测试表达式;then操作语句2(可以多条)else操作语句3(可以多条)fi6.3.3多分支if语句【例6-5】编写Shell脚本,从键盘输入成绩进行判断,如果大于85,则

19、输出“Perfect”;如果大于75,则输出“Good”;如果大于60,则输出“及格”;其他则输出“不及格或数据有误”。6.3.3多分支if语句【例6-6】编写Shell脚本,判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中的vendorid一行。如果其生产商为GenuineIntel,就显示其为Intel公司;如果其生产商为AuthenticAMD,就显示其为AMD公司;否则,就显示无法识别。例中的:space:用来匹配空白字符,包括空格和Tab。利用sed命令去掉字符串中的所有空白字符为空。6.3.3多分支if语句与if语句一样,case语句同样可以用于多分支选择语句,

20、常用来根据表达式的值选择要执行的语句,它的语法结构如下。case$变量名in值1)操作语句1(可以多条);值2)操作语句2(可以多条);值N)操作语句N(可以多条);*)操作语句N+1(可以多条)esac6.3.4case语句case语句的变量最终的值,将与值1、值2等进行逐一比较,直到找到匹配的值,如果与其匹配,执行其后的命令,遇到双分号“;”,则跳到esac后的语句继续执行,如果没有找到与变量最终的值相匹配的值,脚本将执行默认值“*)”后的命令,直至“;”为止。需要注意的是,值1、值2、值N必须是常量或者正则表达式,因此case语句有时无法对if嵌套语句进行改写,只有当两个语句的判断条件匹

21、配某常量或正则表达式时,才能使用case语句。6.3.4case语句【例6-7】编写Shell脚本判断用户从键盘输入的一个字符是否为字母、数字或其他字符,并输出相应的提示信息。本例匹配模式中使用的方括号表示一个连续的范围,如0-9;使用竖杠符号“|”表示或的关系。6.3.4case语句6.4Shell脚本中的循环在LinuxShell的编程过程中,有时需要反复执行某一个命令或某一组命令,这时要用到循环语句。循环语句用于特定条件下决定某些语句重复执行的控制方式,它具有封闭型的单入单出性质,如果未达到结束状态,将一直执行循环体内的操作。Shell中常用的循环语句有while循环语句和for循环语句

22、等。6.4Shell脚本中的循环while循环的重复执行次数是利用一个条件来控制的,它的语法结构如下。while条件测试表达式do操作语句(可以多条)donewhile循环语句执行的过程是:先判断条件测试表达式的结果,如果为真则执行循环体,并且执行完循环体后进行下一次循环,否则退出循环执行done后的命令。6.4.1while循环【例6-8】编写Shell脚本,让用户从键盘输入110的整数来进行猜数游戏。6.4.1while循环【例6-9】编写Shell脚本,让用户从键盘输入一个整数n,求1+2+n的和。rootfishyoung#vimwhile2.shrootfishyoung#catwh

23、ile2.sh#!/bin/bashread-pPleaseinputthenumber:inNumsum=0i=1while$i-le$inNum/判断i小于等于输入值dosum=$sum+i/累加和i=$i+1/自增1doneechoThesumis$sumrootfishyoung#shwhile2.shPleaseinputthenumber:100Thesumis5050rootfishyoung#6.4.1while循环for循环是LinuxShell中最常用的结构。for循环常用的有两种结构:第一种结构是列表for循环,第二种结构是类C语言风格的for循环。1.列表for循环列表

24、for循环语句用于将一组命令执行已知的次数,它的语法结构如下。for变量inlistdo操作语句(可以多条)done此for循环执行次数和list列表中常数或字符串的个数相同,先将in后list列表的第一个常数或字符串赋值给变量,然后执行循环体;接着将list列表第二个赋值给变量,再次执行循环体。这个过程持续到list列表执行完毕,然后执行done后的操作命令。6.4.2for循环【例6-10】编写Shell脚本显示5次欢迎操作。rootfishyoung#vimfor1.shrootfishyoung#catfor1.sh#!/bin/bashforiin12345doechowelcome

25、,$itimesdonerootfishyoung#shfor1.shwelcome,1timeswelcome,2timeswelcome,3timeswelcome,4timeswelcome,5timesrootfishyoung#6.4.2for循环【例6-11】编写Shell脚本显示出5以内的奇数。rootfishyoung#vimfor2.shrootfishyoung#catfor2.sh#!/bin/bashforiin1.5.2doechoThenumberis$idonerootfishyoung#shfor2.shThenumberis1Thenumberis3Thenu

26、mberis5rootfishyoung#6.4.2for循环上例中通过1.5.2实现15内的奇数按步数2进行跳跃,同样可以通过seq命令实现按2递增来输出15内的所有奇数,只需将上例中的for循环那一行更改为以下内容即可。foriinseq125/需要注意的是反引号()6.4.2for循环【例6-12】编写Shell脚本输出当前目录所有以“.sh”结尾的文件。rootfishyoung#vimfor3.shrootfishyoung#catfor3.sh#!/bin/bashforiinls*.sh/注意反引号()和通配符(*)doecho-en$it/解析“t”和不换行donerootfi

27、shyoung#shfor3.shcase1.shcase2.sh省略部分信息while2.shrootfishyoung#6.4.2for循环2.类C语言风格的for循环类C语言风格的for循环一般用于循环次数已知的情况,它的语法结构如下。for(表达式1;表达式2;表达式3)do操作语句(可以多条)done其中,表达式1为循环变量赋初值的语句;表达式2为判断条件测试表达式的结果,如果为真则执行循环体,并且执行完循环体后进行下一次循环,否则退出循环执行done后的命令;表达式3用于改变循环变量的语句。6.4.2for循环【例6-13】编写Shell脚本,让用户从键盘输入一个整数n,求1n的奇

28、数和。rootfishyoung#vimfor4.shrootfishyoung#catfor4.sh#!/bin/bashread-pPleaseinputthenumber:inNumfor(sum=0,i=1;i=$inNum;i+=2)dosum=$sum+idoneechoThesumis$sumrootfishyoung#shfor4.shPleaseinputthenumber:3Thesumis4rootfishyoung#shfor4.shPleaseinputthenumber:100Thesumis2500rootfishyoung#6.4.2for循环一个循环体内包含另

29、一个完整的循环结构,称为循环嵌套。在外部循环的每次执行过程中都会触发内部循环,直至内部完成一次循环,才接着执行下一次外部循环。for循环和while循环可以相互嵌套。6.4.3嵌套循环【例6-14】编写Shell脚本,利用for循环完成下图所示的九九乘法表。6.4.3嵌套循环【例6-15】编写Shell脚本,利用for循环嵌套实现一个88格的棋盘。为了完成此例,需要先了解Shell脚本中echo显示内容带颜色显示的方法及格式,其中“F”为字体颜色,编号为3037;“B”为背景颜色,编号为4047。echo显示带颜色需要使用参数“-e”,格式为:echo-e033B;Fm字符串0330m或者ec

30、ho-e033F;Bm字符串0330m6.4.3嵌套循环其中,B和F有其一亦可,具体的范围及颜色见表6-5。6.4.3嵌套循环下面进行【例6-15】的Shell脚本编写。rootfishyoung#vimfor6.shrootfishyoung#catfor6.sh#!/bin/bashfor(i=1;i=8;i+)dofor(j=1;j/root/first.crond每个字段(空格分隔)的数字从左到右依次为分(059)、时(023)、日(131)、月(112)、星期(07,0和7代表星期天)、命令行。以上内容的含义是:在4月30日(这一天必须是星期一)的15点15分执行命令。echocro

31、ntab创建第一个计划/root/first.crond6.5计划任务服务程序下面进行知识点的验证。6.5计划任务服务程序cron计划任务的内容不算太难,下面通过6个例题牢固掌握cron的应用。(1)每天凌晨2点30分清除/var/log/yum.log文件。302*echo/var/log/yum.log(2)每周六4点执行“/bin/sh/root/backup.sh”。04*6/bin/sh/root/backup.sh(3)每月15日3点20分执行“/bin/sh/root/backup_month.sh”。20315*/bin/sh/root/backup_month.sh6.5计划

32、任务服务程序(4)每隔6小时执行“/bin/sh/root/who.sh”。0*/6*/bin/sh/root/who.sh(5)每天的2点、13点、19点执行“/bin/sh/root/test.sh”。02,13,19*/bin/sh/root/test.sh(6)每天的10点到18点执行“/bin/sh/root/test2.sh”。010-18*/bin/sh/root/test2.sh6.5计划任务服务程序需要说明的是,除了用逗号(,)来分别表示多个时间段,如“2,13,19”表示2点、13点和19点,还可以用减号(-)来表示一段连续的时间周,如字段“时”的取值为“10-18”,则表

33、示每天的1018点,以及用除号(/)表示执行任务的间隔时间,如“*/6”表示每隔6小时执行一次任务。如果在cron服务中需要同时包含多条计划任务的命令语句,应每行写一条。例如,再添加一条计划任务,它的功能是每周一至周五的凌晨2点自动清空/tmp目录内的所有文件。尤其需要注意的是,在cron服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,可用whereis命令进行查询。6.5计划任务服务程序6.6Shell脚本案例:批量创建特殊要求账户建议尽量思考并自行完成案例之后再参考答案,以检验自己对Shell脚本知识的掌握情况。批量创建20个系统账号(fishyoung001

34、fishyoung020),并进行密码设置(密码为随机值,要求是字符和数字混合的8位数);把账号和密码保存到文本文档中作为备份以供查看;在操作过程中的提示被保存到文本文档中,屏幕不输出任何提示,当全部用户创建且加密完成后输出提示语。6.6Shell脚本案例:批量创建特殊要求账户思路:(1)创建20个账号。方法一:seq-w020/输出等宽步长为1的序列方法二:echo001.020(2)无交互的设置密码。echo新密码|passwd-stdinzs必须先创建用户6.6Shell脚本案例:批量创建特殊要求账户(3)随机8位混合密码。echo$RANDOM|md5sum|cut-c8-15(4)把

35、账号密码备份到文档。echo-e$usert$passwordUserDetail.txt(5)仅输出最后提示。6.6Shell脚本案例:批量创建特殊要求账户具体的实现代码如左图。(图片未完见下页)6.6Shell脚本案例:批量创建特殊要求账户6.6Shell脚本案例:批量创建特殊要求账户6.7实训6编写并运行Shell脚本程序1.实训目的(1)掌握Shell变量的使用方法。(2)熟悉Shell程序设计。(3)了解循环控制符的使用。6.7实训6编写并运行Shell脚本程序2.实训内容(1)编写一个Shell脚本,找出100以内所有能被3整除的数,每行显示7个数,然后换行显示。(2)编写一个Sh

36、ell脚本,让用户输入一个数字,计算1n的所有偶数和。(3)编写一个Shell脚本,当运行该脚本时,可以显示:用户目前的身份和用户目前所在的目录。(4)编写一个Shell脚本,其作用是:先查看一下/root/test这个名称是否存在;若不存在,则使用touch来创建一个普通文件,创建完成后离开;如果存在,判断该名称是否为普通文件,若为普通文件则将其删除后创建一个目录,文件名为test,之后离开;如果存在,而且该名称为目录,则移除此目录。6.7实训6编写并运行Shell脚本程序(5)编写一个Shell脚本,将/etc/passwd的第一栏取出,然后让每一栏都以一行字符串“The1userisro

37、ot”来显示,其中1表示行数。(6)编写一个Shell脚本,实现每日凌晨2点整将/etc/目录打包压缩到/root目录中,命名规则为etcYYYY-mm-dd.tar。6.7实训6编写并运行Shell脚本程序(7)编写一个生成脚本的脚本createsh.sh,当执行如createsh.shtest.sh时,会自动在/root目录下新建一个名为test.sh的新文件,该文件会自动被赋予执行权限,同时自动在文件头上加上#!及注释信息,然后自动使用Vim打开,等待用户开始编写脚本正文。注释信息如下。#!/bin/bash#-#Filename:test.sh/此处会根据文件名自动更换#Revision:1.0#Date:2018-04-30/此处会自动变换为当前日期#Author:Fishyoung#-#Copyright:2018Fishyoung6.7实训6编写并运行Shell脚本程序3.实训要求(1)按题目要求写出相应的命令(“文字+截图”方式)。(2)总结实训心得与体会。6.7实训6编写并运行Shell脚本程序谢谢观看!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁