00:00
接下来我们继续来介绍Linux shell当中的语法结构啊,那我们知道作为编程语言的话,里边肯定少不了对于流程的控制,而一个非常重要的关键点就在于我们必须要能对一些条件进行判断,判断它到底是真还是假,基于这个条件判断来做一些相应的流程控制啊。所以首先我们要介绍的就是语法里边怎么样去做条件判断啊,简单来讲就是给一个表达式,我们判断它到底是true还是false,到底是真还是假。那对于shell而言呢,我们这里边可以使用一个。基本的命令,那就是test test我们知道是测试的意思,Test后边跟着一个条件表达式,接下来我们就可以直接根据它的返回结果来判断当前这个值到底是真还是假。哎,这样说的话可能有点抽象,我们还是在控制台里边具体的做一个测试。那首先就是直接test啊,比方说我们现在先给一个变量吧,假如说我们定义一个AA的值,假如说我们直接就叫做哈,现在呢,我们要判断这个A的值到底是不是哈,那应该怎么办呢?诶,当然我们可以直接echo。
01:15
A,可以看到它的值,这是我们能想到的一种方式啊,但是如果在脚本里边写成程序代码的话,我们一定要有对应的一种判断的方式,那这种方式就直接可以写test,后边跟着就是当前的Dollar a,它的值是否等于hello。哎,那我们看这样写了之后,那我并不知道它到底是真还是假呀,那到底它的这个结果怎么样呢?我这是一条测试,那这条测试到底通过了没有呢?哎,那我们就想到了当前。执行的结果应该是有一个返回值的,那你既然是测试,那如果通过的话,返回应该是正确的,之前我们说一条命令,如果正确返回应该返回一个零,哎,那所以如果说后边这个表达式为甲没有通过的话,那就应该返回一个一了,就应该报错了。
02:07
所以我们的自然的想法是这样的,接下来我们可以验证一下,那它的返回值靠什么去获取呢?当然是Dollar问号这样一个特别的参数。特别的变量,我们一获取,发现等于零,说明之前的测试通过了,那么A等于哈这个表达式就是对的,也就是说A的值确实是哈啊。为了验证这个想法。我们把这里做一个更改,呃,我们测试A是否等于大写的哈。然后我们再来看一下它的结果,哎,我们发现现在就不对了,现在变成了一,也就是说我们这条test没有通过啊,他返回报错了吗?没有通过,没有通过,也就是说明我们这个表达式的值为甲A不等于大写哈。当然了,我们还可以把这个A的值真的再改成大写的哈,然后再来做一次测试。
03:01
接下来我们看到就又变成零了啊,测试就又通过了啊,所以这其实就是我们当前在link shell里边进行条件判断的一个基本的方法啊,直接可以使用test,然后捕获它返回的结果到底是零还是一,这里有点特殊的一点就在于,如果大家对于这个编程语言里边进行条件判断,进行真值判断有所了解的话,就会发现啊,比方说像这个C里面,它其实真正意义上。如果是处的话。底层处其实是相当于是一的,如果是false的话。相当于是零,很多编程语言里边其实都是这样的一个定义啊,就是一为真,零为假,但是在我们这里呢,不一样了,因为我们这里边link里边是使用命令的返回值,返回的结果。执行是否成功的这个结果代码来表示它的真值的,所以呢,它刚好调换过来了。
04:02
我们现在就变成了。如果返回这个这个值,表达式的值是真的话,应该看到返回一个零,那如果表达式的值是假的话,该返回一个一,所以这个我们一定要区分开来。当然了,在这个过程当中,我们会发现每一次这个表达式的值,你要去做测试还得调一个test命令,这个看起来太麻烦了,就像之前我们做那个运算一样啊,还得写一个ex PR expression啊,那那肯定是太麻烦了啊,那有没有简写方法呢?诶,当然有简写的方法,那就是直接可以使用一个中括号,哎,我们看就是在link she里边它的简单的书写啊,都是使用的中括号,然后呢,就省去了test,直接把要判断的条件表达式放进去就可以了。这里需要注意的是前后一定要有空格啊,就是如果说要是不空格的话,反而就会有问题,这也是link shell的一个非常呃。
05:02
强制性的一个限制,比较严严厉的一个限制啊,一开始可能我们会觉得这个很别扭,确实它这个格式上容易出错,我们一定要把这个空格空开,所以接下来我们上面的这种测试就可以改成。注意要空格,所以直接Dollar a等于hello写成这个,然后再echo。Dollar问号同样可以看到它是真的啊,那如果说我们把这个再改回成小写的hello的话。那么就变成甲了啊,所以理论上来讲,这个跟前面的test是完全一样,我们一般在脚本里边直接写中括号,记得空格空开就可以了。这里需要注意的一点是,就是非常特殊的一点是我们中间的这个判断啊,当前我们对于。A是否等于哈的这个判断?我们在书写的时候也是等号两边要空格的,那如果说我们前面这个不空格,会出现什么情况呢?
06:01
判断小写的哈,我们知道当前A本身的值它是大写的哈,等于小写的哈,应该是要报错的,哎,所以我们直接回车,然后判断一下,诶,现在就又变成零了。为什么呢?啊,因为我们知道如果连接在一起的话,很有可能就会把它识别成一体,识别成一个值了,那当然里边是一个值的话,他认为这个表达式就是真的,所以执行的话,判断就是零,哎,所以这个我们一定要注意啊,在进行处理的时候,中间一定要空格空开。所以有了当前的这样一个基本的了解之后,那我们自然就想到了,假如说我里边什么都不给,随便打一串字母放在这儿,得到的结果会是什么样子呢?我们直接eo。发现还是零啊,那对应的怎么样就会打印的结果变成一呢,里边就变成假了呢,哎,那如果是完全里边就是空格什么都没有,是空值的话,这个时候它就变成了一啊,所以有时候我们会通过这种方式来判断啊,里面到底有没有东西啊,这个也是我们需要注意的一点。
07:11
那前面我们介绍的这个比较呢,判断比较是判断了一个字符串啊,就A的值是否等于哈,那我们这判断的是否相等,那如果不相等应该怎么判断呢?啊,就像前面我们这个啊,如果直接判断是否等于哈,这个判断出来这是一不相等。那我们就会想到本身它是等于大写的哈嘛,那假如说我们判断它是否不等于大写的哈。对应的结果就应该变成了一了啊,那对于字符串的不相等的判断就是在等号前面加一个感叹号啊,这跟很多编程语言里边对于这个不等的表达其实也是一样的啊,这个应该大家比较熟悉啊,那同样我们前面如果说是否不等于小写的hello。本来它就不等于,那当然这个时候其实这个表达式是为真判断通过,那么得到的返回值就是零,就是真值的,表示返回结果正确是等于零的。
08:10
好,那所有的这些呢,我们指的都是字符串之间进行比较,相等还是不相等,我们往往可能更关心的是,那如果是数值呢,两个整数进行比较,它们怎么样判断相等还是不等呢?哎,那我们自然就想到了,比方说这里我就来一个二跟。八要做一个比较。那假如说我是不是直接也是这样二等于八,这样就可以进行判断了呢?哎,那我们看一下当前它的判断,诶,这是一说明二不等于八判断是对的啊,那如果说判断一下二等于二的话。这个返回是零,哎,说明这个测试值为真二等于二,看起来也没什么问题,那假如说我们现在因为数值嘛,除了相等不等之外,还应该有。大于小于的关系啊,那假如说现在我们要判断一个二小于八。
09:02
这个应该是什么效果呢?我们看一下。诶,这里直接就提示八没有那个文件或目录,所以在link shell里边,它是没有使用这样一个大于小于号来进行数值判断的功能的,其实结合我们前面介绍过的一些用法就会发现啊,如果要是小于号,我我们可能之前还没有接触过,如果要是大于号的话,一个大于号其实表示的是输出重定向,我们还记得的话啊,把相应的前面命令执行的结果直接写入到另外一个文件里面去的时候,我们就用过这个大于号。哎,那同样小于号呢,其实在linucel里面表示的是输入重定项,哎,所以当前我们并不能直接拿它来做。条件判断的比较符,哎,那当前我们到底应该怎么判断呢?这里我们要看一下对于整数之间的比较,它的大于、小于、等于其实并不是我们熟悉的那些大于小于等于的符号,而是使用了一杠,然后加两个字符来进行判断。比如说等于,我们这里应该使用杠EQ啊,它就表示E口。
10:12
两者是否相等,那如果是小于的话,就是杠LT,意思就是less than是否小于。如果是大于的话,就是一杠GT,就是greater than是否大于?那那对应的还有这个杠ne表示就是not equal,那这就是不等于了,杠Le表示小于等于,L是less e是E口啊啊,那另外杠G,这是greater e是E口,这就是大于等于。啊,那所以我们可能就会有疑惑,前面我们比较的时候,那这个等于怎么也是可以判断出来是否相等,是否不等呢?哎,那是因为同样它可以当成是一个字符串嘛,那既然前面字符串可以用等号去做比较,那二字符串和八进行做一个比较,它当然还是不等的啊,那如果二跟二比的话,还是相等的,所以还是返回零。
11:04
真正如果作为一个数值去做比较的话,那我们这里应该是二。LT,这就是less than,这样得到结果,这就是零啊,那当然了,如果说我们这里来一个GT的话,那这个是greater than,当然就是一了。所以这是关于整数的比较方式。那除去。关于整数和字符串的比较之外,在linknu shell里边我们还可以针对文件的权限进行一些判断,比如说,诶,这里边我们可以直接给一个杠R后边加一个文件名,这就是表示判断这个文件是否有可读的权限,Read的权限啊,那当然了,对应我们的权限不是有三种吗?杠W,这就是判断它是否有写的权限,杠X就是是否有可执行的权限。这个也非常简单,我们可以直接来测试一下啊,那首先我们看一下当前的目录,下边这里好像多了一个不知名的文件,我们直接把它删掉。
12:08
好。接下来我们可以。暂时。新建一个test文件,哎,那当前这个文件的话,我们知道它肯定是没有可执行权限的,所以接下来我们可以对应的进行一个测试,比方说我们先来测试一下。好,那我们就测试当前的哈点SH这个shell,它是否有可读的权限呢?诶,那当然是没有问题的。艾一下,当前应该结果是零,执行是正确的,那同样我们可以判断一下它有没有写入的权限呢?当然也是没有问题的,有没有执行的权限呢?同样也是没有问题的。接下来呢,我们就要来测试一下。当前的test这个文件是否有可读的权限是有的。那是否有可执行的权限呢?我们看它是没有的,哎,所以对应的这种方法就可以测出某一个文件是否有相应的权限啊,这个其实也比较简单。
13:09
然后接下来呢,还有另外一种判断是可以按照文件的类型进行判断,诶这主要就是首先先看一下这个文件是否存在杠E表示判断这个文件是否存在杠F呢,诶表示文件就是判断它是否存在,而且它是一个普通的file,普通的常规文件。那杠D的话,它判断的就是文件是否存在,而且这是一个目目文件,Director就是判断一个目录是否存在,我们也可以简单的来做一个测试。比如说这里我们可以直接判断一下某一个文件是否存在,比方说我们知道home目录下边艾特硅谷下边可能有一些文件,我们看有没有这个info这个文件呢?判断一下,诶没有返回一就表示没有,那我们看一下是不是home at硅谷下边真的没有呢?哦,确实没有,下面只有两个配置文件,哎,那所以接下来我们可以同样把这个更改一下。
14:09
选取这个配置文件名称做一个复制,那现在这个文件有没有呢?E Dollar问号,我们看到返回的是零,说明这个文件是存在的,呃,这个完全没有问题啊啊,那当然了,我们也可以判断某一个文件是否存在,而且是否是真正的文件呢?诶,那我们。add.sh,我们来判断一下,没有问题,确实有这个文件,那是否它是一个目录呢?杠D判断一下,哎,那这个就不是了。啊,那如果是杠D的话,那我们肯定如果你真的判断一个home at硅谷,这是真正存在的一个目录,它当然就会返回零了,所以整体来讲这个使用还是非常简单的啊。呃,那整体来讲,条件判断主要就是这些用法啊,那接下来呢,我会想到在实际判断的过程当中,可能还会涉及到多个条件的一个组合判断,这就是我们所说的多条件判断,那对于判断条件来讲,多个条件怎么样组合呢?呃。
15:15
最简单的方式,那就是两个条件如果要同时成立才能满足我们当前这个表达式为真的话,那显然这就是一个逻辑与的关系。在linknux shell里边,逻辑语也是用这样的两个语号来表示的,很跟很多编程语言非常的类似啊啊,那同样如果说两个条件里边只要有一个满足,整个这个表达式就为真就满足,那这就是一个逻辑或的关系,那在这个link shell里边,同样也是用两条竖线来表示逻辑或的关系啊,这个基本上用法都一样啊啊,那有了这个之后,那接下来呢,就会有一个非常好玩的情况,就是我们经常在link shell里边可以使用这种多条件判断来表示。
16:02
就是两个与号表示前一条命令执行成功的时候,再去执行下一条命令,然后呢,后面再跟上一个括号逻辑或的判断,那逻辑或是表示上一个执行失败之后才执行下一条命令,所以有时候我们就会出现这种情况,就是一个条件判断,然后后面跟一个逻辑语,然后后边再跟一个逻辑或。这表示的是什么含义呢?这其实就是判断当前这个表达式到底是否为真呢?如果它为真,就会执行下边的这条语句,因为语号嘛,前面为真就会执行下边,如果前面为假,直接就返回假了嘛,哎,所以它为真就执行下一条。执行完了之后,前面如果都已经执行完了,如果为真啊,那就不用执行后面了,因为后面是货嘛,那如果前边为假,就会继续执行后边的或后边的这条语句啊,所以我们看到这种表示啊,其实就可以实现。
17:02
我们在Java里边的那种三元运算符,前面一个问号,前面一个表达式,然后一个问号,然后一个冒号,这种情况它如果为真,执行后面这一部分,如果为假,执行最后的这一部分代码啊,呃,那相当于我们可以用这种方式实现类似的功能啊,其实本质上来讲,这也就是一个if的判断了。那所以接下来我们可以在。控制台里边还是把这一部分做一个简单的测试,比如说啊,我们这里直接可以做一个判断,那当前我们还是给一个A,给一个值吧,比方说给一个15,然后接下来我们就判断。Dollar a。它跟20做一个比较。那做比较的话,就是比方说它是否小于less than20呢?如果要是小于20的话。那么后边语号我们就eo输出一句话。我们输出,哎,当前的这个AO。
18:01
Dollar a。小于20。哎,那后边再跟上一个或逻辑或那就表示如果说前面都为甲,哎,就是这里边它比20要大,然后当然接下来就不会执行我们这部分了,接下来要执行的就是括号后边的部分,那我们就直接eo一个。A大于等于20。好,接下来做一个执行,我们看到得到的就是15小于20,哎,为什么呢?因为我们这里是Dollar a嘛,所以是把Dollar AA的值直接放在这里去替代了,显示出来就是15小于20啊,那当然了,如果说A这里边我们重新附一个值给一个27的话,然后再去执行一下这句话,那就是27大于等于20,得到的就是这样一个结果。啊,当然了,如果说我们使用这个文档当中的这个事例的话,啊,相当于前面没有任何的判断,直接给一个艾特硅谷放在这里,然后后边A,呃,逻辑语后边给一个echo OK,然后逻辑或后边是echo not OK,那这里会会返回什么值呢?诶,当然我们就想到了前面只要这个。
19:18
中括号里边我们说只要有东西,它的返回值应该就是为真啊,那么接下来当然是要AOK了,那同样如果说里边是空的话,当然它就为甲,对应的我们就执行后面的内容,那就是echo not OK啊,这里我们可以做一下测试啊,直接复制过来我们看。直接就是OK,那如果说前面直接删掉是一个空括号的话,这里就是not OK,这就是关于条件判断相关的一些内容。
我来说两句