00:00
前面我们介绍了if else和case语句,它们其实都是我们流程控制里边的分支流程控制,那我们知道了,在一个程序代码里边,除了顺序执行啊,还有这个分叉分支,另外的一大类就是所谓的循环啊,那循环这种流程控制呢,我们也非常的熟悉,简单来讲就是我这儿定义了一堆代码,然后接下来希望让它不停的重复执行循环执行,执行完了再来一遍,再来一遍,好,那我们自然想到对于这个循环来说啊,最关键的一点就是你不能无限的循环下去啊,那变成死循环了吗?退不出来了啊,执行不完了,所以一般对于循环而言,我们都要给一个啊,其实也是得有一个条件判断,所以我们发现啊,前面这个条件判断,它其实是流程控制的一个核心点啊,有了条件判断,你就可以做分支,然后也可以做循环,那条件判断在循环里边主要是判断是否继续循环啊,或者你要不满足条件就直接。
01:00
退出,直接执行下面的内容了啊,所以这就是我们所说这个循环的一个基本原理,那在Linux shell里边呢,它同样支持循环,最经典的循环方式就是传说中的for循环啊啊,我们其实如果学过其他的语言的话,对for肯定不陌生啊,应该说就是最常用的一种循环了。在link shell里边,For有两种不同的使用语法,首先我们来看第一种语法。这种语法我们看啊,就是for后边直接跟着双小括号。然后里边跟着就是分号分割的三部分内容,哎,首先就是初始值,因为我们知道在这个循环。控制的过程当中啊,肯定是需要有一个退出循环的控制条件的嘛,那你这个条件不停的循环过程当中,肯定就要有一个东西在不停的变化,才能保证循环一段时间之后能够退出,哎,那什么东西变化呢?那就是我们所说的一个循环变量,所以循环变量需要有一个初始值,另外还要不停的进行变化,所以我们看第一个就是给循环变量赋初始值,然后中间就是循环的控制条件,一个条件判断,最后就是变量的变化,比方说哎,当前一个数字不停的加,不停的加,加一加一,如果说我们这儿循环控制条件是当它这个小于十的时候就不停的循环,那大于十的时候你不停的加,加到大于十,那不就退出了吗?所以非常经典的一个控制流程啊,三段式的表述。
02:30
赋一个初始值,然后控制循环的条件,然后接下来循环变量进行变化。那后面的语法呢,加了一个度。因为我们知道在这里边同样是没有划括号的嘛,那后面我们执行的这一部分用什么来包裹呢?那是度和道啊,注意啊,这里就不再是把这个for再反过来RO了啊,呃,不是这样的一个写法了,它直接后面就是do开始,然后到结束。中间是我们要执行的循环体。这里可以直接来做一个实验,我们来测试一下啊,看看这个东西到底怎么来写控制台,我们还是新建一个脚本为,呃,这个脚本其实是一个非常经典的例子,就是比方说诶,我们都做过这个连加的操作啊,比方说就是从一开始整数不停的加,一加二加三加啊,一直加,我们知道一个经典的题目就是一加二加三,一直加到100,对吧?呃,这个是当时数学王子高斯啊,小时候有一个非常经典的算法,我们说这个等差数列和啊,直接把它能够算出来,哎,那我们现在呢,也不要求就一定要加到100了,我们把这个加到哪个数当成一个参数传进去吧,也就是说诶,传一个参数进来,那我们就变成脚本里面的DOLLAR1了,那就是从一开始一直加到DOLLAR1,我们最后要输出它的总和,哎,那所以接下来我们这个脚本就叫做3TO吧。
03:50
SH。哦,那同样,我们还是先把它的头先写上。叹号,In bash。然后接下来这个过程就是一个标准的for循环啊,我们看到既然后边我们可以跟上对应的这个双括号啊,然后里边我们可以空格啊,那这个一般情况我们。
04:10
出于习惯考虑啊,这里面一般都周围就空空格空开啊,其实啊中括号是必须要空的,那对于这个双小括号呢,其实里边你这个不空也行啊,但是我们习惯使然,还是空开吧,啊那接下来我们就来一个标准的循环变量,我们一般都用I嘛,哎,那我们知道在如果是Java里边的话,你可能上来之后是int I等于零对吧?哎,这样去进行这个控制,我们这里边知道在shell里边根本不需要有这个类型的定义,上来之后直接用,哎,那就直接。I等于一,比方说我们就是从一开始加嘛,那也不用什么从零开始了啊,I等于一,然后I小于等于DOLLAR1,诶,这不就是我们想要的这个效果吗?当前传进来的参数,如果它小于等于这个参数的话,那就继续循环啊,那最后是还得有一个变化,怎么变呢?I加加,哎,这个我们都很熟悉啊,C和二里面都有自增运算符,它就相当于把I变成。
05:10
I加一对吧,那就不停的加一,不停的加一,所以接下来后边就是我们对应的循环体了,循环体先来一个度,然后里边我们就直接定义一个sum,也不用在外面定义,直接在这里sum等于就可以了,那sum应该等于什么呢?哎,这个稍微有点麻烦,我们应该是按照这个C或者Java里面的语法,应该是some加等于,然后加上当前的这个I就完了,对吧?呃,就是some加等于I就完了。但是现在呢,并没有直接的这个加等于的表表达啊,没有这样的运算符,那就必须要写成sum等于。Some加I。但是大家要注意啊,这里的some。我们是可以直接给这个变量进行赋值,那在使用这个变量的时候,你能直接用sum吗?哎,不能,是不是得用Dollar sum呀?哎,所以这个我们一定要注意一下啊,必须用Dollar some,另外呢,I也得用Dollar I。
06:07
而且另外还有一个就是我们在Excel里边这个加法能直接这么做计算吗?也是不能的,它必须还要包裹在一个运算表达式里面,诶,所以我们看最后的写法就写成了这个样子啊,不停的有这个运算符的。这个表达式把它要框起来,所以相对来讲有点麻烦啊,啊,因为我们知道你如果不加外面这个Dollar中括号,把它框起来的话,这个加号相当于我们就直接字符串连在一起了嘛,啊,所以接下来我们这的写法是Dollar,然后一个运算表达式里边的写法是Dollar some加上。I,所以有了这个之后,接下来直接倒。好,然后我们就可以保存退出,然后把当前脚本的执行权限打开。就可以直接去执行了,3TWO,我们来一个100测试一下。
07:00
哦,这里没有得到输出,主要是因为我们最后只是做完了,但是没有。没有echo没有把它这个结果输出啊,那所以这里边我们忘了一句啊,就是要做一个echo当前的Dollar。好,做一个保存,接下来我们再来执行一下,没有问题,5050非常熟悉的一个结果,对不对啊,一一直加到100,是5050啊,那当然了,你如果要是加到十的话,那应该是55啊,从一一直加到十的结果。所以这个其实放循环还是非常容易理解,很容易想到的啊,啊,那这种用法其实我们看到就是跟在C语言或者是Java里面的写法其实是非常类似啊,可能有同学在这里会有点疑惑,那就是说诶,你之前我们讲这个条件控制的时候,不是说里边这个你要是小于等于得用这个杠Le嘛,这才是小于等于嘛,呃,就是less或者是E口嘛,哎,这样才是我们标准的这种写法,当时我们说过不能随便用这个大于号小于号,呃,对lix里边大于号小于号有它的这个输入输出重定项的意思,你不能乱用,那为什么在这又可以用了呢?
08:08
为什么这么诡异呢?这里需要解释的就是我们这里使用了双小括号。啊,这也就是说在这个双小括号里边,我们就可以直接用数学上的一些符号,一些运算表达式了,哎,大家还记得之前我们讲到运算符那节的时候提到过。书写一个运算符的时候,可以直接用Dollar加中括号,也可以用Dollar加双小括号,诶我们应该还记得这个对吧?所以在in shell的语法里面啊,就是如果用双小括号括起来的话,里边是可以直接跟一个数学上的运算式的。哎,这个我们也可以在但里边啊,在这个控制台再去做一个具体的测试,比方说我们给一个,哎,比方说A等于三,那接下来我们直接来一个if判断。If这里直接双小括号括起来。那之前我们如果要判断的话,If加一个中括号,里边都是直接去写这个,呃,就是杠LT,杠GT这样去做大于小于的判断了,那现在呢,如果我用双小括号直接就可以。
09:13
Dollar a,比方说判断它如果要大于二的话,哎,那么接下来我们直接在一行写啊,Then。Echo OK啊,或者说比他大对吧,那else。Echo not OK。然后Fi,我们看直接就输出OK了,没有问题,哎,那如果A等于一的话,我们再来敲一下,那就not OK,所以这个逻辑判断其实是完全没有问题的,如果在双小括号里边,我们就可以写对应的这些运算符号了。啊啊,当然了,就是说我我们现在在这个for循环里边,你可以认为它是这样的一种写法啊,在if里边我们可以这么写,但是一般不会这么写,因为双小括号明显看的比较比较难受嘛,所以一般我们约定俗成的写法还是if后边用这个中括号去写一个标准化的那种形式啊啊这只是给大家说一下,那for这里呢,这就也是约定俗成的写法,我们这里边这个语法就规定了,你可以直接双小括号里边直接写我们熟悉的这种方式啊,这样的话语法能够更加的我们看起来更好接受一点啊。
10:18
呃,那这里要介绍的是这种用法呢?跟其他的编程语言非常相似,但不是link shell里面最常见的for用法,那它更加常见的用法是什么呢?其实是第二种语法,我们看一下。第二种语法是for,后边直接跟一个当前的变量。诶,然后是in,我们还记得之前讲到这个case的时候吗?诶,Case也是这种用法,对吧?Case一个变量,然后in在哪些的这个匹配模式里边啊,这个in表示在哪里吧,在这些匹配模式下执行对应的分支,那现在的for呢?For指的就是在后边的这些值里边。取出对应的变量,所以相当于我这个for的这个循环变量啊,它的取值范围就是应后边的这些值。
11:06
同样后边我们以度开始,以档结束,执行一段循环代码啊,所以接下来我们可以对这个在控制台里边再来做一个测试,我们先做一个最简单的测试吧,就是后边我们看到直接可以跟不同的值,值一值二值三啊,在里边直接取就可以了啊,所以我们这里直接就写成一行啊,不用写脚本了,在这里直接for,比方说我们for一个,呃,当前我们就取几种不同的操作系统吧啊,那比方说我们就把它这个循环变量叫做OS操作系统,然后我们就in in什么呢?Linux,然后另外空格就可以啊,Windowx。啊,那另外空格麦克OS只要在它们几个里边去进行选取,然后就do do什么呢?啊,那我们直接把它echo出来不就完了吗?OEO最后到。我们看一下,那接下来就相当于把这三个值做了一个遍历,每次都做了一次输出。
12:03
所以整体来讲这个用法还是非常简单的啊呃,那另外还有一个就是其实在这个linknu she里面有一个内部运算符,好,它的内部运算符的这个表达式呢,是划括号。这也就是为什么我们不能随随便便用这个花括号表示一个函数体啊,或者说表示一个一段代码,把一个代码块括起来,这个花括号它的用法是表示一个序列,那里边怎么写呢?比方说我如果要是从一到100向前面啊,我们要从一加到100,那怎么样表示这个一到100的序列呢?直接写一点点,注意两个点,然后100。这就表示从一到100的一个序列,所以接下来我们就知道了,这个in后边可以直接跟不同的值,也可以直接跟一个这样的生成序列,好,那所以接下来我们直接还是写一下之前那个一一直加到100的那个程序啊,那我们比方说I,那就in当前的一个生成序列点点100。
13:03
然后哎,分号,接下来do,我们当前还是给一个some,就等于当前的Dollar。Dollar。加上daughter I。然后到。呃,当然了,做完这个之后不要忘记还要echo一下。Dollar。我们看到直接就输出了5050,哎,所以这种用法也是可以的,那通过这样的一个例子,我们其实就看得出来啊,当前的这种做法,这for什么应什么里边,那后面其实跟着的就是一个序列,类似于就是一个集合,集合类型啊,所以如果大家熟悉其他的一些编程语言的话,就会发现啊,这不就是相当于。Java里边的增强for循环的用法吗?那就相当于这个for或者for in的这种写法嘛,所以我们可以认为啊,这种写法就是增强for循环。Linux shell里面也有增强放循环啊,这种方式其实用的还会更多一点。
14:05
啊,那既然有了这个fall in的这种做法,接下来呢,我们就来给大家再来详细的回过头来说明一下Dollar芯和Dollar at的区别,我们一定还记得当时讲过的这个特殊变量啊啊,它主要是表示我们当前的输入参数,我们还记得当时介绍的时候,Dollar芯主要的特点就是他们其实都是可以把我们当前命令行里面啊输入的所有参数都获取到,区别就在于Dollar芯把所有的参数看成一个整体,而Dollar at呢,它是可以把每个参数区别对待的。之前我们直接做这样的一个打印啊,把把它这个打印出来,你会发现好像都一样,所有的参数就是空格空开,然后直接输出了,那他们的区别到底在哪里呢。如果使用for的话,我们就可以看的更加的清楚啊,所以接下来我们可以测试一下这个Dollar和Dollar at的区别。
15:00
那我们现在还是重新新建一个测试的脚本啊,这是跟参数有关的parameter,我们是用for去做一个test。点进来之后,首先先写文件的头。Bash。然后接下来我们其实想要测试的就是当前这个Dollar芯和Dollar at,那我们还是把这个做一个分割线吧,诶,那这里要注意啊,如果我们想要写这个Dollar符在里边的话,要用单引号,之前我们说过。好。做这样的一个分割线,里边输入的是Dollar芯,我们先来看一看这个Dollar芯是什么样子的。好,我们直接到下一行来继续输出,然后接下来啊,那我们就直接来一个for了啊,那接下来我们肯定是要输入多个参数的嘛,那就for当前的每一个参数。In,当前的Dollar心。然后接下来do做什么操作呢?哎,直接echo当前的Dollar per,把当前的参数输出,接下来倒就可以了。
16:04
啊,那那当然了,做完这个之后,我们可以把上面的内容做一个复制,我们看到一共有五行啊,Y5Y,然后直接到下边来做一个粘贴啊,然后接下来我们进来之后把当前的Dollar芯改成Dollar at,然后里边我们把这个同样啊,这里也改成Dollar at来进行一个输出,接下来我们可以到外边直接去做一个测试。首先还是先需要把当前的执行权限打开,Parameter for test,把它做一个更改当前的可执行权限,接下来就直接去执行。For test后边跟上各种各样的参数啊,Abcde。好,我们可以看到直接这么输出的话,我们会发现Dollar芯和Dollar at好像没有任何的区别。啊,所以这个我们要解释一下啊,就是在当前我们这个脚本里边,如果对Dollar芯Dollar at这所有的参数进行遍历的时候,如果他们不被引号引起来的话。
17:07
当前他们俩没有任何的区别。哎,这就是我们所说的啊,就是当前使用的过程当中,直接这么用,其实还是把每一个里边具体的参数都能获取到,然后单独把它打印出来的。那假如说我们现在加上了引号。把它引起来之后,接下来我们就能看到区别了。直接保存,然后同样的命令再来执行一遍。我们看到上面的Dollar芯输出的就只有一行,这表示什么呢?这表示。双引号引起来的Dollar芯。其实就只有一个元素,那就是把所有的参数都当成一个整体,Abcde直接一行数数,而下面的Dollar at呢?还是把abcde不同的参数作为独立的数据来进行输出的,所以我们的for循环就把它们依次打印出来了。
18:03
这就是我们所说的这个Dollar at和Dollar芯的区别啊,当然了,如果大家觉得这个某一个比较好用,比方说我觉得这个Dollar at更好用的话,诶,那我们干脆就直接在这个脚本里边直接用它就可以了,就不用做更多的区分了。这就是关于我们所说的for循环的具体的用法。
我来说两句