您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 商业计划书 > shell脚本练习题
shell脚本例子集锦(习题总结)练习一:写一个脚本1.设定变量FILE的值为/etc/passwd2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么形如:(提示:LINE=`wc-l/etc/passwd|cut-d-f1`)Hello,root,yourUIDis0.3.统计一个有多少个用户答案一:#!/bin/bashfile=/etc/passwdLINES=`wc-l$file|cut-d-f1`forIin`seq1$LINES`;douserid=`head-$I$file|tail-1|cut-d:-f3`username=`head-$I$file|tail-1|cut-d:-f1`echohello$username,yourUIDis$useriddoneechothereare$LINESusers答案二:#!/bin/bashfile=/etc/passwdletnum=0forIin`cat$file`;dousername=`echo$I|cut-d:-f1`userid=`echo$I|cut-d:-f3`echoHello,$username,yourUIDis$useridnum=$[$num+1]doneechothereare$numusers练习二:写一个脚本1.切换工作目录至/var2.依次向/var目录中的每个文件或子目录问好,形如:(提示:forFILEin/var/*;或forFILEin`ls/var`;)Hello,log3.统计/var目录下共有多个文件,并显示出来答案:#!/bin/bashcd/varletnum=0forIin`ls/var/*`;doechohello$Inum=$[$num+1]doneechothenumberoffilesis$num练习三:写一个脚本1.设定变量file的值为/etc/passwd2.使用循环读取文件/etc/passwd的第2,4,6,10,13,15行,并显示其内容3.把这些行保存至/tmp/mypasswd文件中答案:#!/bin/bashfile=/etc/passwdforIin246101315;doexec3/tmp/mypasswdline=`head-$I$file|tail-1`echo$lineecho$line&3exec3&-done练习四:写一个脚本传递两个整数给脚本,让脚本分别计算并显示这两个整数的和,差,积,商答案如下:vimtest.sh#!/bin/bashechofirstnumber$1(表示输出第一个数)echosecondnumber$2(表示输出第二个数)echo$(($1+$2))(输出两数之和)echo$[$1-$2](输出两数之差)echo$[$1*$2](输出两数之积)echo$[$1/$2](输出两数之商):wq(表示保存并退出vi编辑器)chmod+xtest.sh(给test.sh执行的权限)./test.sh23(传递两个参数并执行脚本作业一:写一个脚本:1.创建目录/tmp/scripts2.切换工作目录至此目录中3.复制/etc/pam.d目录至当前目录,并重命名为test4.将当前目录的test及其里面的文件和子目录的属主改为redhat5.将test及其子目录中的文件的其它用户的权限改为没有任何权限答案:#!/bin/bashmkdir-v/tmp/scriptscd/tmp/scriptscp-r/etc/pam.d./testchown-Rredhat./testchmod-Ro=---./test作业二:写一个脚本1.显示当前系统日期和时间,而后创建目录/tmp/lstest2.切换工作目录至/tmp/lstest3.创建目录a1d,b56e,6test4.创建空文件xy,x2y,7325.列出当前目录下以a,x或者6开头的文件或目录6.列出当前目录下以字母开头,后跟一个任意数字,而后跟任意长度字符的文件或目录答案:#!/bin/bashdatemkdir-pv/tmp/lstestcd/tmp/lstestmkdira1db56e6testtouchxyx2y732ls[ax6]*ls[[:alpha:]][[:digit:]]*作业三:写一个脚本添加10个用户user1到user10,但要求只有用户不存在的情况下才能添加答案:#!/bin/bashforIin`seq110`;docut-d:-f1/etc/passwd|grepuser$I2/tmp/etc.err||useradduser$Idone作业四:写一个脚本通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线如果在线,就显示“ipisup”如果不在线,就显示“ipisdown”答案:#!/bin/bashforIin`seq151254`;doping-c1-w1192.168.0.$I&/dev/null&&echo192.168.0.$Iisup||echo192.168.0.$Iisdowndone例题:shell1.sh显示日期和时间。#!/bin/bashecho“currenttimeis`date`”//date要加反引号shell2.sh显示文件名,并显示位置参数(执行时带一个参数)。(①$0是一个特殊的变量,它的内容是当前这个shell程序的文件名;②$1是一个位置参数,位置参数之间用空格分隔,shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依次类推。)#!/bin/bashecho“theprogramnameis$0”//$0是一个特殊的变数echo“thefirstparais$1”//$1是一个位置参数echo“theprogramexit”//执行时带一个参数如./shell2.shabcdshell3.sh判断并显示位置参数#!/bin/bashif[-d“$1”];thenecho“$1isdirectory,existed”elseecho“$1doesnotexist,nowcreateit”mkdir$1echo“$1iscreated”fi//执行时带一个参数shell4.sh问候用户#!/bin/bashuser=`whoami`case$userinteacher)echo“helloteacher”;;root)echo“helloroot”;;*)echo“hello$user,welcome”esac1、求1+2+3+...+100的和是?#!/bin/bashSUM=0I=0while[$I-le100]doSUM=$((SUM+I))I=$((I+1))doneecho由1+2+3+...+100的和是:$SUM2、(基训十一)在根目录下有四个文件m1.txt,m2.txt,m3.txt,m4.txt,用Shell编程,实现自动创建m1,m2,m3,m4四个目录,并将m1.txt,m2.txt,m3.txt,m4.txt四个文件分别拷贝到各自相应的目录下。#!/bin/bashcd/touchm1.txtm2.txtm3.txtm4.txtI=1while[$I-le4]domkdirm$Icpm$I.txtm$II=$((I+1))done3、(基训十二)编写一个名为myfirstshell.sh的脚本,它包括以下内容。a)包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的。b)问候用户。c)显示日期和时间。d)显示这个月的日历。e)显示您的机器名。f)显示当前这个操作系统的名称和版本。g)显示父目录中的所有文件的列表。h)显示root正在运行的所有进程。i)显示变量TERM、PATH和HOME的值。j)显示磁盘使用情况。k)用id命令打印出您的组ID。m)跟用户说“Goodbye”#!/bin/bash#09嵌入5号贾德进myfirstshell.shshell的简单编程user=`whoami`case$userinroot)echohelloroot;;teacher)echohelloteacher;;*)echohello$user,welcomeesacecho日期和时间:`date`echo本月的日历:`cal`echo本机的机器名:`uname-n`echo当前这个操作系统的名称和版本:`uname-s;uname-r`echo父目录中的所有文件的列表:`ls../`echoroot正在运行的所有进程:`ps-uroot`echo变数TERM的值:$TERMecho变数PATH的值:$PATHecho变数HOME的值:$HOMEecho磁盘的使用情况:`df`echo用id命令打印出你的组ID:`id-g`echoGoodbye!4、(基训十三)设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限为rwxr-xr—#!/bin/bashcd/userdataI=1while[$I-le50]domkdir-puserdata/user$Ichmodo-xuser$II=$((I+1))done5、(基训十四)编写shell程序,实现自动删除50个用户账号的功能。账号名为stud1至stud50。#!/bin/bashcd/userdataI=1while[$I-le50]domkdir-puserdata/user$Ichmodo-xuser$II=$((I+1))done6、(基训十四)设计一个shell程序,备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。#!/bin/bashDIRNAME=`ls|root|grepbak`if[-z$DIRNAME];thenmkdir/root/bakcd/root/bakfiYY=`date+%y`MM=`date+%m`DD=`date+%d`tarczvf${YY}${MM}${DD}_etc.gz/etcechoetcbakfinshied7.输入一个“monthdayyear”格式的日期串,程序将处理”month”为其英文单词的前三个字母,第一个字母大写,其余的小写。思路:首先判断month是数字、还是单词,若是数字,则可查“数字—month”映射表(自定义case结构);若是单词,则取前三个字母,并格式化。函数monthnoToName()将month数字转换为month名monthnoToName(){case$1in1)month=Jan;;2)month=Feb;;3)month=Mar;;4)month=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:Unknownnumericmonthvalue$1&2;exit1#default,esac#return0}假设通过传三个参数到脚本——monthdayyear----------实现代码------------------------------#!/bin/bashif[$#-ne3];then#若参数个数不为3,则有误echo“Usage:$0monthdayyear”exit1fi#判断参数1是数字还是单词,方法替换串中所有数字,若结果为空,则为数字,否则为单词。if[-n$(echo$1|sed‘s/[[:digit:]]//g’)]#-n检测串是为空thenmonthnoToName$1#数字else#取第一个字母并将其变为大写,再将结果与取出的第二三字母组合month=”$(echo$1|cut–c1|tr'[:lower:
本文标题:shell脚本练习题
链接地址:https://www.777doc.com/doc-7152575 .html