shell脚本练习题_第1页
shell脚本练习题_第2页
shell脚本练习题_第3页
shell脚本练习题_第4页
shell脚本练习题_第5页
免费预览已结束,剩余22页可下载查看

下载本文档

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

文档简介

1、shell 脚本例子集锦(习题总结)练习一:写一个脚本1. 设定变量FILE 的值为 /etc/passwd2. 依次向 /etc/passwd 中的每个用户问好,并且说出对方的ID 是什么形如:(提示:LINE='wc -l /etc/passwd | cut -d" " -fl')Hello,root , your UID is 0.3. 统计一个有多少个用户答案一:#!/bin/bashfile="/etc/passwd"LINES='wc -l $file | cut -d" " -f1'for

2、 I in 'seq 1 $LINES'douserid='head -$I $file | tail -1 |cut -d: -f3'username='head -$I $file | tail -1 |cut -d: -f1'echo "hello $username,your UID is $userid"doneecho "there are $LINES users"答案二:#!/bin/bashfile=/etc/passwdlet num=0for I in 'cat $file&#

3、39;dousername='echo "$I" | cut -d: -f1'userid='echo "$I" | cut -d: -f3'echo "Hello,$username,your UID is $userid"num=$num+1doneecho "there are $num users"练习二:写一个脚本1. 切换工作目录至/var2. 依次向 /var 目录中的每个文件或子目录问好,形如:(提示:for FILE in /var/*; 或 for FILE in

4、 'Is /var')Hello,log3. 统计 /var 目录下共有多个文件,并显示出来答案: #!/bin/bashcd /varlet num=0for I in 'ls /var/*'doecho "hello $I"num=$num+1doneecho "the number of files is $num"练习三:写一个脚本1. 设定变量file 的值为 /etc/passwd2. 使用循环读取文件/etc/passwd 的第 2,4,6,10,13,15 行,并显示其内3. 把这些行保存至/tmp/myp

5、asswd 文件中答案: #!/bin/bashfile="/etc/passwd"for I in 2 4 6 10 13 15;doexec 3>/tmp/mypasswdline='head -$I $file | tail -1'echo "$line"echo "$line" >&3exec 3>&-done练习四:写一个脚本传递两个整数给脚本,让脚本分别计算并显示这两个整数的和,差,积,答案如下:vim test.sh#!/bin/bashecho "first

6、number $1"(表示输出第一个数)echo "second number $2"(表示输出第二个数)echo " $($1+$2)"(输出两数之和)echo "$1-$2"(输出两数之差)echo "$1*$2"(输出两数之积)echo "$1/$2"(输出两数之商):wqvi 编辑器)chmod +x test.shtest.sh 执行的权限)./test.sh 2 3(传递两个参数并执行脚本作业一:写一个脚本:1. 创建目录/tmp/scripts2. 切换工作目录至此目录中

7、3. 复制 /etc/pam.d 目录至当前目录,并重命名为test4. 将当前目录的test 及其里面的文件和子目录的属主改为redhat5. 将 test 及其子目录中的文件的其它用户的权限改为没有任何权限答案:#!/bin/bashmkdir -v /tmp/scriptscd /tmp/scriptscp -r /etc/pam.d ./testchown -R redhat ./testchmod -R o=- ./test作业二:写一个脚本1. 显示当前系统日期和时间,而后创建目录/tmp/lstest2. 切换工作目录至/tmp/lstest3. 创建目录a1d , b56e ,

8、 6test4. 创建空文件xy, x2y , 7325. 列出当前目录下以a, x 或者 6 开头的文件或目录6. 列出当前目录下以字母开头,后跟一个任意数字,而后跟任意长度字符的文件或目录答案:#!/bin/bashdatemkdir -pv /tmp/lstestcd /tmp/lstestmkdir a1d b56e 6testtouch xy x2y 732ls ax6*ls :alpha:digit:*作业三:写一个脚本添加 10 个用户 user1 到 user10 ,但要求只有用户不存在的情况下才能添加答案:#!/bin/bashfor I in 'seq 1 10&#

9、39;docut -d: -f1 /etc/passwd |grep "user$I" 2>>/tmp/etc.err |useradd user$Idone作业四:写一个脚本通过 ping 命令测试192.168.0.151 到 192.168.0.254 之间的所有主机是否在线如果在线,就显示“ip is up ”如果不在线,就显示“ip is down ”答案: #!/bin/bashfor I in 'seq 151 254'doping -c1 -w1 192.168.0.$I &>/dev/null &&

10、 echo "192.168.0.$I isup" | echo "192.168.0.$I is down"done例题:shell1.sh 显示日期和时间。#!/bin/bashecho “ current time is 'date'” /date 要加反引号shell2.sh 显示文件名,并显示位置参数(执行时带一个参数) 。 ( $0是一个特殊的变量,它的内容是当前这个shell程序的文彳名;$1是一个位置参数,位置参数之间用空格分隔,shell 取第一个位置参数替换程序文件中的 $1 ,第二个替换$2 ,依次类推。)#!/bi

11、n/bashecho “ the program name is $0”/ $0 是一个特殊的变数/ $1 是一个位置参数echo “ the first para is $1如 ./shell2.shecho “ the program exit ”/ 执行时带一个参数abcdshell3.sh 判断并显示位置参数#!/bin/bashif - d “ $1” ;thenecho “ $1 is directory ,existed”elseecho “ $1 does not exist ,now create it”mkdir $1echo “ $1 is created ”fi / 执

12、行时带一个参数shell4.sh 问候用户#!/bin/bashuser='whoami'case $user inteacher)echohello teacherroot)echo “ hello root ” ;*)echo “ hello $user,welcome ”esac1 、 求1+2+3+.+100 的和是?#!/bin/bashSUM=0I=0while $I -le 100 doSUM=$(SUM+I)I=$(I+1)doneecho " 由 1+2+3+.+100 的和是 :$SUM"2 、 (基训十一) 在根目录下有四个文件m1.t

13、xt , m2.txt , m3.txt ,m4.txt ,用 Shell 编程,实现自动创建m1,m2,m3,m4 四个目录,并将 m1.txt,m2.txt,m3.txt,m4.txt 四个文件分别拷贝到各自相应的目录下#!/bin/bash cd /touch m1.txt m2.txt m3.txt m4.txtI=1while $I -le 4 domkdir m$Icp m$I.txt m$II=$(I+1)done3 、 (基训十二) 编写一个名为myfirstshell.sh 的脚本,它包括以下内容。 a) 包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的。b) 问候

14、用户。c) 显示日期和时间。d) 显示这个月的日历。e) 显示您的机器名。f) 显示当前这个操作系统的名称和版本。g) 显示父目录中的所有文件的列表。h) 显示 root 正在运行的所有进程。i) 显示变量TERM 、 PATH 和 HOME 的值。j) 显示磁盘使用情况。k) 用 id 命令打印出您的组ID 。m) 跟用户说“Good bye ”#!/bin/bash# 09 嵌入 5 号 贾德进 myfirstshell.sh shelluser='whoami'case $user inroot)echo "hello root"teacher)ech

15、o "hello teacher"*)echo "hello $user,welcome"esacecho "日期和时间:'date'"echo "本月的日历:'cal'"echo " 本机的机器名:'uname -n'"echo " 当前这个操作系统的名称和版本:'unameecho " 父目录中的所有文件的列表:'ls ./'"的简单编程-s;uname -r'echo "

16、root 正在运行的所有进程:' ps -u root'"echo " 变数TERM 的值 :$TERM"echo " 变数PATH 的值 :$PATH"echo " 变数 HOME 的值 :$HOME"echo "磁盘的使用情况:、df"echo "用id命令打印出你的组ID:'id -g'"echo "Good bye!"4 、 (基训十三) 设计一个Shell 程序,在/userdata 目录下建立50个目录,即useri us

17、er50 ,并设置每个目录的权限为 rwxr-xr 一#!/bin/bashcd /userdataI=1while $I -le 50 domkdir -p userdata/user$Ichmod o-x user$II=$(I+1) done5 、 (基训十四) 编写 shell 程序, 实现自动删除50 个用户账号的功能。账号名为stud1 至 stud50 。#!/bin/bash cd /userdataI=1while $I -le 50 domkdir -p userdata/user$Ichmod o-x user$II=$(I+1)done6 、 (基训十四) 设计一个sh

18、ell 程序,备份并压缩/etc 目录的所有内容,存放在 /root/bak 目录里, 且文件名为如下形式yymmdd_etc , yy 为年, mm 为月,dd 为日。#!/bin/bashDIRNAME='ls |root|grep bak 'if -z $DIRNAME ; thenmkdir /root/bakcd /root/bakfiYY='date + %y'MM='date + %m'DD='date + %d'tar czvf $YY$MM$DD_etc.gz /etc echo "etc bak fi

19、nshied"7 、 ( 基训十四) 某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:( 1 )在下午4 :50 删除 /abc 目录下的全部子目录和全部文件;( 2 )下午 5:50 将 /data 目录下的所有目录和文件归档并压缩为文件:backup.tar.gz ;( 3)在下午5:55 将 IDE 接口的第二个逻辑分区卸载。/ 采用: vi pram.cron#(1) 在下午 4:50 删除 /abc 目录下的全部子目录和全部文件;50 16 * rm -rf /abc/*#(2) 下 午 5:50 将 /data 目 录 下 的 所 有 目 录 和 文

20、 件 归 档 并 压 缩 为 文 件 :backup.tar.gz;50 17 * tar czvf back.tar.gz /data#(3) 在下午 5:55 将 IDE 接口的第二个逻辑分区卸载.55 17 * umount /dev/hda6/ 执行: crontab pram.cron 设计一个Shell程序,在/userdata 目录下建立50个目录,即useriuser50 ,并设置 每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件 所有者所在组的权限为:读、执行。程序实现及注释如下:#! /bin/bash#adddir.sh i=1#while

21、循环while $i -le 50 do#利用test命令-d/userdata :判断/userdata 是否存在,如果存在直接创建子目录, 不#存在先创建/userdata再创建子目录。if -d /userdata then#mkdir-p的意思是:无论父目录/userdata存在与否,都会创建/userdata/user$imkdir -p /userdata/user$ielsemkdir /userdatamkdir -p /userdata/user$ifi#根据题目的意思:/userdata/user$i 应该是具有754权限,所以利用 chmod赋权限。chmod 754 /

22、userdata/user$ii=$($i+1) done函数in_path :判断传入文件是否可执行,若可执行(且存在)返回0,否则返回1;分析:为测试传入文件是否在PATH所有的目录中,需取得 PATH中的每个路径,可用循环,但需要设定环境中的分隔符(借助环境变量IFS)为PATH中的分隔符冒号“:"注:$IFS输入分隔符.当shell读取输入数据的时候,会把一组字符看做是单词之间的分隔字符,它们通常是空格,制表符,和换行符.函数调用方式为:in_path filenamein_path()cmd=$1# $1为函数的参数1 ,以此类推retval=1#定义返回值变量oldIFS

23、=$IFSIFS=:#设置新的IFS,并保存原来的以恢复使用for directory in $PATH#for 循环结构二:for - indoif -x directory/$cmd ; then#if条件语句之 同行表示 以分号隔开retval=0# -x判断文件有是否有可执行权限done doneIFS=$oldIFS#恢复原来 IFS,return retval 注:1.函数的结构,没有形参2 .变量的引用需要符号$,而变量的定义或赋值则不需要。3 .赋值要无间隙,条件要间隙改进:1.将路径、分隔符均作为函数的参数传入,应用得到扩展。补充,in_path函数不能对绝对路径的文件处理,

24、需写个函数对这一情况单独处理 checkForCmdInPath() var=$1#首先判断传入的非空串是否为绝对路径,即检测第一个字符是不是"/",如果是7域接测if $var !="" ; then # 条件等价于-n $varif " $var%$var#?" = then ;#等价于 $(echo $var | cut -c1)if ! -x $var ; thenreturn 1#not found or not executablefielif ! inpath $var ; then return 2#not found

25、 in PATHfi fi 注:此函数让人一头雾水,详解如下:1) 表达式$var%$ var#? 作匹配用,分解为 $var%expr $var#expr , expr为正则表达式(?匹 配单一字符)后者(带#的)返回expr与var匹配成功位置之后的所有内容,此处为var中第一字符之后的所有。前者(带的)返回expr与var匹配成功位置之前的所有内容,此处应为var的第一个字符。等价于 $(echo $var | cut c1 )即取第一字符。等价于 $var:beginpos:size 中 beginpos=0 , size=1 时的结果。var的符号放在外面了,假设 $var为$1,则

26、表达式表示为 $1%$1#?2)关于if的条件判断与C语言中的理解不一致,反映在上述的elif语句中的条件。理解如下:shell中的if条件可以是 表达式(需加方括号口),另外还可以是命令或函数(不需方括号),当命令执行成功时会后继执行具体操作,经测试,C语言中所说的true在shell中 用0表示,即if 0 ,才执行then ,因为linux下的程序实现都是当返回0时表执行成功。3)若函数中没有返回值,则它默认返回0,表执行成功。函数的编写若遵从以上的原则,则对条件的理解 依旧像C语言中的TRUE,FALSE 一样理解=完善程序代码=#!/bin/bashin_path().#函数实现区域

27、 处理不路径返回0表找到、可执行,否则返回1#checkForCmdInPath().#函数实现区域 没找到。默认0表找到处理带路径和不带路径的返回1表没找到或不可执行, 返回2表#代码执行起始位置#if $# -nq 1 ; thenecho “ Usage: $0 command ”行此文件时的输入串为准)exit 0fi#调用函数,并经第一个参数传给函数checkForCmdInpath $1#$0表此执行文件(具体内容 以 执#对函数返回的结果进行判断$? 为函数的返回值,case $? in# case 控制结构的格式,注意红色部分。0)1)2)defaultechofound in

28、 PATH;echo “not found or not executable;”echo "not found "#*);类似于 C 语言中的2 .写一个脚本,检测用户输入串的合法性,要求串由大小写字母、数字组成,无标点、特殊符号、空格。思路:将输入的串中非字母数字的内容删除或替换为空后若和原来输入的相同则合法,否则不合法。isvalidAlphaNum() ( compressed= " $(echo $1 | sed 's/A:alnum:/g')#替换不合要求字符为空if “ $compressed " !=" $1 &

29、quot; ; thenreturn 1# not valideelsereturn 0# validefi )注:1.关于引用变量时是否需要双引号的说明 如果只是输出,可以不用双引号如果变量值代的内容中无空格,表达,特殊符号,在引用时可以不需要双引号,反之,最好带双引 号,否则在变量处理时很有可能会出现“参数过多”等莫名其妙的错误信息。2.关于匹配处理,sed是单行编辑程序。sed ' s/str1/str2/g 'file 将文件file中每行内str1替换为str2:alnum:表示所有字母和数字中的任一个字符。若只是:alnum:则表示方括号中的任一个字符。A:alnu

30、m:表除了所有字母数字外的任一字符。如果是直接向脚本传字符串,则带空格的字串会被脚本自行分解为多个参数,所以可采用从标准输入读取 的方式获得字串。=完善程序代码=#!/bin/bashisvalidAlphaNum().#函数体,判断字串的合法性echo -n " Enter input:# -n强制不换行read input#读取内容存到input中,无$符号if ! isvalidAlphaNum" &input ” ; then#加引号,否则可能会出错。echo “ invalide ” exit 1elseecho “ valide ” fiexit 03

31、输入一个“ month day year ”格式的日期串,程序将处理”month 其英文单词 ”为的前三个字母,第一个字母大写,其余的小写。思路: 首先判断month 是数字、 还是单词,若是数字,则可查 “数字 month ” 映射表 (自定义 case 结构) ;若是单词,则取前三个字母,并格式化。函数 monthnoToName () 将 month 数字转换为month 名monthnoToName() case $1 in1 ) month="Jan" 2 ) month="Feb"3 ) month="Mar" 4 ) m

32、onth="Apr"5 ) month="May" ; 6 ) month="Jun"7 ) month="Jul" ; 8 ) month="Aug" ;9 ) month="Sep" ;10) month="Oct" ;11) month="Nov" ;12) month="Dec" ;* ) echo "$0: Unknown numeric month value $1" >&

33、;2; exit 1# default,esac#return 0假设通过传三个参数到脚本 month day year 实现代码#!/bin/bashif $# -ne 3 ; then#若参数个数不为3,则有误echo “ Usage: $0 month day year”exit 1fi#判断参数1 是数字还是单词,方法替换串中所有数字,若结果为空,则为数字,否则为单词。if - n $(echo $1 | sed :dsig/it: / g ) # -n 检测串是为空thenmonthnoToName $1# 数字else# 取第一个字母并将其变为大写,再将结果与取出的第二三字母组合m

34、onth= " $(echo $1 | cut cl | tr ':lower:' ':upper:')month= ” $month$(echo $1 | cut -c2- 3 | tr ':upper:' ':lower:')fi# 输出结果echo $month $2 $3exit 0注: 1. 外围可以使用函数中定义的变量, 如函数 monthnoToName 中定义的month 变量,最后 echo 会用到它。2. 多管道(| )的使用3. month变量的合并,$var$var4. tr SET1 SET2

35、转换/删除/替换 命令, 将默认 将SET1 替换为 SET2 tr默认从标准输入读取,处理后 写入 标准输出。5. cut - c2-3 file取文件每行第 2 , 3字母。扩展: 处理MM/DD/YYYY or MM-DD-YYYY 的形式。在判断三个参数前执行命令 set - $(echo $1 | sed 's/ -/g')。 set的-命令可以将其后的参数赋予位置参数($1,$2,.)。链接set指令用法4. 格式化输出大数字,使输出结果更容易让人知道该输出数字的数量级。默认用逗号分隔整数部分,用点号分隔整数与小数部分,当然用户也可以使用-d指定整数的分隔符,用-t

36、 指定整数与小数部分的分隔符。算法: 1232342142.423023=> 默认: 1,232,342,142.423023(1)首先分开整数部分integer 和小数部分decimal , sed - d. -f1 和sed - d.-f2分别取两部分。( 2 )整数部分的处理:当作数字来处理%运算/ 运算1 )每次取整数低三位,长度小于3 就补前缀0(避免出现漏0 情况,例如低三位为 003 时,取后便为值3)2 )将此次得到的三位与上一次得到的三位用分隔符(如果没有指定就默认)组合起来。3 )整数去掉低三位,继续操作1 ) 。当此整数小于等于999 就不再继续。当字串来处理: 1

37、)每次取低三位,cut - c $($#str - 2)-$#str$#str 为 str 的长度,必须为大括号 。$( ) 的内部为str 长度 -2 ,代表倒数低三个字符。因为内部是减法,所有此为 双小括号。2 )原串每次都要裁掉尾部三个字符,每次取到的字串的长度为循环判断条件。函数 nicenumber() 作如上处理nicenumber()# 传入 integer.decimal 如 2000023.2 ,32232332 等# 分别取 整数部分和小数部分integer=$(echo $1 | cut- d. - f1)decimal=$(echo $1 ! cut- d. - f2)

38、# 判断小数部分是否存在,因为这涉及连接整数和小数的连接符问题# 设 DD 为 整数和小数之间分隔符,默认为.if - n $decimal ; then#若非空,即有小数部分。# 以下四句可用一句表示:result=$DD”:= ” . ” $remainder$result ”if -z $DD ; then#判断用户是否自定义整数与分隔符,若空DD=.firesult=$DD$decimal# 在小数部分前加分隔符。fi thousand=$integerwhile thousand - gt 999 doremainder=$(thousand%1000)while $#remaind

39、er - It 3 ;do remainder 串的长度remainder=0$remainder时的丢 0 情况。 done#$#remainder# 避免 remainder为 00xthousand=$($thousand/1000)#以下四句可用一句表示:result=$TD:” = ” , ” $remainder$result# 上面蓝色部分表:若TD 非空则返回TD ,否则将”, ”赋给 TD.if -z $TD ; then#判断用户是否自定义整数分隔符若空TD=, fi result= ” $TD$remainder$result 顺序doneif - n $thousand

40、 ; then result=” $thousand$resultelif $result%$result#? =result=” $result#? ”fi echo $result”# 与分隔符合成串。注意# 若 非空”“ $TD” ; then脚本标志参数处理命令:getopts “” var带两个参数,第一个参数为带解析的参数标志序列串(如-f,-c 等) , 以冒号(:)分隔各标志,且以冒号:结束第二个参数为:变量,每执行一次存放参数标志序列串中的一个标志字符返回值:未解析结束返回0 ,解析结束返回1涉及的内定变量:$OPTARG 每次解析标志对应的参数值便默认存放在此变量内。$OP

41、TIND 当各标志处理无误情况下,该数值指示当前用到的此值使用容易出错(若参数的判断不完善时), 还不如用=> 此时 $# 等于 4,各个位置参数的值向一次向左右1 次,此时$1 的值 为原各个位置参数的值向一次向左右2 次,此时$1 的值 为原最大位置参数($# ) 。$#另外 $1, $2, $3, $4, 当执行shift 1 时,$2 的值当执行shift 2 时,$3 的值。完整代码 nicenumber.shnicenumber()# 函数实现部分#处理脚本标志参数while getopts “ d:t: op”tdocase $opt in# $opt为 具体的标志字符d

42、) DD=” $OPTARG”;# $OPTARG 为标志指定的参数值t ) TD=” $OPTARG”;* ) echo “ no arg-flag: $opt ” >&2 exit 1esacdone# 当脚本接收如此多的参数时,$1 将不代表脚本最终要处理的大数字,所以做如下操作。shift $($OPTIND - 1)nicenumber $1exit 0扩展:1. 不同国家整数与小数的分隔符不同,使脚本能够处理各种整数与小数各种分隔符情况。在传给脚本参数时需指定标志-d程序中仅需在分隔 整数与小数部分略修改为integer=$(echo $1 | cut"-

43、d$DD:= " .f1 )”-decimal=$(echo $1 | cut"- d$DDf2 )-2. 另外,可以在程序执行之前分别初始化DD,TD 默认值。3. 检测传给脚本的大数值中是否含有非法的整小数分隔符,即存在与用户指定或默认分隔符不同的符号。方法:删除其中所有数字,看剩下的内容,若不空且不等于$DD ,则非法separator= ” $(echo $1 | sed s/:digit:/g ) ”if -n $separator &&“ $separator ” !=“ $DD” ;then # 蓝色部分可用 一a表不exit 1fi5.检测输

44、入整数的合法性,可负数(-1,-2均合法),可以指定传入整数范围,不在 范围内则报错。参数:1或3个,当3个时,后两个为范围。 合法性:正负数的判断,范围的判断。validint() integer=$1min=$2 max=$3#判断传参的合法性,以下判断是错误的,因为不管参数是否为空,实际上都传了 三个参数。if $# -eq 0 ;then#改成判断$1的内容是否为空,就可以echo" you couldnt do nothing" &2 return 1- fi# 判断是否为负数,第一个字符是否为-,如是,则判断后面的是否为整数。若非负,则判断是否为整数if

45、 “ $(echo $1 | cut- c1>'" =thensigned= - integer= " $integer#? “fi# 如果就是一个符号-,则也是非法的if - z " $integer " ; thenecho “Invalid input, just a -" is not allowed&2 >#注意:>&2 三个字符紧连。return 1fi# 如果非纯数字构成,则非法。if - n " $(echo $integer | sed' s/:digit:g' ) ” ; thenecho “Invalid integer, it includes some char but digit” >&2return 1fiinteger= " $signed$integer ”#范围判断,注意当 min和max为空时(即未传范围),我设定其为$integer,如此判断就不会出错。if $integer - It $

温馨提示

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

评论

0/150

提交评论