shell脚本练习试题_第1页
shell脚本练习试题_第2页
shell脚本练习试题_第3页
shell脚本练习试题_第4页
shell脚本练习试题_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

shell脚本练习试题shell脚本练习试题26/26shell脚本练习试题shell脚本例子集锦(习题总结)练习一:写一个脚本1.设定变量FILE的值为/etc/passwd2.挨次向/etc/passwd中的每个用户问好,而且说出对方的ID是什么形如:(提示:LINE=`wc-l/etc/passwd|cut-d""-f1`)Hello,root,yourUIDis0.统计一个有多少个用户答案一:#!/bin/bashfile="/etc/passwd"LINES=`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`echo"hello$username,yourUIDis$userid"doneecho"thereare$LINESusers"答案二:#!/bin/bashfile=/etc/passwdletnum=0forIin`cat$file`;dousername=`echo"$I"|cut-d:-f1`userid=`echo"$I"|cut-d:-f3`echo"Hello,$username,yourUIDis$userid"num=$[$num+1]doneecho"thereare$numusers"练习二:写一个脚本切换工作目录至/var挨次向/var目录中的每个文件或子目录问好,形如:(提示:forFILEin/var/*;或forFILEin`ls/var`;)Hello,log统计/var目录下共有多个文件,并显示出来答案:#!/bin/bashcd/varletnum=0forIin`ls/var/*`;doecho"hello$I"num=$[$num+1]doneecho"thenumberoffilesis$num"练习三:写一个脚本设定变量file的值为/etc/passwd使用循环读取文件/etc/passwd的第2,4,6,10,13,15行,并显示其内容3.把这些行保留至/tmp/mypasswd文件中答案:#!/bin/bashfile="/etc/passwd"forIin246101315;doexec3>/tmp/mypasswdline=`head-$I$file|tail-1`echo"$line"echo"$line">&3exec3>&-done练习四:写一个脚本传达两个整数给脚本,让脚安分别计算并显示这两个整数的和,差,积,商答案以下:#!/bin/bashecho"firstnumber$1"(表示输出第一个数)echo"secondnumber$2"(表示输出第二个数)echo"$(($1+$2))"(输出两数之和)echo"$[$1-$2]"(输出两数之差)echo"$[$1*$2]"(输出两数之积)echo"$[$1/$2]"(输出两数之商):wq(表示保留并退出vi编写器)(给履行的权限)./test.sh23(传达两个参数并履行脚本作业一:写一个脚本:创立目录/tmp/scripts切换工作目录至此目录中复制/etc/pam.d目录至目前目录,并重命名为test将目前目录的test及其里面的文件和子目录的属主改为redhat将test及其子目录中的文件的其余用户的权限改为没有任何权限答案:#!/bin/bashmkdir-v/tmp/scriptscd/tmp/scriptscp-r/etc/pam.d./testchown-Rredhat./testchmod-Ro=./test作业二:写一个脚本显示目前系统日期和时间,今后创立目录/tmp/lstest切换工作目录至/tmp/lstest创立目录a1d,b56e,6test创立空文件xy,x2y,7325.列出目前目录下以a,x或许6开头的文件或目录列出目前目录下以字母开头,后跟一个随意数字,今后随从意长度字符的文件或目录答案:#!/bin/bashdatemkdir-pv/tmp/lstestcd/tmp/lstestmkdira1db56e6testtouchxyx2y732ls[ax6]*ls[[:alpha:]][[:digit:]]*作业三:写一个脚本增添10个用户user1到user10,但要求只合用户不存在的状况下才能增添答案:#!/bin/bashforIin`seq110`;docut-d:-f1/etc/passwd|grep"user$I"2>>/tmp/etc.err||useradduser$Idone作业四:写一个脚本经过ping命令测试到之间的所有主机能否在线假如在线,就显示“ipisup”假如不在线,就显示“ipisdown”答案:#!/bin/bashforIin`seq151254`;doping-c1-w1192.168.0.$I&>/dev/null&&echo"192.168.0.$Iisup"||echo"192.168.0.$Iisdown"done例题:显示日期和时间。#!/bin/bashecho“currenttimeis`date`”//date要加反引号显示文件名,并显示地点参数(履行时带一个参数)。(①$0是一个特其余变量,它的内容是目前这个shell程序的文件名;②$1是一个地点参数,地点参数之间用空格分开,shell取第一个地点参数取代程序言件中$1,第二个取代$2,挨次类推。)#!/bin/bashecho“theprogramnameis$0”//$0是一个特其余变数echo“thefirstparais$1”//$1是一个地点参数echo“theprogramexit”//履行时带一个参数如abcd判断并显示地点参数#!/bin/bashif[-d“$1”];thenecho“$1isdirectory,existed”elseecho“$1doesnotexist,nowcreateit”mkdir$1echo“$1iscreated”fi//履行时带一个参数问候用户#!/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的和是:$SUM"2、(基训十一)

在根目录下有四个文件

,用

Shell

编程,实现自动创立

m1,m2,m3,m4

四个目录,并将

四个文件分别拷贝到各自相应的目录下。#!/bin/bashcd/I=1while[$I-le4]domkdirm$Icpm$I.txtm$II=$((I+1))done3、(基训十二)编写一个名为的脚本,它包含以下内容。a)包含一段说明,列出您的姓名、脚本的名称和编写这个脚本的目的。问候用户。显示日期和时间。显示这个月的日历。显示您的机器名。显示目前这个操作系统的名称和版本。显示父目录中的所有文件的列表。显示root正在运转的所有进度。显示变量TERM、PATH和HOME的值。显示磁盘使用状况。用id命令打印出您的组ID。m)跟用户说“Goodbye”#!/bin/bash#09嵌入5号贾德进myfirstshell.shshell的简单编程user=`whoami`case$userinroot)echo"helloroot";;teacher)echo"helloteacher";;*)echo"hello$user,welcome"esacecho"日期和时间:`date`"echo"本月的日历:`cal`"echo"本机的机器名:`uname-n`"echo"目前这个操作系统的名称和版本:`uname-s;uname-r`"echo"父目录中的所有文件的列表:`ls../`"echo"root正在运转的所有进度:`ps-uroot`"echo"变数TERM的值:$TERM"echo"变数PATH的值:$PATH"echo"变数HOME的值:$HOME"echo"磁盘的使用状况:`df`"echo"用id命令打印出你的组ID:`id-g`"echo"Goodbye!"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为月,为日。#!/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/etcecho"etcbakfinshied"7、(基训十四)某系统管理员需每日做必然的重复工作,请依据以下要求,编制一个解决方案:(1)在下午4:50删除/abc目录下的所有子目录和所有文件;(2)下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;(3)在下午5:55将IDE接口的第二个逻辑分区卸载。采纳:#(1)在下午4:50删除/abc目录下的所有子目录和所有文件;5016*rm-rf/abc/*#(2)下午5:50将/data目录下的所有目录和文件归档并压缩为文:backup.tar.gz;5017*tarczvfback.tar.gz/data#(3)在下午5:55将IDE接口的第二个逻辑分区卸载.5517*umount/dev/hda6//履行:==========================================================设计一个Shell程序,在/userdata目录下成立50个目录,即user1~user50,并设置每个目录的权限,此中其余用户的权限为:读;文件所有者的权限为:读、写、履行;文件所有者所在组的权限为:读、履行。程序实现及说明以下:#!/bin/bashi=1#while循环while[$i-le50]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赋权限。chmodi=$(($i+1))done

754/userdata/user$i函数in_path:判断传入文件能否可履行,若可履行(且存在解析:为测试传入文件能否在PATH所有的目录中,需获得环,但需要设定环境中的分开符(借助环境变量IFS)为

)返回0,不然返回1;PATH中的每个路径,可用循PATH中的分开符冒号”:”注:$IFS

输入分开符

.

当shell

读取输入数据的时候

,会把一组字符看做是单词之间的分开字符

,它们平常是空格,制表符,和换行符.函数调用方式为:in_pathfilenamein_path(){cmd=$1

#$1

为函数的参数

1,以此类推retval=1

#定义返回值变量oldIFS=$IFS

IFS=:

#设置新的

IFS,并保留本来的以恢复使用for

directory

in

$PATH

#for

循环构造二:

for

indoif[-xdirectory/$cmd

];then

#if条件语句之

同行表示

以分号分开retval=0

#-x

判断文件有能否有可履行权限donedoneIFS=$oldIFS

#恢还本来

IFS,returnretval}注:1.函数的构造,没有形参变量的引用需要符号$,而变量的定义或赋值则不需要。赋值要无空隙,条件要空隙改良:1.将路径、分开符均作为函数的参数传入,应用获得扩展。增补,in_path函数不可以够够对绝对路径的文件办理,需写个函数对这一状况独自办理checkForCmdInPath(){var=$1#第一判断传入的非空串能否为绝对路径,即检测第一个字符能否是”

/”,假如是–,x直接测if[$var!=if[

“”];then“${var%${var#?}}if[!-x$var];thenreturn1

#条件等价于-n$var”=‘then/’];#等价于#notfoundornotexecutable

$(echo$var|cut-c1)fielif!inpath$var;thenreturn2

#notfoundinPATHfifi}注:此函数让人一头雾水,详解以下:1)表达式${var%${var#?}}作般配用,分解为${var%expr}${var#expr},expr为正则表达式(?匹配单调字符)后者(带#的)返回expr与var般配成功地点今后的所有内容,此处为var中第一字符今后的所有。前者(带%的)返回expr与var般配成功地点以前的所有内容,此处应为var的第一个字符。等价于$(echo$var|cutc1)即取第一字符。等价于${var:beginpos:size}中beginpos=0,size=1时的结果。var的符号放在外面了,假定$var为$1,则表达式表示为${1%${1#?}}2)对于if的条件判断与C语言中的理解不一致,反应在上述的elif语句中的条件。理解以下:shell中的if条件能够是表达式(需加方括号[]),其余还能够够够是命令或函数(不需方括号),当命令履行成功时会后继履行详细操作,经测试,C语言中所说的true在shell顶用0表示,即if0,才履行then,由于linux下的程序实现都是当返回0时表履行成功。3)若函数中没有返回值,则它默认返回0,表履行成功。函数的编写若依据以上的原则,则对条件的理解仍旧像C语言中的TRUE,FALSE同样理解==============圆满程序代码=====================================#!/bin/bashin_path()...

#函数实现地区

办理不路径

返回

0表找到、可履行,

不然返回

1###############################checkForCmdInPath()...#函数实现地区办理领路径和不领路径的返回1表没找到或不可以够履行,返回2表没找到。默认0表找到#####################################代码履行初步地点##############if[$#-nq1];thenecho“Usage:$0command”#$0表此履行文件(详细内容以执行此文件时的输入串为准)exit0fi调用函数,并经第一个参数传给函数checkForCmdInpath$1#对函数返回的结果进行判断

$?

为函数的返回值,case$?in

#case

控制构造的格式,注意红色部分。echo“foundinPATH”;;1)echo“notfoundornotexecutable;;”2)echo“notfound”;;#*);;近似于C语言中的default========================================================================2.写一个脚本,检测用户输入串的合法性,要求串由大小写字母、数字构成,无标点、特别符号、空格。思路:将输入的串中非字母数字的内容删除或取代为空后若和本来输入的同样则合法,不然不合法。isvalidAlphaNum(){compressed=

”$(echo$1|sed's/[^[:alnum:]]//g')

#”取代不合要求字符为空if[

“$compressed”!=return1#notvalide

“$1”

];thenelsereturn0

#validefi}注:1.对于引用变量时能否需要双引号的说明假如但是输出,能够不用双引号假如变量值代的内容中无空格,表达,特别符号,在引用时能够不需要双引号,反之,最好带双引号,不然在变量办理时很有可能会出现“参数过多”等无缘无故的错误信息。2.对于般配办理,sed是单行编写程序。sed‘s/str1/str2/g’file将文件file中每行内str1取代为str2[[:alnum:]]表示所有字母和数字中的任一个字符。若但是[:alnum:]则表示方括号中的任一个字符。[^[:alnum:]]表除了所有字母数字外的任一字符。假如是直接向脚本传字符串,则带空格的字串会被脚本自行分解为多个参数,因此可采纳从标准输入读取的方式获得字串。==============圆满程序代码=====================================#!/bin/bashisvalidAlphaNum()...#函数体,判断字串的合法性echoread

-n“input

Enterinput:

”#-n#读取内容存到

强迫不换行input中,无

$

符号if!isvalidAlphaNumecho“invalideexit1

“&input

;then

#加引号,不然可能会犯错。elseecho

“valide

”fiexit0===============================================================3.输入一个

“monthdayyear

”格式的日期串,程序将办理”

month

其”英为文单词的前三个字母,第一个字母大写,其余的小写。思路:第一判断month是数字、仍是单词,假如数字,则可查“数字—定义case构造);假如单词,则取前三个字母,并格式化。函数monthnoToName()将month数字变换为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

‘[:digit:]s/[

]//g’

)]

#-n

检测串是为空thenmonthnoToName$1

#数字else取第一个字母并将其变成大写,再将结果与拿出的第二三字母组合month=”$(echo$1|cut–c1|tr'[:lower:]''[:upper:]')month=”$month$(echo$1|cut-c2-3|tr'[:upper:]''[:lower:]')

”fiecho$month$2$3exit0

#输出结果注:1.外面能够使用函数中定义的变量最后echo会用到它。

,如函数

monthnoToName

中定义的

month

变量,多管道(|)的使用3.month变量的归并,$var$var4.trSET1SET2变换/删除/取代命令,将默认将SET1取代为SET2tr默认从标准输入读取,办理后写入标准输出。5.cut–c2-3file取文件每行第2,3字母。扩展:办理MM/DD/YYYYorMM-DD-YYYY的形式。在判断三个参数前履行命令set--$(echo$1|sed's/[/-]//g')。set的–-命令能够将今后的参数恩赐

地点参数($1,$2,...链接

)。set指令用法格式化输出大数字,使输出结果更简单让人知道该输出数字的数目级。默认用逗号分开整数部分,用点号分开整数与小数部分,自然用户也能够使用–d指定整数的分开符,用-t指定整数与小数部分的分开符。算法:==>默认:(1)第一分开整数部分integer和小数部分decimal,sed–d.-f1和sed–d.-f2分别取两部分。(2)整数部分的办理:看作数字来办理%运算/运算1)每次取整数低三位,长度小于3就补前缀0(防范出现漏0状况,比方低三位为003时,取后便为值3))将此次获得的三位与前一次获得的三位用分开符(假如没有指定就默认)组合起来。)整数去掉低三位,连续操作1)。当此整数小于等于999就不再连续。当字串来办理:1)每次取低三位,${#str}为str$(())的内部为

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

–f1)–f2)判断小数部分能否存在,由于这波及连结整数和小数的连结符问题#设DD为整数和小数之间分开符,默以为.if[–n$decimal];then#若非空,即有小数部分。#以下四句可用一句表示:result=${DD:=””.”}$remainder$result

”if[-z$DD];then

#判断用户能否自定义整数与分开符,若空DD=.firesult=$DD$decimal

#在小数部分前加

分开符。fithousand=$integerwhile[thousand–gt999]doremainder=$((thousand%1000))while[${#remainder}–lt3];do#${#remainder}为remainder串的长度remainder=0$remainder#防范remainder为00x时的丢0状况。donethousand=$(($thousand/1000))#以下四句可用一句表示:#上边蓝色部分表:若if[–z$TD];then

TD

result=${TD:=””,”}$remainder$result非空则返回TD,不然将”,”赋给TD.#判断用户能否自定义整数分开符

,若空TD=,firesult=

$TD$remainder$result

#与分开吻合成串。

注意次序doneif[–n$thousand];thenresult=”$thousand$resultelif[${result%${result#?}}=result=”${result#?}”

#若非空“$TD”

];thenfiecho$result}脚本标记参数办理命令:getopts“”var带两个参数,第一个参数为带解析的参数标记序列串(如-f,-c等),以冒号(分开各标记,且以冒号:结束第二个参数为:变量,每履行一次寄存参数标记序列串中的一个标记字符返回值:未解析结束返回0,解析结束返回1波及的内定变量:$OPTARG每次解析标记对应的参数值便默认寄存在此变

:)量内。$OPTIND

当各标记办理无误状况下,该数值指示目前用到的最大地点参数(

$#

)。此值使用简单犯错(若参数的判断不圆满时),还不如用$#其余$1,$2,$3,$4,===>此时$#等于4,当履行shift1时,各个地点参数的值向一次向左右1次,此时$1的值为原$2的值当履行shift2时,各个地点参数的值向一次向左右2次,此时$1的值为原$3的值。圆满代码nicenumber()#函数实现部分办理脚本标记参数whilegetoptsdo

“d:t:opt”case$optin#$optd)DD=”$OPTARG”;;t)TD=”$OPTARG”;;*)echo“noarg-flag:$opt

为详细的标记字符#$OPTARG为标记指定的参数值”>&2;exit1esacdone当脚本接收这样多的参数时,$1将不代表脚本最后要办理的大数字,因此做以下操作。shift$(($OPTIND-1))nicenumber$1exit0扩展:不同样样国家整数与小数的分开符不同样样,使脚本能够办理各样整数与小数各样分开符情况。在传给脚本参数时需指定标记-d程序中仅需在分开整数与小数部分略改正为integer=$(echo$1|cut“–d${DD:=”.f1””)decimal=$(echo$1|cut“–d$DD”f2)–2.其余,能够在程序履行以前分别初始化DD,TD默认值。

–3.检测传给脚本的大数值中能否含有

非法的整小数分开符,即存在与用户指定或默认分开符不同样样的符号。方法:删除此中所有数字,看剩下的内容separator=”$(echo$1|sed

,若不空且不等于‘s/[[:digit:]]//g

$DD

,则非法’)”if[-n$separator

&&“$separator

!=

“$DD”

];then#

蓝色部分可用–a

表示exit1fi检测输入整数的合法性,可负数(-1,-2均合法),能够指定传入整数范围,不在范围内则报错。参数:1或3个,当3个时,后两个为范围。合法性:正负数的判断,范围的判断。validint(){integer=$1min=$2max=$3判断传参的合法性,以下判断是错误的,由于不论参数能否为空,实质上都传了三个参数。if[$#-eq0];then

#改成判断$1

的内容能否为空,就能够了echo

youcouldn

tdonothing>

”&2return1fi判断能否为负数,第一个字符能否为–,如是,则判断后边的能否为整数。若非负,则判断能否为整数if[“$(echo$1|cut

–c1)-”

];=then“signed=

”-”integer=

${integer#?}

”fi假如就是一个符号-,则也是非法的if[-z“$integer”];thenecho“Invalidinput,justa-”is“notallowed&2”>#注意:>&2三个字符紧连。return1fi假如非纯数字构成,则非法。if[-n“$(echo$integer|sed‘s/[[:digit:]]//gecho“Invalidinteger,itincludessomecharbutdigit

’)”

];then

”>&2return1fiinteger=

$signed$integer

”范围判断,注意当

温馨提示

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

评论

0/150

提交评论