再见西城 发表于 2015-1-14 20:22:33

来一发shell中if和相干判别符

如果您觉得本篇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的长度非零则为真假如两个字符串不异则为真假如字符串不不异则为真ARG1和ARG2应当是整数大概取值为整数的变量,OP是-eq(即是)-ne(不即是)-lt(小于)-le(小于即是)-gt(年夜于)-ge(年夜于即是)当中的一个

和C言语相似,测试前提之间还能够做与、或、非逻辑运算:

表31.3.带与、或、非的测试下令

[!EXPR]EXPR能够是上表中的恣意一种测试前提,!暗示逻辑反EXPR1和EXPR2能够是上表中的恣意一种测试前提,-a暗示逻辑与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!";;*)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$1、$2...这些称为地位参数(PositionalParameter),相称于C言语main函数的argv、argv...$#相称于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教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的小伙伴们!

分手快乐 发表于 2015-1-16 15:00:51

来一发shell中if和相干判别符

为什么要学Linux呢?每个人都有不同的看法,下面我说说自己的感想吧。?

山那边是海 发表于 2015-1-24 12:02:20

学习Linux系统在服务中的配置方法及使用方法。Linux在服务器中应用相当广,应对常用的apache,samba,ftp等服务器基本配置清楚了解。[重点,应巩固学习]

飘灵儿 发表于 2015-2-1 11:47:40

随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。

小魔女 发表于 2015-2-7 08:19:06

一定要学好命令,shell是命令语言,命令解释程序及程序设计语言的统称,shell也负责用户和操作系统之间的沟通。

只想知道 发表于 2015-2-21 20:40:21

我们这一代90后,从小接触的是windows98,家里条件好的自己有电脑装的是2000,后来又有了XP,上大学时又有了win7。

乐观 发表于 2015-3-7 00:01:22

Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。

灵魂腐蚀 发表于 2015-3-14 04:51:41

学习Linux,应该怎样学,主要学些什么,一位Linux热心学习者,一段学习Linux的风云经验,历时十二个小时的思考总结,近十位网络Linux学习者权威肯定,为您学习Linux指明方向。

蒙在股里 发表于 2015-3-21 02:38:35

熟悉操作是日常学习Linux中的三大法宝。以下是作者学习Linux的一些个人经验,供参考:
页: [1]
查看完整版本: 来一发shell中if和相干判别符