00:00
到目前为止呢,我们已经学完了shell编程当中主要的一些语法特性,那接下来呢,我们就可以把它们做一个综合运用来看一看怎么样解决实际工作当中的问题了啊我们这里首先看。综合应用案例里边的第一个就是来做一个文件的归档。啊,其实我们都知道啊,在实际工作当中,一些重要的数据啊,或者说文件,如果要是弄丢了的话,那肯定让人会非常的抓狂啊,相信大家都有过这种,比方说写这论文啊,或者说写一篇重要文档的时候,一下子电脑给宕机了啊,结果没有进行保存,这种经历肯定是非常惨痛的啊。所以对于我们在生产当中的重要数据,或者是比方说像我们项目的代码,或者其他一些重要的文档,最好是定时的进行备份存档这样的操作。呃,那这个过程呢,我们就需要用到一个归档命令了啊,之前我们学过归档命令就是TT这个命令呢,后边可以直接跟上一个杠C参数表示现在是要做的一个存档归档的操作,那如果加上杠Z的话,就可以表示同时进行压缩,那么得到的文件名呢,后缀就是点t.JZ啊,我们知道它本身做压缩的时候使用的是j zip这个工具压缩工具。
01:21
那我们现在具体的需求是什么呢?我们来看一下需求描述啊,我们做的这个归档操作,那就是实现一个脚本,这个脚本呢,每天可以对指定的目录进行归档备份,那我们输入的时候调这个脚本怎么调呢?那就是给他一个参数,输入一个目录的名称啊,这里我们要求就是末尾不带斜杠啊,直接给这个目录名称就行,当然了,这个没说前面带不带路径,那我们可以带着路径,那我们进行一个转换提取就可以了。然后呢,我们将目录下边的所有文件。按天进行归档保存,并且把归档的日期附加在归档文件名上,也就是说最后我们生成的这个文件啊,后缀是点t.JZ。
02:07
那么前面它的名字应该是什么呢?那就应该是比方说我们就把我们的这个脚本目录啊,现在我们用的不是这个scripts这个目录吗?我们就把这个目录做一个归档,诶那比方说我们定义的名字就叫做呃,或者前面我们加一个前缀叫archive啊阿IVE归档,然后scripts,然后后边跟上当前的日期啊,某某年某某月某某日。然后后边再点t.JZ,哎,这就是我们最后想要的这个文归档出来的文件名。所以这样一个操作啊,这个好处就在于就是我们只要把这个做完了之后啊,每天就不用做其他的一些变化了,不用再去手动的去改这个文件名了,自动的生成对应的这个名称就可以了,每天都去做。而且我们甚至可以进一步把它设置成一个定时任务,比方说啊,每天夜里边两点钟啊三点钟,然后去跑一下这个脚本,那就直接可以归档生成这样一个文件。
03:05
那这样一个需求其实还是非常的有实际意义的,所以接下来呢,我们就直接到控制台这边先去创建一个这这样的脚本文件,我们还是在scripts下边去另创件,这个我们就叫每天归档啊,我们就叫做daily archive。我们知道阿,就是有归档的意思啊,点SH先把它创建出来,然后我们先把这个头写上。叹号BBA。然后接下来我们的这个操作呢,呃,其实整体来讲比较简单,最关键的就是一个T命令吧,啊,这是我们的最本质上啊,最后要调用的一个命令,那在前面呢,在这之前我们如果要是把它作为一个自动化运行的脚本的话,肯定我们要考虑很多其他的一些问题,那就是你如果调用这个传入参数的时候,假如说你给的这个目录根本就不是一个能够找到的目录,不是我们正常有的一个目录,那你这个时候,呃,直接去做归档,直接做T,这个显然就没有必要了,而且容易出现错误,所以我们应该做更多的判断。
04:10
首先我们先来判断一下当前你的输入参数是否正确,我们现在要就一个参数,就是当前要归档的一个目录。所以我们判断。首先判断输入参数个数是否为一,因为我们只能要一个参数,不给参数,或者说是有了两个以上的参数,都是要报错,都是错误的,所以接下来我们首先做一个if判断,这个衣服很简单啊。当然就是当前的个数,用什么呢?哎,当时我们有一个特殊变量叫Dollar井号,当前的参数个数。判断它是否不等于一,Ne表示not e口不等于一,如果不等于一的话,那这就出现问题了,直接我们echo一下。当前的参数不对。参数错误。
05:01
个数错误。我们说啊,应该输入一个参数作为归档。的目录名。啊,就是要做归档操作的这个目录,目录的名称,好,接下来我们在啊,这个就不用再艾别的东西了,我们直接退出,注意在当前的脚本里边,如果完整的退出脚本不再执行下边的东西的话,那可以直接敲exit,就像我们在外边啊,退出当前的bash这样一个控制台一样,所以接下来。Fi结束当前的判断,这就是第一部分,先做了一个基本的操作,然后我们空一行方便展示啊,看得更清楚一点,接下来还是来一个注释,我们要做的是,呃,那接下来如果说当前这个参数个数是对的的话啊,那接下来我们就应该要从输入参数里边获取当前输入的目录名称了,诶,所以接下来我们就是。从。
06:00
参数中获取目录名称。那呃,在这里的话,我们首先得判断一下当前的这个给的参数,现在首先它是有一个参数啊,但是它到底是不是一个真正能够判断出来,是不是真正的一个目录呢?那我们首先用杠D来做一个判断。后面跟的当然就是DOLLAR1了。第一个参数。如果是的话,哎,那么我们如果是的话,其实没什么关系啊,我们直接先eo先先出来,然后如果不是的话,这个时候就要报错了啊。我们为了看得更清楚一点,空一行这个IO表示就相当于是空一行了啊。然后我们这里输出一条信息,目录不存在。报错。既然是报了错,那后边我们还是应该直接exit退出。Fi当前的一个判断。先把它。跳出来,然后接下来如果说这个目录是正常的话,这个时候我们再去把目录的名称提取出来啊,那么在这个过程当中,我们可能会想到啊,这个目录我们还是做一个截取吧,就是因为我们在外面输入目录的时候,并不知道它是绝对路径还是相对路径嘛,我们在最后应该还是希望获取到它的绝对路径的,那之前我们曾经讲过可以使用。
07:22
DR name。和base name去对当前的这个路径进行截取啊,那base name截出来的就是它真实的最后啊,最后一个斜杠后边的那个内容啊,那因为我们现在这个目录本身输入的时候是不带最后斜杠的嘛,所以一截截出来的就是底层的目录名称,那对应的dir name呢?呃,就可以我们在使用那个PWD啊,获取它的绝对路径。去获取到当前目录所在的绝对位置,所以接下来跟之前我们做的那个操作有点类似,就直接定义一个,我们把这个叫做。DR内。
08:02
A。那么这个name的话,我们直接就使用。这里做一个命令替换,里边执行的是base。当然就是把DOLLAR1放进来就可以了啊,那对应的还应该有一个DR。它的路径我们叫DR pass。这个执行的过程当中,哎,这个可能需要两条命令,我们想首先我们CD到当前它的目录下边来,就是我们当前DOLLAR1指定的这个目录下边来。那需要也要做一个Di name,一把它做一个提取当前所在的路径啊,那前面呢,同样是一个命令替换的方式,把这个先包装起来,然后呢,第二步再做一个PWD。做一个当前工作目录的绝对路径的提取,这个跟之前我们做的那个操作是完全一样的啊,然后接下来啊,那。
09:00
我们就可以真正的去定义想要生成的那个归档文件的名称了。所以接下来我们再来注释一条,获取,我们首先得获取当前的日期。获取当前日期主要就是年月、日,所以这里面我们定义一个date。这里的date的话,需要同样做一个命令替换,之前我们也做过,那就是直接date,加上现在不是时间戳了,不是百分号S了,我们现在要的是百分号Y,这是年份百分号M,月份百分号D,这是日期啊,那然后接下来我们就可以定义出。定义。生成的归档文件名称啊,因为我们得创建这样的一个名归档文件嘛,先把这个名字先定义好啊,那首先我们给一个file表示当前的文件名称,那这个file的话,我们加一个前缀啊,就叫做阿K。然后下划线,后面跟着的是我们指定啊当前这一个目录,截出来这个base name,它本身叫什么名,我们就I哪个目录啊,那比方说scripts的话,我们这儿就是I car scripts啊,所以这里边我们直接把前面的Dollar。
10:16
Di name放在这儿,然后后边后边我们还要做这个下划线,继续跟,哎,为了让我们看的更清楚一点,因为前面这个它的变量名称带着下划线,那我们用一个花括号把它括起来,然后接下来那应该还有Dollar date。当前的日期跟在后边,在后边呢,就是点t.JZ,这就是我们定义的这个生成的名称,那对应的生成路径放在哪里呢?这个我们直接定义死吧,因为在外面这个需求是说说明了放在root-cap下边,所以我们直接把这个定义死了,就叫做比方说我们把这个叫做test吧。然后给他一个路径叫做root,搞阿K啊,那当然了,这个路径最后我们其实就是要直接把这个文件生成了啊,单独的这个路径其实我们并不需要啊,那所以干脆后边我就把这个file。
11:09
本身它的名称也跟在后边了,照着这个路径直接生成文件就完事了,所以这相当于就是这两步把它拼出了我们最后想要的这个文件的绝对路径,然后接下来就真正的可以开始归档了。好,开始归档目录文件。那我们这里,呃,来做一个首首先做一个提示吧,我们来一个eo啊,那这里做一个。人性化的提示开始归档。好,加一个省略号,然后再空一行,接下来啊,那当然就是使用T命令真正的去做操作了,这里的T我们加一个杠C表示现在是归档操作,加一个Z表示当前还要进行压缩,把它加一个F可视化啊,整个这个过程看的更清楚一点,然后接下来后边的话需要跟着的应该是当前的。
12:05
生成文件的名称,生成文件名称是不是直接用这个就可以了,哎,那这里面直接跟上D就可以了,D表示destination啊,我们的目的地,我们到底要生成的是什么东西,然后接下来呢,还有我们要归档的那个目录名称啊,这个目录名称我们也可以直接用Dollar,但是Dollar呢,我不太确定当前执行的啊,本身这个执行的地方跟我们传进来的这个对应的目录参数是否一致,所以这里边我们还是出于保险用绝对路径。哎,这里有DR pass,这个比较稳。那下边再加一个,加上当前的DR内,这个就完全没有问题了,把它完全完整的拼出来。有了这个之后,诶,那接下来我们就可以判断到底是否成功了,打印一些成功或者失败的信息,那是否成功呢?我们还是用if来做一个结果的判断,前面这条命令是否执行成功,Dollar问号,看它是否equal,是否跟零是相等,是否等于零,那如果是零的话。
13:08
我们先多空几行,看的清楚一点啊,Then,接下来我们就还是空一行eo。这里边就真正归档成功了。归档成功。然后接下来我们再输出一条信息,那就是我们归档的文件,归档文件为叫什么名字,哎,那我们完整的这个都已经有了嘛,Best这里。就是带着路径的最后的这个归档成功的名称,后面我们可以在空一行艾O一下,那如果说当前返回的这个代码值不是零的话,那else。这个就相当于出问题了,哎,那我们直接来输出。硅导。出现问题。同样我们eo,呃,那最后其实我们也不用单独的退出,因为完成之后现在已经做完了,最后总是要退出的,我们加一个exit,这就是完整的过程,我们就把它做完了。
14:10
所以这个过程整体来讲还是比较简单,思路比较清晰的,关键就是每一步具体的操作,我们要搞清楚到底要干什么。平常如果在创建自动化脚本的时候,有很多其实都是这种细节问题,你就看这个参数到底输对了没有啊,然后我们想要的这个每一个目录名称啊,文件名称到底应该怎么拼,往往都是这些具体的问题,好,那接下来我们把这个做一个保存,然后接下来就可以执行了。Mod啊mode加给当前的这个加上执行权限,哎,之前我们一般都是直接加X,如果加X的话,那相当于就是给所有用户加上了可执行权限,那一般我们在实际生产当中呢,诶,只要给当前用户啊,我们的属主加上执行权限就可以了。所以把这个加上U加X,然后我们看一下当前。
15:02
啊,我们的daily archive这一个脚本,它的权限就其他用户没有这样的权限,只有当前的属主有可执行权限,接下来我们就来做一个执行啊,那执行的话就是直接运行当前的daily阿K,然后跟上一个当前的目录,那如果说我们不跟目录直接敲的话,哎,那你会发现他说参数个数错误对吧?哎,那直接后面什么都不执行,或者说如果我们这里边给的这个太多的话,那肯定他也是错误,所以我们这里边就只能给一个。当前的啊,比方说我们给一个scripts这样的一个目录名称,我们要求是后面不要以这个斜杠结尾啊,因为我们使用了。Base nameme去做做截取啊,最好是只要给到这个名字就可以好回车,诶,我们看我们看这里归档是出现了问题,哎,为什么呢?因为我们是要把当前的归档文件放在root下边的阿IVE目录下边,但是我们现在没有那个目录,哎,那当然了,我们需要make Di。
16:03
我们需要把root下边的archive这样一个目录要创建出来,然后再来执行一下当前的脚本,哎,我们看现在就归档成功了,归档文件为啊,我们看当前的日期22年3月18日,然后点塔点JZ,这样的话就把它归档完成了。诶,这就是我们整个这个脚本处理的过程啊呃,所以整体来讲的话,使用脚本去进行一些操作,自动化的这些处理操作其实还是非常简单,非常方便的啊,当然了,这个还没完,如果说我们想要实际去做更好的应用的话,这个没必要每次都去手动做归档,我们可以直接把它加入到当前的定时任务里面来,哎,那我们还记得之前定时任务的使用使用。Crown tap这样一个命令啊,那我们可以看一下当前系统里边啊,Root没有定义任何的定时任务,那我们可以直接杠一来做一个编辑,比如说哎,我们就说当前需要在每天晚上啊,凌晨啊两点钟去执行这个脚本,那非常简单,我们直接给一个零二,后边都是芯儿芯儿芯儿。
17:12
我们知道第一个这是。分钟数,也就是当前到底是几点的多少分,然后第二个呢,就是小时数,所以零和二,这就表示当前是晚上的两点整,凌晨两点两点整,第三个是当前的天数,每个月的第几天。第四个是第几个月,最后一个是星期几,哎,那我们这个没有任何的限制啊,这些就是全都是星儿,任何一天的凌晨两点钟去执行一个脚本,我们要执行的是什么呢?哎,当然就是root下边的,哎,那我们把这个写对scripts下边的一个脚本叫做daily。RK。点SH。当然了,它还需要跟上一个参数,我们把这个参数定义成绝对路径root。
18:04
Scripts把对应的这样一个目录去进行一个归档啊,那这样的话我们可以做一个保存,然后现在我们就有了这样一个定时任务,之后的话,每天我们定期的把它做一个归档啊,就实现了我们这个重要数据的备份归档的管理啊,这就是这个具体的应用案例,大家可以试一试把它做一个实现。
我来说两句