|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的小伙伴们!转自鸟哥
援用
1.关于某个档名的『范例』侦测(存在与否),如test-efilename
-e该『档名』是不是存在?(经常使用)
-f该『档名』是不是为档案(file)?(经常使用)
-d该『文件名』是不是为目次(directory)?(经常使用)
-b该『文件名』是不是为一个blockdevice安装?
-c该『文件名』是不是为一个characterdevice安装?
-S该『档名』是不是为一个Socket档案?
-p该『档名』是不是为一个FIFO(pipe)档案?
-L该『档名』是不是为一个保持档?
2.关于档案的权限侦测,如test-rfilename
-r侦测该文件名是不是具有『可读』的属性?
-w侦测该档名是不是具有『可写』的属性?
-x侦测该档名是不是具有『可实行』的属性?
-u侦测该文件名是不是具有『SUID』的属性?
-g侦测该文件名是不是具有『SGID』的属性?
-k侦测该文件名是不是具有『Stickybit』的属性?
-s侦测该档名是不是为『非空缺档案』?
3.两个档案之间的对照,如:testfile1-ntfile2
-nt(newerthan)判别file1是不是比file2新
-ot(olderthan)判别file1是不是比file2旧
-ef判别file2与file2是不是为统一档案,可用在判别hardlink的判断上。次要意义在判断,两个档案是不是均指向统一个inode哩!
4.关于两个整数之间的判断,比方testn1-eqn2
-eq两数值相称(equal)
-ne两数值不等(notequal)
-gtn1年夜于n2(greaterthan)
-ltn1小于n2(lessthan)
-gen1年夜于即是n2(greaterthanorequal)
-len1小于即是n2(lessthanorequal)
5.判断字符串的数据
test-zstring判断字符串是不是为0?若string为空字符串,则为true
test-nstring判断字符串是不是非为0?若string为空字符串,则为false。
注:-n亦可省略
teststr1=str2判断str1是不是即是str2,若相称,则回传true
teststr1!=str2判断str1是不是不即是str2,若相称,则回传false
6.多重前提判断,比方:test-rfilename-a-xfilename
-a(and)两情况同时建立!比方test-rfile-a-xfile,则file同时具有r与x权限时,才回传true。
-o(or)两情况任何一个建立!比方test-rfile-o-xfile,则file具有r或x权限时,便可回传true。
!反相形态,如test!-xfile,当file不具有x时,回传true
5.Shell剧本语法上一页第31章Shell剧本下一页
--------------------------------------------------------------------------------
5.Shell剧本语法请点评5.1.前提测试:test[请点评
下令test或[能够测试一个前提是不是建立,假如测试了局为真,则该下令的ExitStatus为0,假如测试了局为假,则下令的ExitStatus为1(注重与C言语的逻辑暗示恰好相反)。比方测试两个数的巨细干系:
$VAR=2$test$VAR-gt1$echo$?0$test$VAR-gt3$echo$?1$[$VAR-gt3]$echo$?1
固然看起来很奇异,但左方括号[的确是一个下令的名字,传给下令的各参数之间应当用空格离隔,好比,$VAR、-gt、3、]是[下令的四个参数,它们之间必需用空格离隔。下令test或[的参数情势是不异的,只不外test下令不必要]参数。以[下令为例,罕见的测试下令以下表所示:
表31.2.测试下令
[-dDIR]假如DIR存在而且是一个目次则为真[-fFILE]假如FILE存在且是一个一般文件则为真[-zSTRING]假如STRING的长度为零则为真[-nSTRING]假如STRING的长度非零则为真[STRING1=STRING2]假如两个字符串不异则为真[STRING1!=STRING2]假如字符串不不异则为真[ARG1OPARG2]ARG1和ARG2应当是整数大概取值为整数的变量,OP是-eq(即是)-ne(不即是)-lt(小于)-le(小于即是)-gt(年夜于)-ge(年夜于即是)当中的一个
和C言语相似,测试前提之间还能够做与、或、非逻辑运算:
表31.3.带与、或、非的测试下令
[!EXPR]EXPR能够是上表中的恣意一种测试前提,!暗示逻辑反[EXPR1-aEXPR2]EXPR1和EXPR2能够是上表中的恣意一种测试前提,-a暗示逻辑与[EXPR1-oEXPR2]EXPR1和EXPR2能够是上表中的恣意一种测试前提,-o暗示逻辑或
比方:
$VAR=abc$[-dDesktop-a$VAR=abc]$echo$?0
注重,假如上例中的$VAR变量事前没有界说,则被Shell睁开为空字符串,会形成测试前提的语法毛病(睁开为[-dDesktop-a=abc]),作为一种好的Shell编程习气,应当老是把变量取值放在双引号当中(睁开为[-dDesktop-a""=abc]):
$unsetVAR$[-dDesktop-a$VAR=abc]bash:[:toomanyarguments$[-dDesktop-a"$VAR"=abc]$echo$?15.2.if/then/elif/else/fi请点评
和C言语相似,在Shell顶用if、then、elif、else、fi这几条下令完成分支把持。这类流程把持语句实质上也是由多少条Shell下令构成的,比方先前讲过的
if[-f~/.bashrc];then.~/.bashrcfi
实际上是三条下令,if[-f~/.bashrc]是第一条,then.~/.bashrc是第二条,fi是第三条。假如两条下令写在统一行则必要用;号离隔,一行只写一条下令就不必要写;号了,别的,then前面有换行,但这条下令没写完,Shell会主动续行,把下一行接在then前面看成一条下令处置。和[下令一样,要注重下令和各参数之间必需用空格离隔。if下令的参数构成一便条下令,假如该子下令的ExitStatus为0(暗示真),则实行then前面的子下令,假如ExitStatus非0(暗示假),则实行elif、else大概fi前面的子下令。if前面的子下令一般是测试下令,但也能够是别的下令。Shell剧本没有{}括号,以是用fi暗示if语句块的停止。见下例:
#!/bin/shif[-f/bin/bash]thenecho"/bin/bashisafile"elseecho"/bin/bashisNOTafile"fiif:;thenecho"alwaystrue";fi
:是一个特别的下令,称为空下令,该下令不做任何事,但ExitStatus老是真。别的,也能够实行/bin/true或/bin/false失掉真或假的ExitStatus。再看一个例子:
#!/bin/shecho"Isitmorning?Pleaseansweryesorno."readYES_OR_NOif["$YES_OR_NO"="yes"];thenecho"Goodmorning!"elif["$YES_OR_NO"="no"];thenecho"Goodafternoon!"elseecho"Sorry,$YES_OR_NOnotrecognized.Enteryesorno."exit1fiexit0
上例中的read下令的感化是守候用户输出一行字符串,将该字符串存到一个Shell变量中。
别的,Shell还供应了&&和||语法,和C言语相似,具有Short-circuit特征,良多Shell剧本喜好写成如许:
test"$(whoami)"!=root&&(echoyouareusinganon-privilegedaccount;exit1)
&&相称于“if...then...”,而||相称于“ifnot...then...”。&&和||用于毗连两个下令,而下面讲的-a和-o仅用于在测试表达式中毗连两个测试前提,要注重它们的区分,比方,
test"$VAR"-gt1-a"$VAR"-lt3
和以下写法是等价的
test"$VAR"-gt1&&test"$VAR"-lt35.3.case/esac请点评
case下令可类比C言语的switch/case语句,esac暗示case语句块的停止。C言语的case只能婚配整型或字符型常量表达式,而Shell剧本的case能够婚配字符串和Wildcard,每一个婚配分支能够有多少条下令,开端必需以;;停止,实行时找到第一个婚配的分支并实行响应的下令,然后间接跳到esac以后,不必要像C言语一样用break跳出。
#!/bin/shecho"Isitmorning?Pleaseansweryesorno."readYES_OR_NOcase"$YES_OR_NO"inyes|y|Yes|YES)echo"GoodMorning!";;[nN]*)echo"GoodAfternoon!";;*)echo"Sorry,$YES_OR_NOnotrecognized.Enteryesorno."exit1;;esacexit0
利用case语句的例子能够在体系办事的剧本目次/etc/init.d中找到。这个目次下的剧本年夜多具有这类情势(以/etc/apache2为例):
case$1instart)...;;stop)...;;reload|force-reload)...;;restart)...*)log_success_msg"Usage:/etc/init.d/apache2{start|stop|restart|reload|force-reload|start-htcacheclean|stop-htcacheclean}"exit1;;esac
启动apache2办事的下令是
$sudo/etc/init.d/apache2start
$1是一个特别变量,在实行剧本时主动取值为第一个下令行参数,也就是start,以是进进start)分支实行相干的下令。同理,下令行参数指定为stop、reload或restart能够进进别的分支实行中断办事、从头加载设置文件或从头启动办事的相干下令。
5.4.for/do/done请点评
Shell剧本的for轮回布局和C言语很纷歧样,它相似于某些编程言语的foreach轮回。比方:
#!/bin/shforFRUITinapplebananapear;doecho"Ilike$FRUIT"done
FRUIT是一个轮回变量,第一次轮回$FRUIT的取值是apple,第二次取值是banana,第三次取值是pear。再好比,要将以后目次下的chap0、chap1、chap2等文件名改成chap0~、chap1~、chap2~等(按常规,开端有~字符的文件名暗示一时文件),这个下令能够如许写:
$forFILENAMEinchap?;domv$FILENAME$FILENAME~;done
也能够如许写:
$forFILENAMEin`lschap?`;domv$FILENAME$FILENAME~;done5.5.while/do/done请点评
while的用法和C言语相似。好比一个考证暗码的剧本:
#!/bin/shecho"Enterpassword:"readTRYwhile["$TRY"!="secret"];doecho"Sorry,tryagain"readTRYdone
上面的例子经由过程算术运算把持轮回的次数:
#!/bin/shCOUNTER=1while["$COUNTER"-lt10];doecho"Herewegoagain"COUNTER=$(($COUNTER+1))done
Shell另有until轮回,相似C言语的do...while轮回。本章从略。
习题请点评
1、把下面考证暗码的步伐修正一下,假如用户输错五次暗码就报错加入。
5.6.地位参数和特别变量请点评
有良多特别变量是被Shell主动赋值的,我们已碰到了$?和$1,如今总结一下:
表31.4.经常使用的地位参数和特别变量
$0相称于C言语main函数的argv[0]$1、$2...这些称为地位参数(PositionalParameter),相称于C言语main函数的argv[1]、argv[2]...$#相称于C言语main函数的argc-1,注重这里的#前面不暗示正文$@暗示参数列表"$1""$2"...,比方能够用在for轮回中的in前面。$?上一条下令的ExitStatus$$以后Shell的历程号
地位参数能够用shift下令左移。好比shift3暗示本来的$4如今酿成$1,本来的$5如今酿成$2等等,本来的$1、$2、$3抛弃,$0不挪动。不带参数的shift下令相称于shift1。比方:
#!/bin/shecho"Theprogram$0isnowrunning"echo"Thefirstparameteris$1"echo"Thesecondparameteris$2"echo"Theparameterlistis$@"shiftecho"Thefirstparameteris$1"echo"Thesecondparameteris$2"echo"Theparameterlistis$@"5.7.函数请点评
和C言语相似,Shell中也有函数的观点,可是函数界说中没有前往值也没有参数列表。比方:
#!/bin/shfoo(){echo"Functionfooiscalled";}echo"-=start=-"fooecho"-=end=-"
注重函数体的左花括号{和前面的下令之间必需有空格或换行,假如将最初一条下令和右花括号}写在统一行,下令开端必需有;号。
在界说foo()函数时其实不实行函数体中的下令,就像界说变量一样,只是给foo这个名字一个界说,到前面挪用foo函数的时分(注重Shell中的函数挪用不写括号)才实行函数体中的下令。Shell剧本中的函数必需先界说后挪用,一样平常把函数界说都写在剧本的后面,把函数挪用和别的下令写在剧本的最初(相似C言语中的main函数,这才是全部剧本实践入手下手实行下令的中央)。
Shell函数没有参数列表其实不暗示不克不及传参数,现实上,函数就像是迷你剧本,挪用函数时能够传恣意个参数,在函数内一样是用$0、$1、$2等变量来提取参数,函数中的地位参数相称于函数的部分变量,改动这些变量其实不会影响函数表面的$0、$1、$2等变量。函数中能够用return下令前往,假如return前面跟一个数字则暗示函数的ExitStatus。
上面这个剧本能够一次创立多个目次,各目次名经由过程下令行参数传进,剧本逐一测试各目次是不是存在,假如目次不存在,起首打印信息然后试着创立该目次。
#!/bin/shis_directory(){DIR_NAME=$1if[!-d$DIR_NAME];thenreturn1elsereturn0fi}forDIRin"$@";doifis_directory"$DIR"then:elseecho"$DIRdoesntexist.Creatingitnow..."mkdir$DIR>/dev/null2>&1if[$?-ne0];thenecho"Cannotcreatedirectory$DIR"exit1fifidone
注重is_directory()前往0暗示真前往1暗示假。
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的小伙伴们! |
|