《shell脚本编程》PPT课件.ppt_第1页
《shell脚本编程》PPT课件.ppt_第2页
《shell脚本编程》PPT课件.ppt_第3页
《shell脚本编程》PPT课件.ppt_第4页
《shell脚本编程》PPT课件.ppt_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

College of Information Science and Engineering Shandong Agricultural University SHELL脚本编程 1 shell脚本能提高用户操作和管理员 进行系统管理的效率,一般步骤 n编辑器编写脚本程序 nshell做解释程序,非交互地执行脚本 ,两种执行方式: n用sh命令执行脚本文件 n给脚本文件添加执行权限,用./命令执 行 2 HELLO WORLD! n vi hello.s n按i进入插入模式 n输入echo “hello world!” n:输入wq保存退出 n sh hello.s 或者 chmod 755 hello.s ./hello.s 3 一、VI编辑器 nVI的三种工作模式 nVI的启动 nVI的退出 nVI的文本编辑 n VI命令模式下的操作 n VI行命令模式下的操作 VI 编辑器的使用 4 n 系统配置文件、shell脚本文件等都是文本文 件,编辑它们都要使用文本编辑器。 n 在Linux系统中有多种文本编辑器,其中既有 字符界面如的VI、EMACAS等,也有图形界面 的如“附件”菜单下的“文本编辑器(gedit )”等,用户可以根据自己的喜好选择使用 。 n 学习vi的方法: vi的命令太多且难以记忆,而实际上真正 经常使用的命令并不是太多,只要掌握几个 关键的并加以适当练习很快就上手使用vi。 5 为什么选择VI n 就使用的方便性而言,有比vi更好的编辑器,还要图 形化的edit,为什么还要用vi? p历史久远,功能强大,在有些情况下系统中能 够找到的编辑器只有vi; p用户一旦熟悉后,使用非常方便;系统管理员 使用正则表达式可以极大地提高工作效率,而学习 vi也是掌握正则表达式的有效途径。 n 由于vi的版本不同,其命令格式、功能和用法会有一 些差别。Shell中执行vi命令,RedHat系统实际上是 执行vim,它是传统vi的增强版本 6 1、VI的三种工作模式 n 命令模式 p启动VI默认进入命令模式。此时界面不能 编辑,只能接受命令(键入的命令看不到) p文件的保存,退出,文本的删除、复制、 搜索等操作 n 输入模式 p编辑模式 p命令模式下用i(sert),a(ppend),o,s等均 可进入该模式。按esc返回命令模式 n 行编辑模式 p实际上也是命令模式的一种,在命令模式 下输入冒号进入一个命令行,可显示地输入命 令(所以也有些书认为是两种工作模式)。 三种模式可自由切换,一般切换命令就是操作的英文单词 的首字母 7 2、VI的启动 n 启动命令:vi my.txt n 如果文件存在,则vi显示文件内容并等待用 户的命令。 n 如果指定的文件不存在,则vi将告知用户这 是未命名的文件,并进入一个空白的界面。 n 启动vi时都是默认处于命令模式。用户必须 使用命令切换到文本输入模式才能进行输入 编辑,或者可执行删除、复制等编辑命令。 vi R file_name,以只读读方式打开文件 8 3、VI的退出 n 冒号进命令行模式下: :q! 不存档强制退出。 :w 保存但不退出,w(rite)后可加所要存档的文 档名。 :wq 存档后退出。 p命令模式下按zz,功能与 :wq 相同。 p:x 与:wq相同 n 命令模式: ZZ、ZQ保存/不保存退出 9 4、怎么编辑 必须从命令模式转入插入模式才能进行输入 编辑,可用命令有: n 新增 (append) pa :从光标所在位置后面开始新增资料 pA: 从光标所在行最后面的地方开始新增资 料。 n 插入 (insert) pi: 从光标所在位置前面开始插入资料 pI :从光标所在行的第一个非空白字元前面 开始插入资料。 n 开始 (open) po :在光标所在行下新增一列并进入输入模 式。 O: 在光标所在行上方新增一列并进入输入模式 。 冒号进入行命令模式,输入set nu可设置vi显示行号 10 5、命令模式下的操作:删除 n x: 删除光标所在字符 n dw 删除一个单词 n dd :删除光标所在的行 n u:恢复被删除的文字 n s:删除光标所在字节 ,并进入输入模式 #表示数字 n #x 删除几个字符,如 3x n #dw 删除几个单词,如 3dw表示删除三个单词 n #dd 删除多个行,如 3dd 表示删除光标行及 光标的下两行 n d$ 删除光标到行尾的 内容 d光标键: 左:删除光标前面的字符; 右:删除光标所在的字符; 上:将当前行与上一行删除; 下:当前行与下一行删除 nd上下光标键: 删除当前行之上、下的几行文 本(包括当前行) 11 命令模式下的操作:文本复制、粘贴 n 复制命令:y pyy: 复制整行 pyw:复制光标所在的单词 pnyw:复制包括光标所在的n个单词 pnyy:复制包括当前行在内的n行 n 粘贴命令 pP n 光标移动 ph、j、k、l pnG:移动到底n行行首 12 通用缓冲区和专用缓冲区 n 一般情况下,最近一次的抽取、删除、插入和修改的 内容都将存放在通用缓冲区中。利用这些缓冲区可以 非常方便地实现文本内容的剪切和粘贴。 n 专用缓冲区的名字采用双引号加单个字母表示,如”a ,”b等等 p命令模式下输入”ayy,是将当前行的内容复 制到专用缓冲区a中。输入”ap,则将专用缓冲区中 的内容粘贴到光标位置之后。 p对单个文件的编辑,专用缓冲区没有什么优势 ,对多个文件编辑才能体现专用缓冲区的优势:从 当前文件切换到下一个文件时通用缓冲区的内容会 丢失,而专用缓冲区的内容却依然存在。 13 n 示例:将当前行开始的4行内容向后移动8行。 p4dd是删除4行,vi自动将这4行的内容保存在 通用缓冲区中; p8j表示将光标向后移动8行; pp表示从通用缓冲区中取出内容,粘贴在光标 位置后面。由于dd命令使通用缓冲区的内容以行为 单位存放,当取出缓冲区的内容时,vi将它们粘贴 在当前行之后。 n 示例:将某文本文件中的两行复制到新位置。 p2yy,表示从当前行开始抽取两行到通用缓冲 区。 p再将光标移动到目标行的位置后,输入p复制 。 14 6、行命令模式下的操作:字符串的查找、替换 n :/string搜索指定的字符串。 p按键n:继续进行搜索 如果写的是斜杠(/):按n会从当前位置向 后查找;如果写的是问号(?),按n键则从当前 位置向前查找 n 查找且替换 p:%s /SEARCH /REPLACE 把文档中所有SEARCH替换成REPLACE ; p:#,# s /SEARCH /REPLACE /g 号表示数字,表示从多少行到多少行, 把SEARCH替换成REPLACE; p:s /SEARCH /REPLACE /g 把当前光标所在行中的SEARCH单词,替 换成REPLACE,并把所有SEARCH高亮显示 15 * 与当前文件有关的读写操作 n :r file_name p导入文件内容添加到光标所在行后 n :n1,n5 w file_name p从第n1行到n5行的内容保存到文件file_name中 p如果是从当前行到倒数第三行,也可以表示为 .,$-2;如果指定的文件已存在,则vi将给出“File exists”的错误信息,可用下面的命令: n :n1,n5 w file_name p将指定的文件内容附加重定向地添加到一个已经 存在文件的尾部。 16 * VI操作中执行其他shell命令 用户在编辑文本文件过程中,可以在不退出vi 的情况下执行shell命令,行命令模式输入 :!命令 例如: :!ls l :!mount /dev/sda1 /mnt 命令执行完成后,系统会提醒用户按任意键返 回vi编辑器中继续文本文件的编辑工作。 17 文本输入状态命令状态行编辑状态 按ESC键 按A,I,S,C,O 等命令 按“:”键 执行非退出命 令,如w 三种模式间的转换关系 18 案例练习 n 1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录; n 2. 进入 vitest 这个目录当中; n 3. 将 /etc/man.config 拷贝到本目录底下 n 4. 使用 vi 开启本目录下的 man.config 这个档案; n 5. 在 vi 中设定一下行号; n 6. 移动到第 58 行,向右移动 40 个字符,请问您看到的双引 号内是什么目录? n 7. 移动到第一行,并且向下搜寻一下“bzip2”这个字符串, 请问他在第几行? n 8. 接着下来,我要将 50 到 100 行之间的 man 改为 MAN,并 且一个一个挑选是否需要修改,如何下达指令? n 9. 修改完之后,突然反悔了,要全部复原,有哪些方法? n 10. 我要复制 51 到 60 行这十行的内容,并且贴到最后一行 之后; n 11. 删除 11 到 30 行之间的 20 行; n 12. 将这个文件另存成一个 man.test.config 的文件; n 13. 到第 29 行,并且删除 15 个字符; n 14. 储存后离开 19 n 1. mkdir /tmp/vitest n 2. cd /tmp/vitest n 3. cp /etc/man.config . n 4. vi man.config n 5. :set nu n 6. 先按下 58G 再按下 40 会看到 /dir/bin/foo 这个字样 在双引号内; n 7. 先执行 1G 或 gg 后,直接输入 /bzip2 n 8. 直接执行 :50,100s/man/MAN/gc 即可 n 9. (1)简单的方法可以一直按 u 恢复到原始状态,(2)使用 不储存离开 :q! 之后,再重新读取一次该文件; n 10. 51G 然后再 10yy 之后按下 G 到最后一行,再p粘贴 10行 n 11. 11G 之后,再给他 20dd即可删除 20 行了; n 12. :w man.test.config n 13. 29G 之后,再给他 15x 即可删除 15 个字符; n 14. :wq! 20 二、SHELL变量与语法 Shell概述 shell变量和符号 shell控制流程语法 shell中的输出重定向 脚本实例 SHELL变量与语法 21 1、shell的基本元素 (1) #!/bin/bash 必须的,指出shell的类型 (2)# 注释 (3)变量 (4)控制 一、Shell概述 一个shell脚本 vi clearup.sh #!/bin/bash # this is clear cd /var/log cat /dev/null/var/log/messages /dev/null Linux中的无限大的垃圾回收站 echo “Logs cleaned up.“ 22 2、一般步骤: (1)编辑文件 (2)保存文件 (3)将文件赋予可执行的权限 (4)运行及排错 23 注意: p一般以.sh为文件后缀。没有也能执行。 p常见的两种执行方式 n./文件名在当前目录下写明路径执行,要求文 件必须有执行权限,如 chmod 755 run.sh ./run.sh nsh 文件名 sh run.sh p文件开头指定一个或多个解释脚本程序的shell ,如#!/bin/bash n如果指定,注意/bin不要漏了“/”,否则用./方 式执行会找不到路径。 n不指定的话一般默认以/bin/sh执行shell脚本 24 3、Shell的一般结构 shell 类型 函数 主过程 一般模板 abc.sh #!/bin/bash shell类型 #a simple shell script example #a function funciton sayhello() 函数 echo “Enter Your name:“ read name 读取来自键盘输入的变量 echo “Hello $name“ echo “programme starts here.“ 主过程 sayhello echo “programme ends.“ 25 1、注释符# 除了#!/bin/bash里的#特殊 2、美元符 $ 变量符。与反斜杠转义符相反,使其后的普通 字符作为变量名,如$a表示变量a的值。变量字符 长度超过1个时,用括起来 3、单引号 被引起的字符全部做普通字符,即全部原样 echo my $SHELL 二、Shell中的特殊符号 26 4、双引号 引号内的内容,除$、转义符、倒引号这三 个保留特殊功能,其他字符均做普通字符。 5、倒引号(数字1键旁边的那个键) 引号内的字符串当做shell命令行解释执行, 得到的结果取代整个倒引号括起来的部分。 pwd即pwd命令的执行结果 $LOGNAME系统变量 27 练习一下:区别下面几句 n echo my home is $HOME n echo “my home is $HOME” n echo my home is $HOME n echo “my home is pwd” n echo my home is pwd 用于括起来shell命令 用于原样显示 28 6. 反斜线 反斜线是转义字符,它能把特殊字符变成普通字 符。在某个字符前面利用反斜杠()能够阻止shell 把后面的字符解释为特殊字符。 例4: yuqunyuqun $echo “Filename is N0$*” Filename is N0$* 注意:在单引号括起来的字符串中,反斜线也成 为普通字符,而失去转义字符功能。 29 三、变量 shell 变量 可以保存如路径名、文件名或者一个数字 n 本地变量 局部变量只在创建它们的Shell中使用,可以 在shell程序内任意使用和修改它们。 n 环境变量 可以在创建它们的Shell及其派生出来的任意 子程序中使用。有些变量是用户创建的,其他的则是专用 的(比如PATH、HOME)。是系统环境的一部分,不必去定 义它们,可以在shell程序中使用它们 。还能在shell中 加以修改。 n内部变量 由系统提供的。与环境变量不同,但用户不能 修改它们。 30 本地变量和环境变量的对比 31 1、本地变量(局部变量、用户变量) u本地变量 在用户现在的shell生命期的脚本中使用 u 变量名=值 注意: (1)等号两边不可以有空格 (2)取值包含空格,必须用双引号括起来 (3)Shell变量可以用大小写字母,区分大小写 32 u变量的声明和使用 (1)变量是弱类型的(不用声明类型) (2)变量声明及赋值格式 变量=值(等号两边不能有空格) (3)变量的引用 $变量名 $变量名 变量名为1个字符时建议使用方式一,多余一个字 符时建议使用方式二 举例: $a $abc 33 u显示变量 echo命令可以显示单个变量取值,变量名前加$ echo $Name echo $name echo $nameare echo $name are 输出引用变量时加比较好 34 u清除变量 unset 变量名 举例:echo $name unset name (注意:name前没有$) 显示本地所有变量 set 35 u设置只读变量 设置变量时,不想再改变其值,可以将之设为只读变量 变量名=值 readonly 变量名 36 2、环境变量 环境变量用于所有用户进程(通常称为子进程)。登陆进程称 为父进程,通过pstree可以查看 u环境变量可以用于所有子程序,着包括编辑器、脚本和应用 举例:vi a.sh #!/bin/bash # 检测环境变量 echo “家目录是 $HOME“ u 环境变量可以在命令行中设置,但用户注销时这些值将丢失 u 环境变量均为大写 u 必须用export命令导出 37 n 设置环境变量 p variable-name=value p export variable-name(环境变量名大写) n 显示环境变量 p env 可以看到所有的环境变量 p echo $环境变量名 (显示一个变量) n 清除环境变量 p unset 环境变量名 38 uHOME : 代表使用者的家目录。cd 去到使用者的家目录 或者利用 cd 就可以直接回到使用者家目录了。 uPS1:shell的主提示符 u SHELL : 目前这个环境使用的 SHELL 是哪个程序? 如果是 bash 的话 ,预设是 /bin/bash uPWD:用户当前工作目录的路径。它指出用户目前在Linux文件系统中处在 什么位置。它是由Linux自动设置的 u HISTSIZE : 这个与“历史命令”有关,曾经下达过的指令可以被系统 记录下来,而记录的“数目”则是由这个值来设定的。 u ENV : 这个使用者所使用的个性化环境设置文件的读取文件。 uMAIL : 当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱 文件 (mailbox)。 u PATH : 就是执行文件搜寻的路径,目录与目录中间以冒号(:)分隔, 由于文件的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序 也是重要的喔。 uLANG : 语系文件,很多数据都会用到他,当出现编码错误的时候往往需 要设置它,中文编码是zh_CN.UTF839 PATH示例 n 举例:配置java环境变量可使任何目录都能执行javac命令 (1)需要配置Java环境变量 u JAVA_HOME(JDK存放的路径) u CLASSPATH(字节码的位置,让JVM知道要运行的类的字节码 放在哪) u PATH (让OS找到javac等命令的存放的位置) (2)在Linux下配置它们 u 打开终端 u vi .bash_profile u 在配置文件中追加内容 JAVA_HOME=JDK存放位置 CLASSPATH=.(当前目录) PATH=$JAVA_HOME/BIN:$PATH(不覆盖原来的内容,追加) export JAVA_HOME CLASSPATH PATH u 保存,让配置起作用(source .bash_profile或者注销) 40 让环境变量的修改在退出shell再次登录时仍有 效,需要在相关配置文件中修改 1.用户登录Linux涉及环境变量的配置文件有? p有:/etc/profile、/.bash_profile、 /.bashrc、/etc/bashrc 2.文件访问顺序如何? p在上述文件中都加入一句:echo “文件名” ,如 echo “echo “oh! enter /etc/profile“ /etc/profile pexit退出登录,重新用root登录看看输出的语 句,得到配置文件的使用顺序: /etc/profile /.bash_profile /.bashrc /etc/bashrc 41 3.上述配置文件的作用 1)登录Linux先启动系统配置文件/etc/profile,并从 /etc/profile.d目录的配置文件中搜集shell的设置 ,为系统的每个用户设置环境信息。 2)用户配置文件/.bash_profile,每个用户专用于自 己使用的shell信息,仅用户登录时执行一次! 默认情况下,此文件通过脚本执行同目录下用户的 .bashrc文件。 3)/.bashrc文件包含专用于用户bash shell的bash信 息,登录及每次打开新的shell时都会执行。里面又会 调用/etc/bashrc 42 设置用户自己的环境变量 n 在/home/user/.bash_profile中定义下句,会怎样? alias la=ls a|grep “.*” 答:user下次再登陆,其shell会自动建立一 个别名命令la,功能为查看当前目录下名字以.开 头的文件。 p写在/.bash_profile中,需重新登录才能有 效。除非运行source .bash_profile使其立即有效 。 p写在/.bashrc中,则打开新的终端中就有效 n 读脚本,了解更多配置文件 p读etc/rc.d目录下的系统启动运行的脚本,可 以了解/etc下的各种配置文件的作用、如何修改、 修改后有什么效果等等。 43 3、内部变量 内部变量是Linux所提供的一种特殊类型的变量, 这类变量在程序中用来作出判断。在shell程序内 这类变量的值是不能修改的。 部分内部变量是: u$# 传送给shell程序的位置参数的数量 u$?最后命令的完成码或者在shell程序内部执 行的shell程序(返回值) u$0shell程序的名称 u$*调用shell程序时所传送的全部参数的单字 符串, “参数1”“参数2”形式保存的参数 44 u $“参数1”“参数2”形式保存的参 数 u $n第n个参数 u $本程序的PID u $!上一个命令的PID 45 使用shell预定义变量的脚本举例 46 4 位置参数 (1) 位置参数及引用 可以编写一个shell脚本,当从命令行或者从其他shell 脚本中调用它的时候,这个脚本接收若干参数。这些选项 是通过Linux作为位置参数(positional parameter)提供 给shell程序的。在shell脚本中应有变量,接收实参,这 类变量的名称很特别,分别是1,2,3,这类变量称为 位置变量。位置参数1存放在位置变量1中,位置参数2存放 位置变量2中,在程序中可以使用$1,$2,来访 问, 举例: 47 (2) 用set命令为位置参数赋值 在shell程序中可以利用set命令为位置参数赋值或重 新赋值。 一般格式: set 参数表 说明:该命令后面无参数时,将显示系统中的系统变 量的值;如果有参数将分别给位置参数赋值。 48 四、变量表达式 1、条件判断命令test test n1 -参数 n2(或 参数 表达式) 真返回0,假返回1。 (1)整数,比较运算符见右表 test 1 lt 4 #判断10 4、其他参数 -a 逻辑与 -o 逻辑或 ! 逻辑非 50 3、控制流程 n shell运算符和C语言基本类似,也有分支、 循环流程控制。 n 简单举例 后面例子涉及的命令 pseq命令:产生1-9的数字序列 pexpr命令:对表达式求值 p直接求值命令:对被括起来的表达式求值 51 1)分支结构 n if分支 if $# -eq 0 then echo “输入了0个参数” elif $# -lt 1 then echo “输入了多个参数” else echo “输入了1个参数” fi n case case “$#” in 0) echo “输入了0个参数” ; 1) echo “输入了1个参数”; *) echo “输入了多个参数 ”; esac 每个分支条件后必须以 两个分号结尾 52 2)循环结构 n for 例子输出100内10的倍数 for i in seq 1 9 do echo expr $i * 10 done 或写 echo $(expr $i * 10) n乘号前加转义符, 与数字间要有空格。 53 n read 变量1 变量2 p可以从键盘上读取多个变量的值,用户输入数 据时,以空格或者Tab键作为分隔。 p如果输入的数据个数不够,则从左到右对应赋 值,没有输入的变量为空; p如果输入的数据个数超了,则从左到右对应赋 值,最后一个变量被赋予剩余的所有数据。 54 read a b for i in seq $a $b do echo expr $i * 10 done 输出a到b序列数各数的10倍数 55 n while例子求1到100的和 i=1 sum=0 while $i le 100 do sum=$sum+$i i=$i+1 done echo $sum n :直接求值命令 56 五 命令结果重定向 p1stdout标准输出 p2stderr标准错误 n 输出重定向到文件file,终端上只能看到标准错误: #命令 file n 错误重定向到文件file ,终端上只能看到标准输出 : #命令 2file n 标准输出和标准错误都重定向到file,终端上看不到 任何信息: #命令 file 2&1 (等于#命令 1file 2&1) 57 屏蔽命令任何输出的:/dev/null 2&1 cp /etc/my.conf /dev/null 2&1 p/dev/null空设备 n 此句命令的结果是: pcp命令没有目标文件,应该输出错误。 p2&1表示错误重定向指向标准输出。 p/dev/null又使标准输出重定向到空,就 是不要输出信息 p即:一个错误的命令执行,什么功能都不实现,且 没有任何信息或错误提示输出。 58 1)command file 2file 2)command file 2&1 n 有什么区别? 1)的写法,stdout和stderr都直接送到 file中, 会出现两个同抢占file的管道,file会被打 开两次,stdout和stderr输出的信息会互相覆盖。 2)的写法将stdout直接送向file, stderr 继承1的管道后,再被送往file,此时,file 只被打开 了一次,也只使用了一个管道FD1,它包括了stdout和 stderr的内容。 从IO效率上,前一条命令的效率要比后面 一条的命令效率要低,所以在编写shell脚本的时候, 常用command file 2&1 这样的写法。 還可以: 命令 2file &2 命令 &/dev/null 59 * 有趣的IO Redirection $ cat file文件內容会被洗掉 $ cat file此处会没有内容 n stdout、stderr 的管道先准备好才会从 stdin读内容 n file 会先清空 file,然後才读进 /dev/null do sleep 300 done echo “$user has logged on!” fi n说明: (1)如果没有从命令行输入用户名,则测试$# -ne 1为“真”,显示用法 提示信息。 (2)程序中until语句的expression(循环条件)是who|grep “$user” 命令执行的返回码,如果没有找到指定的用户名,返回码为非0(为“假”), 则用sleep命令暂停执行程序5分钟;找到后返回码为0(为“真”),则终止循 环并显示该用户已经登录的信息。 (3)采用重定向到/dev/null空文件的目的是不显示查找到的用户其他信 息。 每隔5分钟检查指定的用户是否登录系统 69 实验8.1 关键代码提示 1)checkuser n a=cut -d: -f1 /etc/passwd | grep -c “$1$” n if $a -gt 0 2)printnumber n 判断参数是否是数 a=$(echo $1|bc 2/dev/dull) if $a != $1 $1参数不是数 pbc计算器,进制转换命令 可自学:4个linux筛选数据常用工具cut, grep, awk, sed 70 截取小数点前后的子串 n $变量名匹配模式 截掉匹配子串后剩余

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论