00:00
大家好,欢迎大家继续收看上硅谷的云算课程。我是沈超老师。这节课呢,我们上节课把for循环的两种这种格式这个搞明白了。那我们这节课举一个例子。那我们写一个最常见的这样一个for循环的应用,就是什么批量解压缩,那。我会用这两种语法格式啊,两种语法格式我都会写一遍这个批量解压缩的这个程序,然后我们从而可以看看为什么我说上面这种看起来很笨的这种循环方法反而更适合写运维脚本。而下面这种,其实真正他来写起来是其实是更加困难。好了,那什么是批量解压缩啊各位,我在我们的SH目录下啊,我现在在这里,我们上一条都在这儿,我事先新建好了一个踏目录,那我们进去这里面呢,我加了放了一些这个测试的这个压缩包。那这个包呢,我随便找了几个啊,这个比如说阿帕奇买斯克PP的两个工具包,这两个是安装阿帕奇必备的这样一个依赖包,那当然啊,其实这可能是一个lamp的基础环境,但是啊,我们如果要真的要是安装LA amp环境,这几个包远远不够啊,我们呃,甚至可能都还会报错啊,我只是这里举几个例子,我随便挑了几个包,如果我们后面真正来装l amp的时候,我们这个5.6版本的PP这个源码包最少需要19个。
01:33
当然我看我说的是我们这个功能该有的都要有的情况下。啊,如果你只搭最基本的这三个包,其实也能装啊,就把报错解决了就行,OK,所以啊,我们今天不是装lamp啊,我只是想把这个压缩包解开。那这时候我就可以考虑了,我手工一个一个解可不可以可以啊,当然可以,麻烦吗?对吧,那我们说了,那我们的这个12脚本干嘛。
02:00
是不是就是降低管理员的工作难度了,换句话说就是重复劳动,哎,你这20个压缩包,一个一个手工解压缩,是不是重复劳动很麻烦的,那我写一个12脚本以后写好了之后,我只要把这个脚本一运行,我所有的压缩包就解开了,这是不是就是常见的一个功能,对吧?好。那我现在要写这个压缩包。那么我先用第二种语法格式,我先用它来写。然后我们再用第一种,这样的话,我们就可以看一下到底哪种方便对吧,那好用第二种来写,那怎么来写呢?那这个压缩包就有两个需要注意的问题,或者说两个重点东西内容。解决了这两个问题,这个包就可以解决了。第一个。我需要知道压缩包的总个数,它的个数总共有多少?为啥,各位?我肯定是不是要用循环,是不是来这个解压了,对吧,那我知道它有多少个包,比如说我这里有六个,那我们是不是就循环六次,每次循环这个解压一个包是不是就可以解决,所以首先第一个问题,我需要能解决这个事儿,我需要要知道我的压缩包的总个数是多少。
03:19
这是第一件事。哎,这时候怎么办,我们就能想到了一些什么,比如说统计啊,WC的那个是不是就可以用到了,对吧,但是你小心啊。WC它统计的是文件里的内容,是文件内的数据,文件内的数据换句话说,统计的是字符串。而这个是文件名。WC肯定无法直接统计文件名,那怎么办?很简单嘛,把文件名是不是保存在一个文件当中,一个临时文件,比如说t.log当中。日志当中。保存在这里面,那把文件名直接写进去,那它是不是就变成了这个什么。它是不是就变成了字符串,再用WC统计这个文件有多少号就可以了。
04:04
对吧,那好,第一个问题解决了。我需要知道我的压缩包有多少个,哎,你不能在这里直接写六个,为啥我这个如果这个写成六个,那我换一个,比如说我里边多了个压缩包,少了压缩包,你的整个程序是不是就得重新写,这个肯定不合理,所以我需要让程序自动来统计压缩包总个数多少,而不是我人一个一个数出来啊,六个我写在这写六个循环,那这样的话,你的脚本就它的适用范围就很很窄,只适合这一种情况。在其他情况下是不是就用不了了,对吧?这是第一个问题,那第一个问题解决了,就是我要知道压缩包的总个数,第二个问题就是我要把每个压缩包的名字单独提出来,附在变量当中,比如说附在变量A当中。哎,每次循环的时候,第一次循环变量AA当中是第一个压缩包的名字,那我是不是就可以用它变量是不是来解压,后面加这个变量名是不是就可以了。
05:03
诶,那第二次呢,循环的时候把第二个名名字附进来,我是不是就循环六次,把六个包依次把六六个包的名字附在这个里面,我是不是就依次可以干嘛把这个事解决了,OK,好各位,其实如果你能想明白这两个事儿。一个我要能统计压缩包的总大小啊,就是总个数,第二个就是要统计每次循环的时候。把文件名附在变量当中,这个时候你的脚本就写完一半了啊好了。那我们想一下到底怎么做,其实我事先写好了,那我们看一下。首先这是所有的脚本的开头,必须都有,其次,让我的脚本能够进入我的压缩包目录,对吧?接下来看干嘛?我们都说过了。LS是不是显示文件名,把文件名是不是追写入这个临时文件,目的是不是就是把所有的压缩包名都写入在这个临时日志当中,对吧?为啥要写入日志当中?写入日志之后,WC是不是才能统计它的大小,才能统计它的个数?
06:14
WC是不是才能统计它的个数,我说了WC统计的是不是文件里的数据,对吧?其次呢,我的什么这些aw k啊,它是不是也是读取的都是字符串。他是不是才能从里面读取出来我们需要的这个每一个文件名对不对,所以啊,我们先要做的事情就是把压缩包文件名写入到这个日志当中,那注意啊,我没有写的是LS星进入这个文件,为啥。我这里面待会儿可能会有干扰文件,比如说我会在这里生成一个点log的日志文件,我的压缩包,我这个脚本我打算也写在这里,那如果是所有的文件名都写在这里,那这个就不是压缩包,所以它是不是就会干扰我的脚本执行,所以。
07:02
我写的是新点塔点JZ,也就是说要求是用点塔点JZ的文件写进去。然后呢,把点塔点7JZ,哎各位,我们这个脚本当中,这些压缩包当中,我们没有看到点7JZ的这个扣住点对吧,那其实当我们后面真正要装lamp的时候,我们可以看一下。咱我们后面真正要装lamp的时候,它是有这种。就是PHP的函数模块是1.t之Z结尾啊,这个也是有可能的,对吧,那那那也就说如果我这里还有什么点塔点bc two,我是不是在这里都写进去,哎,就把这块。一个一个再写一行al.t b two把它也追加进来,诶,这样的话,我这里面是不是就包含的是我所有的压缩包了这个文件名了,在这个日志里,没错吧,这就是这两行的目的啊,那我们先手工执行一下脚本来看一下那。
08:03
我们先LS星点t.JZ,把它写入t.log那么LS星点TJZ看清楚啊。看第一个用的是单大于号覆盖,如果这个文件里面其他之前有内容,那我是不是先把它清空一下,然后再往里写数据,第二次就不能覆盖了,往里是不是就是写的就是什么,哎,星星啊。往里面写的是不是就是追加了对吧,那这里面。啊,这个现在是没有这种压缩包,所以他报错了,阿拉斯没有找到它,对吧,那要有这个东西是不是就可以写进去了,所以啊看。我在这个脚本后面加了这样一句话。这个我们讲过了,按道把正确输出、错误输出都输出到一个文件当中,而第一下的怒相当于一个黑洞,这是系统准备的一个二进制黑洞,换句话说,你可以理解为是回收站,把任何数据丢进去都相当于不看它。
09:09
就是就把它丢弃了,那为啥这样写,就是这个这条语句有可能会报错,报错的话也无所谓,它不影响我的脚本执行,就是没有这个这种格式的,它其实并不影响我的脚本运行,所以我把它直接丢弃到这里。没错了,好,那这个时候你看可以看到。这个日志它就生成了,那我们打开看看这里面的日志是什么,内容是什么,看到了吧,是不是就是我所有的压缩包名,而且好处在于它是每一个包名一行。每一个包一行保存下来,各位这都是有用的,要不然后面如果他把所有的包名都写成一行。你想想你到时候提的时候就更麻烦了。哎,我是不是要还要分列来提,那如果是这样来提的话,我是不是只要把一行提出来,一行的数据提出来,那这个时候这一行是不是就是第一个压缩报名,那第二行是不是就是第二个压缩报名,没错吧,所以他刚好是把所有的文件名都是分行写的,每一个文件都写进来了,好。
10:13
那这是前两行的作用,看懂了吧,目的是为了把压缩报名写在这个日志里,接下来第二个。我现在就要统计行号了,看输出,其实这个可以直接写WC-L,然后这个呃,t.log都行啊,但是我一般习惯性的还是这样,看输出一下内容,WC统计有多少个,那这样的话A里面的值是不是就是我的文件的个数啊对吧?那我们试试啊,A等于刀单小括号调用系统命令对吧?K输出这个最好写绝对路径,这要不然有可能会出问题。呃,踏下的踏点log,然后统计行数,好,那我们IQ Dollar a看一下里面的值是不是就是你的包的个数对吧?就是这个文件里有多少个文件名,每个文件名是不是刚好占一行,那我统计行数,这个行数是不是就是这个压缩包的个数,没错吧?那现在变量A当中保存的是我的总共的压缩包个数,那我好,我现在写循环了看。
11:20
放爱。首先爱是一。其次,当只要I小于等于A的值的时候,我就循环,那也就是说我现在A的值是六,那也就是说I会循环六次,每次循环完之后I加一。对吧,这是这个循环的作用,为啥要统计个数,我这种循环就第二种这种循环,我是必须要知道循环多少次我才能循环的,对吧?好,这是循环的内容,然后呢,我现在要做的就是每次循环。来来来,我把文件打开,看了每次循环是不是把这一行的数据提出来附在变量BB当中。
12:04
没错吧,哎,我们说了每一次循环,第一次循环提取第一行的内容,就把第一个压缩包里面放进去,第二次循环提取第二个把它放进去,第三个提取第三行对不对,把它放进来,那怎么来提取行的。怎么把这个文件里的行的数据给提出来,各位格不行啊,格要想提的话,他没办法按照1234来起行,Graph要起行它只能提取什么关键字,比如说我要写的是gra,我要找AP。这个行,然后我加文件名,文件名我才能提取A行,但是我现在这几个文件名它都是不一样的呀。它不是按照关键字来提取行格,是要按关键字来提,我是要按它的行号来写123456,我才能提取行对吧?好了各位这个就很麻烦。
13:01
Graph之类的东西就做不了这么复杂了,这个行气群要想做,只能利用aw k。啊,各位,如果你要不用aw k自己手工写,那就更麻烦了,遍历一遍,一行一行来做,那就等于相当于需要再写一个脚本,Aw k最方便,那我看看我们怎么写了,看它。一次循环的时候,然后呢。读取文件内容,然后呢?当aw k NR等于看啊,字符串等于是双等号,OK,这块不是数字等于到来。NR是什么?我们往前翻一下,我怕你们忘了,我们找一下,找1WK啊。我们找一下哪呀。来,NR是aw k的内置变量,自带变量,它做的作用就是统计的是显示的是你当前是第几行啊,甚至当前正在处理的行是总数据的第几行,也就是说我们后面看举个例子我找找啊。
14:04
呃,哪行了,看当NR等于第二行的时候,诶,我这块是不是就可以提取第二行的内容,然后PP1附在这个刀一零,PP2负在刀二,对吧,它可以提取指定的行,就说你可以你后面NR等于这几行它就提取。这几行的数据OK,那。我这个脚本写的是什么啊?Cat先把文件内容输出交给WK来处理,然后呢,单引号,当NR等于到来的时候。各位,这个地方讨厌了啊,看两个单引号在这这个地方调用依然是单引号,双引号的话会出错,小心啊,那到了爱是啥,I的值第一次循环是不是一样。第二次循环是不是Y加一是不是就变成二了?所以就说第一次循环的时候,NR是等于一的,NR等于一,那是不是就是提取第一行的数据,然后第一行呢?打印第一行的经记列第一行呢?那这里有几个文件名啊?1234566行文件名数据,那它里面是每一个文件名是不是就保存一行,所以打印第一行的第D列,是不是就是这个文件名把它赋予变量BB。
15:20
对吧,那也就是说如果这样写的话。BB里的值每次循环是不是就是它的这个文件名了,对吧?那第二个问题是不是就解决了,把文件名是保存在变量BD当中,接下来看ZXVF解压缩就行了,对吧?把刀BB里的值给解压缩,直接压缩包位。哎,各位,这就是这个循环的作用,各位,其实这个循环很讨厌啊,我跟你讲,这是由于还是有aw k的NR变量在这儿的,所以我能提取指定的按照行号来提取,我是能通过一条命令就能提出来,如果要是没有这个东西来提坏了,那写起来就更繁琐了,会更麻烦,OK,那我们试一下这行数据啊,各位,我们试一下看,我把它复制过来。
16:09
我看看BB里的值是什么?我把它粘过来来,我NR这里不能是到来没有值对吧,那我说NR等于一,当NR是E的时候,看BB里的值I口到BD。看是不是就是这个压缩包里的第一行数据,看压缩包啊,这个日志里的第一行数据。看到了吧,能理解BB里是什么吗?那如果NR等于二呢?那看IQ到BB,它是不是就是第二行数据了。看到了,这就是这行语句的作用,N就是提取指定行,指定行之后再把指定的列,因为这个文件只有一列,所以第一列就是这个文件名就是这个文件名,把它附在变量当中,看明白了。这样的话到了BB里是不是就是压缩包的文件名,然后记下就行了,看懂了吧,这个脚本的作用就是这样,OK,好了,我一行一行拆开讲了啊,我把它直接粘贴了,我不再手工写了,可以啊。
17:13
好,那我们干嘛就写一个差点SH,为了节约时间粘贴了啊好,这里面这个我们就可以执行了,看懂了吧,那我们试试啊,按照。然后我们称之木的负。这个。执行权限。好,然后我们执行他点SH,哎开始加了,看到了,哎,它会自动的看,现在写的是my circle。然后呢,稍微等一会儿就会变成其他的包哎PP了对不对,哎,这个脚本就会自动运行了各位。我们这个时候看解压就完成了。没错吧,好。这就是第一个解压缩,就第一种循环,各位这个还是挺烦的,为啥我说因为这种循环它要做的事情是,第一我要统计整个行的行数。
18:06
我要统计整个行的行数,有多少个行?我再需要循环多少次,这是第一件事对吧?第二件事,我每次循环的时候要按照它的行号把这个数据提取出来,附在变量比例当中,然后才能循环。这种循环,这就是我们常规日常脚本,我们其他的程序语言脚本都是这样写的,哎,当然我说这要是如果没有aw k的做支撑,你要提取行数据就更麻烦了,你就得自己真的自己来写算法,那就更繁琐。好,这是第一种脚本想法,那我们来看第二种,哎,也就是说我们来看我们用什么for循环。嗯。我们用第一种这种格式来写。哎,第二种就是我们常见的这种格式是这样,那我用第一种格式,那我们看一下,首先我一眼就能看到我的脚本变得极其简单了。
19:02
对吧,为什么呀,原因很简单,看着。我只要把压缩包放在这个日志,当然也可以把TJZ是不是也放进去,TJZ是不是也可以追加进去啊可以,然后呢。我们这种循环for是啥for?哎,对吧。后面有几个数,是不是循环几次。对不对,它其实不论是竖啊,不论是竖,它只要是值用空空格隔开,它就会循环,你有几个值它就会循环几次,那我们原先讲的是不是负1234,有四个数,是不是循环四四,每次把这个值是不是就附在变量里好了,那我现在问你。我这个日志里面保存的是什么?我都让你们看了,日志里是不是六个压缩包的文件名,每个文件名是不是写了一行,123456,六个文件名是不是每个写了一行?对吧,那我现在问你按照这种格式来写for I印的方式后面是不是有几个值,它是不循环几次,我这个文件里面是不是六个值,它是不是就循环六次。
20:11
每次循环呢,把第一个第一次循环把第一个值附在变量压里,那do里是不是直接就是压缩报米。第二次循环呢,直接第二个里面第二个文件名是不是就放在Dollar里看明白了吗。这种循环啊,为什么我说它更适合十二运行啊,更适合这种这个这个运维工作原因就是看。我们本来如果要按上面这种来写,我就很麻烦了,我先要统计文件的个数,然后我还要把每一个,每次循环的时候,把每一行的数据数提取出来,附在变量里,我是不是参呢?才能是不是来解压缩,而这种循环它就会自动帮你来做了,看放I应后面的值有几个值循环几次,这个文件里有几个数据,哎,它不光是用空格隔开,就换行符隔开也一样啊,就有一行数据,有三行,有四行,有五行,它就循环五次,有六行循环六次,每次循环把值直接负载变量案例我问你刚刚问题需要我们写统计,通过aw k才能提取数据,在这里是不是一个for循环就直接解决了。
21:18
那刀艾里是保存的,是不是就直接就是它的压缩包内容?看明白了,所以我们说这个要简单的多,其实说实话。超哥一开始在接触for循环的时候,看到这个循环也很纳闷,我操这个太二了,循环100次,我们是不是要写100个值?那是由于你是站在其他语言的角度。我们事儿可能很少去做数学运算,如果真要是做数学运算,用这种东西来做就很很困难,学坏1000字这事儿你几乎就没法完成了,对吧?那我们这个呢,你们可以看到它其实的作用主要是干这样的,哎,把我需要循环的个数的文内容直接保存在日志文件里,保存在文件里读取出来有多少个值循环检次,每次循环变量附进去,这种是更适合做运维脚本的,好了,那我们写一下,哎,我为了看到效果,我把之前这个压缩包干嘛。
22:14
都得删掉,要不然我哪知道是哪个压缩压出来的,对吧,那我把它删掉,然后PP。P pap买circle啊,蛮文力,好,那我把这个日志也删一下,要不然啊,其实我就说这样,我把这个脚本改一下,前面写的这个脚本干嘛,我在里面加一行,当我所有的程序执行完,把这个临时日志干嘛给干掉就完了。哎,这样的话是不是就不会每回都有这样一个指示,对吧,这是,那我来写第二个踏脚本,踏哎,DS。这个简单点我就直接手工写了对吧,那我们先进去CD到root下的SH下的卡下对吧,先进来,然后呢,LS把所有的点t.JZ的内容附在差点log当这当中。
23:11
这个日志当中,然后有可能还会有点7JZ的,把它也追加进去,把报错信息给扔掉不看了。当然如果你还有,比如说还有这个点t.bc two的,你是不是也可以追加进去,对吧,这样的话,你的脚本是不是就可以解压任何内容了,对吧?哎,常见的压缩格式是不是就可以都可以解压了。好,那我现在这个日志里边是不是就是我的压缩包了,这里边是不是就是我的所有的压缩包文件名了,对吧。I in,然后到入了单小括号,调用系统并列读取里面的内容,直接就可以读文件的内容,文件内容有多少行数据循环多少次,每次循环把内容赋予变量多大,然后呢,它杠ZXVF对吧?啊啊对,如果真要是有这种格式放进去。
24:09
你还得判断一下,你解压的时候,你的压缩包名是点点GZ结尾还是点塔点BG two,如果是点塔点GZ,结尾是不是ZX,如果是点塔点BG two的话,就要用这个GXZF了,没错吧?诶这样的话,你的脚本是不是就应该你应该我就写到这儿了,那我这样我就不要这一行了。哎,前两种啊,点点JZ和点点这个点TJZ格式解压都是这样啊,解压选项没问题,那么那我这样的说,那你是不是就应该要增加这个功能了,我上课我就写到这儿了,你是不是应该加一下循环的时候要判断这个变量的率值,它应该是这哪哪种结尾,不同的结尾是不是加个if就行了,如果是不同的结尾是不是用不同的解压速选项,哎,你来增加功能我再说。学脚本的时候就是单抄,可能不一定不用,你要干嘛,学会增加功能,慢慢慢慢加加加加你就会写了啊好了。
25:05
那我这里里面是不是就是到来,到来的值是不是就是我们的刚好就是里面的这个这个文件名行,那我就写到这儿啊,你们在里面去加它的功能好吧,那接下来把这个日志人事日志给删掉。哎,要不然每次都有一个日志。对吧,这个日志用完,脚本用完,它就没有没有作用了,好了ZXVF没错啊好保存,那我们赋予执行权限,它二点SH点高,它2.sh,好开始。好,那各位,这就是我们两种语法来写的不同的解压缩的这种脚本,那我们能明显的感觉到。第一种语法,我们感觉更笨的这种语法其实反而更方便看懂了,所以我就说各位,这个东西我们说反而更适合于维,OK好,那这就是我们的这个例子啊,让批量解压缩的例子我都讲过了,书上我可能就写了一种,那我们讲课的话,我们就对比一下,让大家感受一下他到底为什么我说这种反而更简单,OK好,各位,那这节课的内容就是这样,我们下节课再见。
我来说两句