仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 587|回复: 8
打印 上一主题 下一主题

[shell编程] 来一发shell中if和相干判别符

[复制链接]
再见西城 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:22:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的小伙伴们!
分手快乐 该用户已被删除
沙发
发表于 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技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。
小魔女 该用户已被删除
5#
发表于 2015-2-7 08:19:06 | 只看该作者
一定要学好命令,shell是命令语言,命令解释程序及程序设计语言的统称,shell也负责用户和操作系统之间的沟通。
只想知道 该用户已被删除
6#
发表于 2015-2-21 20:40:21 | 只看该作者
我们这一代90后,从小接触的是windows98,家里条件好的自己有电脑装的是2000,后来又有了XP,上大学时又有了win7。
乐观 该用户已被删除
7#
发表于 2015-3-7 00:01:22 | 只看该作者
Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。
灵魂腐蚀 该用户已被删除
8#
发表于 2015-3-14 04:51:41 | 只看该作者
学习Linux,应该怎样学,主要学些什么,一位Linux热心学习者,一段学习Linux的风云经验,历时十二个小时的思考总结,近十位网络Linux学习者权威肯定,为您学习Linux指明方向。
蒙在股里 该用户已被删除
9#
发表于 2015-3-21 02:38:35 | 只看该作者
熟悉操作是日常学习Linux中的三大法宝。以下是作者学习Linux的一些个人经验,供参考:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-12 14:58

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表