00:00
那刚才我们学习了12编程的变量系统啊,通过这个定义变量,未来呢,我们就可以反复的使用这些变量,非常方便。啊,这个变量的引用呢,有的时候我们加双引号,或者不抓双引号,差别不是特别大,但是确实也是有区别的,你像咱们刚才曾经给大家用过这种写法啊,这个写法你看这是我们把变量放在了多行,就是这个值放在了多行里面。所以如果我们不加双引号,你看它是放在一行里,如果加双引号显示它就放在四行里,所以这个有的时候加不加双引号是有区别的。好。另外我们这儿还有一个非常好用的功能,就是变量的追加值。所以变量的追加值呢,就是说我在原有变量的后面追加新内容,而不是把这个变量这个删了,然后在原来的基础上追加,大家看你看我这个title等于CTO,然后title头加等,这个注意是追加,加等什么呢?啊,那这个写的就是在原来的CP的后面再加了一个东西,负倍抬头。
01:25
啊,所以这个还有意思啊。那我们来执行一下,看看效果。啊,所以我们现在用的变量都是临时性的,也就是说当你退出终端重新登录之后,那么刚才咱们定义的这些变量通通都没了啊,你看我们现在用fair。一个都没了啊,我们刚才定义的什么title之类的也都没了。好,那现在我们用title等于CTO,然后呢,我们想在title的后面追加新内容,那我们就这样写。
02:10
它的作用就相当于title,等于title再加上新内容。相当于这样的一个效果。明白了吧,哎,就是原来的基础上又加了新内容,那加了以后呢,我们来看一下,看看它是不是能实现这个功能。啊。当然了,我也可以用比较传统的写法啊,传统的写法呢,就是title。等于the Dollar title。那比方说我再加个冒号,这个是比方说二十三十。
03:04
好,那我就再加一个这个东西,那再看它的值。所以大家明白意思了吧,这个加等和这个写法实际上是等价的,当然显而易见,这种写法是不是更加是不是。更加有专业的感觉。就是变量的最佳。好,动态命令咱们说过了,Set也说过了。那这是查看多个变量删除,也可以用命令删除,Onet命令可以删除多个变量,也可以支持这都可以。那C负二呢,这个是我们刚才执行过的脚本了。最终,这就是执行的效果。好。
04:01
现在我们学会了编写脚本之后,我们就可以做一些有价值的。那比方说我们编一个备份脚本,这个脚本作用就是将来我们每天要跑一下这个脚本。作用就是备份我们的目录。每天将ETC这个目录备份到咱们某个指定的目录去,比方说我们要备份到大卡这个目录下。备份下来以后呢,我们因为每天都要备份,所以我们为了避免备份下来的数据大家都被覆盖,所以这个地方备份下来的最终的结果中呢,是带日期的年月日。所以我们现在用这个命令。来这个脚本,来把ETC目录备份到这里面,那怎么写呢?那这个很简单,那我们可以这么来写,来贝这写一个备份脚本叫发卡2SH,当然这个备份脚本呢,一般来讲,我们写的时候光写释放机制之外,一般我们还是建议大家加一些注释的,这个注释是井号开头。
05:22
比方说作者是谁啊,这个脚本谁写的呀,作者是吧,啥时候写的呀,日期这样的话多年以后。看到哎呀这个脚本是你写的,哎呀,当时还是小菜鸟写的,真的不咋样是吧?哎,写的不咋样,哎,现在翻过头来一看,哎呀当时也是从这么low的水平慢慢成为大牛了。啊,当然也可能,你去到单位以后一看哟,单位有一个老司机写的脚本怎么这么差呀,工作了这么多年还写那么惨,还不如你写的。
06:10
啊,当然这个地方还可以写上描述description description呢就表示的是这个脚本到底是干嘛用的,比方说我们就是测试目的。啊,基于测试目的,然后这个脚本的名字也可以写在这脚本的名字。因为万一这个脚本可能被别人复制粘贴了,所以我们把文件名也写在这,这个脚本名是做备份的,所以我们就叫up。啊,这些呢,都可以考虑加上。这样的话,未来你拿到这个脚本,你知道啊,这个脚本是干嘛用的是吧?诶他到底什么时候写的,哎,甚至有的时候我们还加一些什么版本,因为这个脚本随着业务的发展可能会变,诶原来是1.0,现在是2.03.0,你不断的去把它升级上来的。
07:09
那比如说1.0。啊好,那备份怎么备份呢?现在我们要把ETC这个文件夹的内容备份到backup这个目录下,起个名叫ETC,但是后面要跟年月日。大家想想这个怎么写啊,咋写啊。那我们是不是可以考虑有些东西可以通用啊,比方说哎,我喜欢这个颜色。啊,这个颜色我们是不是可以把它加上,我刚那个颜色加哪去了。在里面吗?啊这诶,我可以把这两个颜色加上,以后可以反复用啊。
08:06
是吧,把这颜色加上以后呢,干嘛呢,就是我可以演示颜色哈。哎,显示颜色干嘛呢,开始备份叫starting备份加。是吧,开始变。嗯。当然,这个结果我们把它再结束一下,And。那中间底下就是备份,但是这个命令呢,如果你直接执行后面马上备份的话,有可能看不到这个执行结果,所以我故意的停顿个哎两秒钟再执行,这样的话你就能看到这个备份一个提示了。就看起来比较好看一点,然后备份结束之后,我们是不是应该也要打一句话说结束了,所以我们这是不是backup is finish。
09:09
Finish的对不对,这不就完了吗,中间。那就是你要真正干的活了,实际上我们还没干活是吧,先把姿势摆清楚,花架子先摆上对不对,看起来很好看啊,那当然具体干活的这命令你得写清楚,这才是核心,那这个东西怎么写啊,那所谓的备份目前来讲我们不就是。拷出来吗?对不对,哎拷出来,那拷出来当然我们怎么拷啊,我们可以直接这么考,当然既然是备份,那你是不是应该保留属性啊,那保留属性用什么呢?A。对不对?如果你要想看过程,你加AV吗?这就是我们比较熟悉的组合对不对?
10:08
那。备份这个文件夹到backup,但这个backup这个文件夹有吗?默认可能没有对吧,那没有的话,那我们就不行了,刚开始怎么样。啊,那我们就先建一个吧,建一个,因为这个东西确实不存在啊,不存在,但是话说回来,你建的时候,如果你每次你要说你现在建好,你如果你把这个命令写在这儿的话,这会产生问题,你每次它都不会建,每次都会建,问题是我都有了,第二次肯定有了,就不会再有了,所以目前来讲呢,我们这个不太方便,那我们就先手工建起来吧,手工建起来,然后在这我们去把它去掉。复制到这来,复制这来呢,我们希望给它起个年月日。
11:00
那怎么写啊,是不是我们可以用咱们之前讲过的F,这不就备份下来了吗?对吧?哎,百分号F,当然你如果你要想加上那个。所谓的这个这个十分秒,那你后面可以再补啊,我就不加了啊,我就这样就够了,把它分开就可以了。那这样的话呢,我们就起到了一个简单的一个备份效果啊,就实现了,但这样做的话呢,有一个缺点就是这个备份下来的目录啊,是个固定的。那如果说我们将来备份下的目录不想放在这儿了,那我将来得改代码,所以我们这儿呢,有一个比较推荐的做法呢,就是备份的目录给它单独放一个变量里,那这样的话,我们将来想改这个备份的目标文件夹的话,是不是只需要调一调这个变量就可以了。
12:03
大家明白这意思吧,哎,那包括你这个ETC目录,万一不想备份到这呢,就是不想备份这个ETC呢,对不对,这些是不是也可以来进行,比方说src圆,你是要备份谁对不对?哎,这个是不是通通都可以用变量来实现,那这个将来好处就是改的时候方便。哎,改的时候方便Dollar,然后是src。然后这个呢,恰恰和这个ETC是不是是同名,那同名的话呢,我们呃同名,当然这个地方你要用UTC合适不合适啊。那除非你这么写。这么写,这是src。可以吧,啊,这里面当然要注意斜线的问题,你看这个是ETC,那这就是ETC,注意这个ETC是带斜线的,而这个八套不带斜线,所以凑起来是不就backup其他斜线ETC了,理解了吧,那当然这个时间呢,你实际上你也可以把它预先存到一个变量里啊,你可以把它直接存到一个日期变量里面直接生成啊贝塔加百分号,因为万一你想改格式的话,我们不用改程序本身的代码,只要改改前期的变量就好了。
13:30
哎,这个后期维护比较方便,所以我们在这就可以这么写,叫Dollar贝塔,一切都是拿变量实现,听懂吧,哎,一切都是变量。所以将来我们把这段代码写好以后啊,未来维护的时候,你将来想改文件呀,或者是目标目录啊,是不是光改这就行了,其他代码你就不用管它。就非常方便了啊,这就是一个备份,当然备份完了以后呢,我们通常来讲可以考虑把这个变量删了,那我就不加了啊,就onet可以删好,当然我们这个脚本写完以后有没有语法错误啊,先查一查没有错是吧,没有错,然后呢,我们是不是就可以执行一下了,那我们加上执行权限,然后呢,后面跟上相对路径好。
14:24
开始备份对吧,诶有那么点感觉吧,感觉还不错吧,啊备完了,备完了以后呢,是不是真的备份完了呢?那我们来看一看。呀。怎么回事啊?啊,路径不对。是不是路径不对呀,他怎么备份到backup,我刚才那个那个变量写错了吧,是不是少写了一个啊,对,呃,Src是etcs RC,这有1SRC,但是这有个下划线,哎,有问题了,下划线这一个画括号,要不他搞不清,所以呢,你可以养成习惯,你管它啥呢,你都加划括号,不避免出现这种问题对不对,你不加括括号的话,那它是不是就是下划线和贝塔给混在一起了,他认为是src下划线是一个变量了,是不是这就是逻辑上的错误了。
15:22
逻辑上的错误啊,所以再走一遍。诶,大家看这回就有点儿感觉了,ETC,那再看看是不是成功了啊。懂了吧?看到吧,这不就有一效果了吗?啊,当然这里面有没有数据啊,ETC是有的,是不是这样咱们就搞定了。那这个脚本就是一个备份脚本啊,那这个备份脚本可以给你们写在这儿,我这以前好像写过一个吧。
16:08
之前写过一个备份脚本没啊,刚才好像写过一个脚本,不过那个脚本是。这有一个备份脚本,不过这个脚本里面没有用到变,变量应该是。应该是没有用到变量。这个备份脚本,你看这个脚本里面就没有用到备份变量,现在咱们有了变量就可以更加完,相对来讲呢,做的比较完善一些了,那么把这个脚本写在这。这实际上就是练习题的答案了,相当于是吧,但是这个答案不是标准答案啊,我们脚本没有标准答案。每个人写的都不一样。
17:02
写出来的才是好的,自己写出来的才是好的啊,自己写。好,这是备份脚本。这道题算是基本上就完成了是吧?好了,接下来咱们来看看另外一种变量,我们刚才用的变量呢,这叫普通变量,这个普通变量有一个特点呢,就是。它只能在当前的线环境中,当前进程环境中有效啊,那当然这个地方有一个概念叫当前进程,另外还有下级子进程。上级附进程,这个我们每个程序运行系统中都会。表现为一个程序进程,这个程序进程,我们可以通过这个命令来观察他们的进程的父子关系,这个父子关系呢,用这个命令咱们可以看到。
18:07
左边就是最上级进程,它生成的若干子进程,每个进程都有上级进程,当然这个是最根上的进程,就是组中进程,相当于。那么每个进程下面还有子进程。那这个子进程,我们现在目前运行的这个PT就在这它的上级进程这个,那么我们每运行一个程序,实际上都是在当前share的下面的紫禁城。那么当前这个share就是我现在所在的share,那我怎么知道我现在所在的share是谁呢?我们有一个变量可以看,叫但是这个但是PID。诶,大家看26062是不是就这个,这就是我现在目前的线进程,那么你执行的任何一个命令都是在这个线的下面,它会生成一个子进程。
19:06
那怎么知道呢?我们可以用sleep sleep不是休眠吗?那我们休眠一段时间,那我们在这个新的终端里面来验证一下,看看他是不是开了一个紫禁程。是不是开了紫禁城,看出来了吧,哎,当然那有没有说不开紫禁城,直接和他这个这个。那事实上我们还可以用另一种方法。就是我执行一个新的进程,而不是做你的子进程,而干嘛呢,取而代之。啥叫取而代之呢?就是我不作为你的紫禁城了。你原来的位置让给我,26062,这个进程编号我要了,但是你的办没了。
20:02
那我就用我的进程替代你,我继承你的进程编号。皇位章留给你了,知道吧,哎,篡权了。那怎么实现呢?方法就是一,这个命令可以做到。那在执行这个命令前,咱们先再来看一下当前是不是有个26062,那我现在就在20062里面,这回我们前面加了个EACEAC的意思是说比把当前的这个进程。替换成这个进程,进程编号还留着看成不成走看这边啊。盯着。有什么变化?是不是名字变了?编号变了吗?没变,这就是。
21:00
改朝换代,这不是说你的皇位让给你的儿子了,是儿子把你灭了,是不是?他当皇帝了是吧?他不是继承你,是把你灭了,直接给你剃了。啊,当然你儿子肯定亲亲儿子应该不会这么干是吧,那可能就是别的人是不是把你取而代之了啊,这就是他的一个背后逻辑啊,当然了,我现在这个程序呢,如果我听退出。他这个程序到100就退出了,那么这个100如果退出会带来什么结果呢?哎,你看着啊,大家看我在现在竞争片数26169 26169,你看着26169,如果我现在用刚才的。这个直接十秒啊,咱咱们少一点呢,三秒三秒,那么你是开启了一个紫进程,你开启紫禁程以后,那么三秒一到,你自己销毁了吧,销毁就销毁了,但是会影响负进程吗。
22:03
不影响你的生命到期了就结束了呗,到期了只是你退出了,附进程是不是还在,但是如果我们用ec后面跟sleep,比方说咱们稍微长一点十秒,大家会觉得什么?啊,如果是十秒,大家会发现他这是不是已经被替换了,但是他的生命期只有十秒,那么十秒一到,大家看怎么样了,因为share尔,但是share就是登录以后用,所以你这个share没了,那这个程序没了,那是不是也就整个终端就退出了,生命到期了,理解了吧,Ec中功能就是取而代之,你记住这句话就行。啊哎,当然我们一般用不到这种方法,一般用不到这种方啊,一般都是用传统的写法直接写紫禁城,因为你用这种方式,你一结束东庄退出来了是不是啊,不合理理,我还是希望能够继承你的宝贵资产,是不是啊,你取而代之,那就一切都靠自己了。
23:18
是吧,所以这个还是站在这个大树下面清凉比较好一点,对不对啊,那么但是这种share呢,它和一般的这个程序不太一样,但是本身它也是一个,实际上它本身是个外国命名。对吧,哎,BA是不是本身是个外部命令啊,对不对,哎,BA本身是个外部命令,它被集中在BA里面的一些叫叫内部命令啊,那但是这个命令它和别的命令不太一样的,就是它默认就是后台执行。啥叫后台执行呢?就你敲命令A。这这推好像推出来一样,实际上他没退出来,他默默的藏在后面为我们工作,你看现在这是不是又多了一个紫的呀,这是原来的那个对不对,那当然你再开一个,你再看它是不是又开了一个子镜头,你看在这边又拖了一个。
24:18
又多了一个,也就是说它实际上是后台预警啊,后台预警。那么现在大家就知道了,所谓的这是父进程,子进程,子子进程,孙子进程了,是吧?这就是他们的关系,那说到这儿咱们就得说说变量了,那么刚才讲的这些变量,它的有效范围是谁呢?就是在当前share有效。那么你这定义了个变量,比方说我这定义了一个这个这个A啊,这个这个内幕吧,啊马哥定义了,定完以后呢,我在这显示一下内个没问题,但是如果我换一个终端换到这边来,我换到这边终端来,但是我换到这个终端,那我所在的这个呃线就不是同一个线了啊你看我现在所在的线是谁啊,我们大一下叫办是PID对吧,我是26244,不就这个吗?那现在我如果跑到这边来,那我在哪个终端里呢?我们看一下叫但SHPID是在1175 175不是这个吗?是不是,哎,1175是这个最上面这个175,那你现在我们刚才定义的变量是在这个26244定义的,现在问题是你非要在1175里面去查这个变量,它查不到是不是就是每一个变量它有一个生命空间啊,你的这个。
25:46
变量是在这里面有效的,你在别的线中是看不到的。是吧,啊,所以这就是他有各自的一个空间的有效范围。有效范围好,当然那现在我们现在明白了这个道理,那明白这个道理以后呢,请问这个2610201101里面定义的变量,或者是在这定义的变量在它里面有没有小。
26:13
啊,当然我们现在退出来,我一退出来,现在所在的环变量呢,所在这个线就少了一个啊,因为我一退出来就少了一个那个,呃,少了一个最下面的26244了啊这个烧啊,但是PID啊,这个是2226225225不就这个吗?啊那那在这边看一下。那现在是不是就少了一个,少了一个,那刚才那个变量你觉得还有吗。没了啥意思,我们刚才是在26244里面定义了一个变量,结果现在回到了2625,就是它的上级进程发现变量没了,那说明说明子进程定义的变量负进程不能使用,对不对啊,那么当然如果再推出来,再推出来是不是连这个变量这个线也推出来了,就回到了这了,是吧?那我们现在看一下这个所在的大。
27:23
26201,那现在我在最上面那个办了,哎,那这个里面我如果也定一个变量啊,我们先看一下内幕是没有内容的,那我现在定一个变量啊,第一个变量叫猪八戒是吧。我也头回知道猪八戒。以前不知道猪八戒这个地儿啊,我知道,我知道创新工厂。啊。猪八戒有了走有猪八戒了,那有了猪八戒,那现在我们开一个新的事,是不是这个大家都知道,是不是可以开启一个紫禁城啊,开启了个紫禁城,开启紫禁城以后呢,我们看一下那这个紫禁城它的禁城是不是有BAPID,你看它是2226271 26271应该是26201的下期下级子进程,那我们用可以来确认一下,大家看26271是不是在这啊,26201好,那现在我们刚才曾经在20201上定义了一个猪八戒,现在你开了个紫禁城以后,那请问猪八戒能看见不啊,能不能看见,那我能不能看见呢?我现在在子进程里面对不对,我能不能看到负进程定义的变量呢?
28:53
你说父亲的东西,儿子能不能看到啊?没看到,哎,默认呢,虽然理论上我们说父亲的东西可以给子女传,但是你也得人家得想传呀,有些东西可以传,也不能说随便一个东西都能传给你吧,比方说人家找了好几个老婆都传给你吧,没法传啊啊,所以要想传,你得明确的说清楚哪些要传对吧,那哪些要传,那要想传就不能用普通变量了,那我们就得用一种变量叫。
29:30
环境变量,我们现在用的变量传不下去,不能作为传家宝一直往下传,要想传下去就得用环境变量。环境变量需要特殊声明环境变量用以下这些方法可以来声明环境变量,大家看,无非就是前面加关键字就行,这两个写法都可以,都可以,两种写法都行。当然大家可能更喜欢一个port,一个单词就完了,哎,好记,那么1PORT加上以后,它就成了环境变量了啊,所以我们现在看一下当前的这个内幕,这个猪八戒刚才不是继承不下去嘛,那我们现在呢,已经有这个变量了,那我们那像它把它变成黄境变量,怎么变呢?非常简单,只需要加个单词一块的就行了。
30:18
当然,如果这个变量从来没有用过,那你可以在这连变量的声明和赋值一块做了,你也可以分成两步,先赋值后声明,我现在就是先赋职后声明。啊,就是把它先赋完值,有这不些猪八戒不是已经有了吗?那我就不用再赋值了,那我就直接把它变成一个环境变量就好了,所以我就加1PORT,就是声明,这时候它就成了环境变量了,一旦定义成环境变量,我怎么知道系统中有哪些环境变量呢?注意set命令看到的是所有变量,我们现在只看环境变量,怎么看呢?加一块的就可以看了,这就是所有的环境变量,大家看它显示的是都带1.s啊,那这个看到的就是环境变量,那其中有没有我们刚才设置的这个内幕呢?哪呢这呢猪八戒是吧,这是个环境变量,一旦定义成环境变量,就相当于这个财产可以继承下去啊啊,那现在我们来试试吧,那现在我们还是用啊这个啊,看一下当前确定一下我们当前的share类型啊,这个sharell的进程编号是26201,也就是PS trade的目前所在的这个地方,20201,好,那我开一个紫禁城,但是不是开了个紫禁城啊,开一个紫禁城以后呢。
31:31
那我们看一下它的这个是26296 26296呢,显而易见应该就是26201的紫禁城,那我们来确认是不是26201的紫禁城,没错吧?好,那现在我们去显示一下内有没有值呢?有值了,是不是从上面继承下来了,哎,继承下来了,那当然现在又有个问题了,那如果我又开了个子继承呢。出现了个孙子进城,那这个孙子进城,猪八戒还能继承下来吗?
32:07
你看我们这边有了一个26315 26315,它是不是26269296的紫禁城,对不对,那这个他有没有猪八戒呢?有成了专家宝了,传家宝了,是不是一旦真成变成环境变化,他一直可以代代相传,哎,一直到永远,当然这中间也有个问题了,如果有一个儿子继承了猪八戒以后,发觉猪八戒不好听,我们想变成孙悟空,孙孙悟空,孙悟空啊孙悟空孙悟空是吧,把它给改了,但是改了以后,请问我现在看到的值是多少?孙悟空是吧?那现在又开了个紫禁城。
33:02
那中间有人串改了人家家谱了,把这个家谱给改了,家谱改了,那现在请问他下面的紫禁城。他下面的紫禁城会用哪个啊?他下面的紫禁城现在是26315,那我现在再开一个紫禁城,又开了个紫禁城以后,那么请问这个新的紫禁城他用到的是哪个?猪八戒还是孙悟空,那那你说你中间都改了,那它底下也就都改了是不是?那比方说你这个,你这个传家宝,这个传家传到第第十代的时候,发现这个东西不值钱,还不如第十代人家挣的钱呢,人家换了是不是?当然了,现在呢,我们的进程数关系是这样的,那如果我们退出来,退出来,退出来,我退了两次,退了两次已经退到这了。
34:12
那现在退了两次以后,那请问我现在把猪八戒就是刚才那个孙悟空那个继承也退出来了,现在我回到了我们目前的上级的线。269296,那现在请问他的这个变量的值是猪八戒还是孙悟空猪八戒?猪八戒啊,那大家现在知道结论了吗?那结论怎么做总结呀?量就是一旦子进程修改了,从父极真器的电量将把新改过的值传递给他的孙子以后的进程,对吧?啊,当然紫禁城会继承父进程的这个环境变量,但是是没有办法让父进城来使用子进程的变量的,就是你子进改了,也只能改你子己和下集的子,子进程你不能影响父进程是吧?父进程是你的负辈,你影响不了,只能负辈影响子进程是不是哎。
35:22
那环境变量说实在的,我们理解即可,为什么用的不多?我们环境变量一般编脚本很少用,都是在配置文件里用,配置文件里面会用,你像我们现在有一些环变量,就是环境变量应用EV也可以看环境变量啊,我们刚才用的是export,实际上你也可以用EV。因为还有一个叫print e,不过这个命令呢,基本上也不太用了,它都可以看环境变量,这都是环境变量,这些环境变量。
36:01
它是影响你的所有的进子进程,子子进程,因为他们都是环境变量,它会继承下来。哎,好了,这就是我们刚才给大家说的变量的这个功能环境变量。那这里面在编写脚本的时候呢,大家要注意一些细节,我们编写脚本,你像LS我们都知道LL是个别名是吧,那我们编写脚本的时候,在脚本里面我可以不可以调用这样的一个别名啊。来来。注意在脚本里不要用别名不支持啊啊,所以脚本里面执行命令和你平常在share中你直接执行命令并不是完全一样的。
37:03
变量。我们一般都用普通变量,而我们在交互执行这个环境中可能会用到环境变量啊,而我们边角本一般都是用普通变量。啊,在边角本也不用。别名脚本里面不用别名啊,所以脚本里面执行命令那就很危险了,我们传统的RM命令,他在删文件的时候是他可以问你的。他会问你删不删,但是你一旦写到脚本里面,他问你吗?因为他不是别名了,已经不是别名,那你直接一执行,他就真的删了。啊,所以呢,大家用的时候千万要小心啊,那这个真的执行了,你看马上这个A点下的给你干掉,看到没,所以可见脚本里面你执行的危险性。
38:12
所以反过头来再来说一个问题啊,以前有同学说,哎,那我去处理一个文件夹,我这写个文件夹,比方说data下的这个test there。啊,我想把它删了,那我们就这样写。There。是吧,这个是不是很容易理解啊,就把这个文章里面内容,比方说清空可以吧,清空结果呢,写的时候可能做了一些这个处理。啊,它这里面写到后面的时候,可能逻辑上就产生了一些问题,比方说他把这两个命令给放在了两个语句块里面,它两个不在一起,也就是说我们现在真正执行的时候,这个带这个变量,它没有值也空了啊你可以想象成就相当于这样想象成我们中间执行的时候不小心把它给删了。
39:12
如果是这样做啥意思?你是不是就自己自己写了一个山根的脚本?大家看一看,我之前前两天是不是给大家发了一个照片。是咱们班发了个照片吧。不是咱们班吗?发了一个图片是四十四十。三三十九期的,39期的一个表格是吧,他自己写了一个生产中的脚本,就是犯了这个错误,写了一个脚本,然后一执行发现他把某个文件夹给移走了,他都没删,那就是因为这个它这个变量是空的,它把整个根下的所有数据移到别的墓位去了,幸亏是移动,还不是山。
40:18
是不是看了吧,那个图片实际上就是因为这个事,他这个写命令的时候逻辑上产生错误,既然没有用到这个de尔,他以为这个de尔有值,结果戴尔实际上是中间处理一下没有用到,所以呢,这个de相当于空空的话呢,就直接执行百约。下了。所以这个东西挺危险啊,很危险。所以这个东西啊,千万大家记住了,删东西你一定要确保。这个文件夹是有内容的,一定是有便利,有值的,没值的话你直接删掉就惨了。
41:02
还是那句话啊,在生产中禁用RM,你把它定义成MMV,还有还有有的救是不是?哎,你MV那还行,大不了移回来就行了,那你RM那就真哭去吧,所以希望你们记住这个我今天说的话。记住,以后在工作中禁用R啊,记不住就算了,等你们删除的时候会想起王老师当年给大家说过的话。啊,这是刚才给大家讲的这样的一些需要大家注意的地方,这些呢都是系统中内置的环境变量,这个环境变量包括pass呀,Share啊,这都是。
42:03
这个是什么意思呢?这个是表示嵌套深度,就是我们现在盖呢,它是有一个深的层,几层的啊,你看我们现在的干是在第几层啊,我们在第二层,那前面还有一层的,所以我们这时候呢,你就可以用level。那这个表示我们现在是在第一层,那如果退出来,要我本身已经退出来了。那我刚才是在哪呢?我刚才在这个位置是吧?啊在这我说的怎么是显示是一,那现在是实际上是第一层啊,那现在如果我们在这边了。这看一下这个应该就是两二层啊,因为它现在是在哪个地方呢?它是在这在这第二层,那如果你再开一个线,你再执行一次,它就是第三层,同样的你再做第四层,你退出来是不是就少一层,没退一层少一层这是已经是最后一层了。
43:16
但是你再退,那是不是就整个终端就退出来了吧,嵌套深度。好,然后呢,我们现在这儿还有一个下划线,这个下划线呢,比较特殊啊,它表示的是前一个变量的最后一个参数啊,什么意思呢?比方说我们这执行一个这样的文件。命令,那这个前用命令不就是它吗?那后最后一参数不就是安大吗?所以我们现在可以看一下下划线,你看。那如果我们执行这个命令。
44:01
那前一个命令的最后参数不就是杠A吗?所以你看是不是杠A啊。理解了吧,它存在就是这东西。好。在我们使用变量的时候,还有一种变量呢,叫只读变量,那只读变量,只读变量那无非就是。变量,它的内容不能改,也就是我们所谓的常量。那变量不能改,那什么时候会用到变量不能改的常量呢?那一般来讲,那什么变量我们希望存进去,不要不想改,这个比较常见的用法呢,就是一些。固定的值,比方说派3.1415926。是不是这东西是不是不会改啊,嗯,但是你如果你光这么写,是不是用户有可能就不小心把它改了。
45:06
是吧,那怎么办呢?我把它变成只读,变成只读呢,就是对单位那加上这个关键字,它就只读了,当然你也可以分成两行写,先赋值,再把它变成这读变量,这也可以分成两行写。啊,但是可以不可以,可不可以先声明环境变量再赋值呢?这样行不行啊?那你看你这样做他会报错,为什么呢?就是因为你已经声明为环境变量了,再想改也改不了了啊。已经变成指度变量了,已经改不了了,所以呢,它一定是声明之前一定要先负的值。
46:00
啊,那比方说我们就在这来定义吧,派等于3.1415926,然后我们现在想改它,你看能不能改啊,派比说现在改成3.1415926啊,你看它能改吗?现在能改,然后我们现在把它read以后PI。然后你再想改它,比方说我们改成九三,不让改了,这就只读了理解了吧,但是能不能不能改,能不能删了他呀。把它干掉,不要了,这个变量给他删了行不行。不可以变量删不了,那删不了,那是不是它永远存在内存里了。不用担心,退出来自然就没了,等你的程序结束了,它也就结束了,如果你写在脚本里,那脚本结束了,它也就没了,明白吗?所以不用担心。
47:12
啊,这个内存的占用必须要。达到不使用要释放不释放内存就空间慢慢会满的。满了,你的程序肯定会崩溃的。所以。不用的变量要清理。只读变量,咱们系统中确实有一些是内置的只读变量,我们可以用read only。看到所有的只读变量。大家看到有一个东西就是只读变量啥呀,UID,你想UID这个东西如果不是只读变量,那我是不是随时可以改它。随时改意味着什么意思?意味着是不是随时变身份呢?我改成1000,那我的ID不就变成1000了吗?
48:04
啊,那ID变成1000就不成普通用户了,那ID这个东西不能改,只读的,一旦登录进来就不能调了啊好,只读变量了解用的不多了。那接下来还有更为重要的叫位置变量,位置变量才是我们大家重点要掌握的。那位置变量,位置变量它表示的就是什么呢?就是表示脚本执行的时候,它参数的位置。我们目前来讲写的脚本啊,它的功能是固定的功能。不是特别灵活。啊,比方说那我想实现一个这样的功能,就是在进行。文件的。
49:01
删除的时候。我想让他支持这个功能,就是我后面跟一个脚本,后面让他跟东西。大家都知道,我们每个命令后面是不是好多都可以支持参数,那既然可以支持参数,我们说了,那我们编的脚本是不是也可以考虑支持参数?比方说我写一个脚本,这个脚本我们可以这么干。后面跟上安装,那我就表示要装东西,那如果后面跟的不是in,跟的是陌,就表示要删东西,对吧,这个我们想实现的功能。那这个东西我们要让它支持后面跟的这个字符串,那在脚本里面怎么表示后面跟的这些一个一个的参数呢?那很简单,那就是有系统自身带有的若干变量,分别来表示你的参数是第几个。
50:06
在咱们的脚本里面内置了几个参数变量,它是固定的,到一代表着第一个参数,到二代表着第二个参数,Do塔三、德塔四、德塔五都是一样的,分别代表着后面的参数,所以我们可以这么写。啊,算了,每次这么不方便,我把我以前VM那个找回来吧。那这样的话我们不就省事了吗?对吧?哎,那你看我现在test as啊,你看这上面都是自动生成,这不方便吗。而且也整齐是不是?好,然后接着我们就想实现这功能,怎么实现呢?我们就打印一下,说第一个参数是第一个参数啥呀,标得塔一呀,对不对,那第二个参数是啥呀,得二呗,那同样的第三个参数不就得三吗。
51:15
对吧,230,那当然,那现在明白了这个道理,那第十个参数怎么表示啊。你是不是到了十啊?那所有参数呢,所有参数也有一个叫到井或者Dollar Dollar星或者Dollar at符号都可以,它这有一个Dollar at符号。这两个都表示所有参数,然后还可以表示参数的个数。个数,那个数是几个呢?到了几几个参数?
52:09
另外还有一个呢,就是程序的名字,脚本名,它也有表示方法,零零表示程序本身。好,那现在我们可以来跑一下了。当然,如果我们什么也不加,那上面一个参数都没有,一回车大家看他说,哎,我这怎么写了个19啊,好,大家看现在。第一个参数,第二个参数A,第十个参数是零,哎,这个零怎么来的?所有参数个数零,然后这个脚本路径也没问题,可以,但是呢,那我们加上参数吧,比方说A1C是不是加了三参数,那现在DEF得了,我这样太麻烦,我们可以用,这是不是代表26个参数对吧?都看出来了。
53:14
ABC出来了,哎,这么第十个参数按理来讲应该不是A0啊。那么第十个参数,你数数应该知道是不是应该是勾啊,那它怎么是A0啊?哎,这个好奇怪呀,那这个A0是怎么来的呢?当然后面这些应该是没问题的26个参数对吧?那这个A0是咋来的呢?哦,大家看是不是这个颜色有点不对头啊,那也就是说它根本没有把它当成DOLLAR10,而当成了DOLLAR1加零,DOLLAR1不就是A吗?那所以就最终A0了,所以我们要把一零作为一个整体画括号。
54:05
所以那现在大家应该知道十以上是不是都会有这个问题,所以十以上11 12 13是不是都有这个问题,所以十以上包括十在内都要加括括号啊,当然一般来讲用不了这么多啊,就用的不多啊,但是至少要知道这样就行了,那有了这个参数以后,那将来我们用这种方式是不是就可以实现更为灵活的功能。比方说。那我们想实现这个文件的备份。那这个备份的话呢,我们想把这个文件夹备份到哪去,我们是不是也都可以这么干了,就是我们写一个备份脚本,刚才我们写过一个备份脚本,这个备份脚本这都是固定死的。那现在我们是不是就可以把它哎写的灵活一点,到一备份到哪去,甚至你都可以这么写到二。
55:08
是不是这啥意思,就是备份的原和备份的目标,你可以自己临时收啊,临时改啊。是不是,那我们现在这样写,大家看我们将来就可以这么写了,备份的目文件夹,我备份哪个文件夹不会备这个了,比方说我备份这个。备份哪去呢?我也不需要原来的文件夹了,我叫什么呢?叫up sh,呃,备备份到data下吧,换一个文件夹是不是可以备份的路径都可以变了。走看有没有备份,看成没成。是不是更加灵活了?是吧,那你这个参数也可以改改了呀,随时可以改呀,啊那现在咱们是不是可以定一个什么删除的别名了,那在之前呢,我们讲过这个删除啊,那删除的话呢,我们是不是可以定一个删除R命令的别名,那大家看这是我写的啊,怎么写的,这是定了一个颜色,报警颜色,这结束颜色,然后这个呢,是将来我删的话,不是把它删了,是把它放在这个目录里了,然后先把这个文件先建起来,建起来以后呢,你删的时候后面不是要跟文件吗?那我就把这个到吸成表示你要删的东西,然后MV是把它移到这里面,实际上不是把它删了,是把它移走而已。
56:45
所以大家看这段脚本是不是就可以起到了安全删除的功能?好,我们这样写,这样写完以后,然后我们把它定义成,好,我们把它定义成一个别名。
57:20
这样的话我们再删文件,实际上它删的实行的是一个脚本,然后我们现在就可以来尝试安全删除文件了啊,比方说我们看看能不能删,比方说我们把这个这个文件夹给它删了吧。那删的话呢,以前我们删,那就直接写上它就好了,现在由于它是别名,实际上他不会删了,而是把它移走了。看告诉我们了,实际上移到这个目录下,你去这找就行了,万一删错了没关系,他没给你删,放心找回来就行。理解了吗?啊,这起到了安全删除的功能啊,比方说我们这有俩文件,你也可以用它在删a.test b.test看看他把这俩文件都给你移到这去了。
58:18
看了吗?是不是实现了安全删除啊,这样的话呢,我们就安全失效了。你看这个命令用到的东西是不是都是我们讲过的。哦。当然这个病例不一定这个很完善啊,你可以把它想象成一个垃圾箱,是不是我们自己做了个垃圾箱去了是吧,自己做了一个,自己编了个垃圾箱。啊,这就实现了这样的功能了。啊,这就是Dollar芯啊,那我们现在用到了这些电量。
59:05
这里面心和A之间是有区别的啊。心。它将把所有的变量、所有的参数认为是一个字符串,而Dollar a的符号是把所有参数认为是各是各的。那一个就是作为一个整体,你看起来还是全都,但是它是作为一个整体了,而Dollar APP呢,那一个参数,每个参数都是独立的。独立的那不一样啊,那这边呢,有一个例子可以来验证这一点啊,怎么验证呢?大家看这段脚本。那我这设置了一个F1脚本,这个F1脚本呢,里面显示F1所有参数到了星,到了艾,这个好像没什么区别,然后呢,我注意我这调用了个fair文件。
60:02
这个fair文件后面加了个do转星。那FAIR2文件加了个到二星,那就意味着那么我们后面在执行费二的时候,它会把FAIR21后面所有的参数作为FAIR2的参参数传给他。然后C2。在命令就是把这个地方换成一个Dollar的符号,它俩实际上区别不是特别大,C2呢,它的内内容就是显示它的第一个参数。啊,那我们来看一下最终执行的话,如果我执行F1,如果要执行F1 f1什么东西,F1不就这一串吗?后面跟上ABC,当你跟ABC的时候,F1对于F1来讲,ABC是不是就属于它的所有参数了,所以这两个到塔形大都是一样的,我们看到ABC显示出来了。那显示出来了,是显示出来了,但是接着我们这儿有一个fair。
61:02
这个fair心到了心肺的内容是什么呢?Fair内容是这个。这内容是这个,它是要显示谁呢?显示传进来参数的第一个。到一嘛,但是我们说过do芯会把所有参数认为是一个参数,所以呢,你这个到一。到了一博和这个也是一样,因为他认为是一个嘛,所以他把ABC就全显示出还是ABC,因为他认为ABC是一个整体了。但是如果你执行F2就不一样了,F2是这个意思,F2前面两行都一样,但这行这个地方就变了,这写的是I的符号,F的符号呢,结果你显示的时候这个是。DOLLAR1,那一的话,这个Dollar f符号它是一个参数,是独立的一个,所以你传了个ABC进来,它认为A是AB,是BC是C,所以你取取到了一是不是就只要A了。
62:03
这就是他最终不一样的地方,当然这个脚本你们可以下来试啊,可以自己练一下就行啊,那另外呢,我们脚本还有一个非常好的功能,就是软链接不同,它实际上功能并不相同。这点什么意思呢?是这样的,我们理论上创建一个SH的软链接。那么最终实现的脚本功能和SH文件。一样不一样,比方说我们创建一个test,我创建一个S1,这个SH的,这是它的软链接,哎软链接,那现在我们把TEST1给它改了啊,Test改了。改了以后呢,我们这显示一个内容,比方说就叫test,那现在我们执行完了以后,这两个功能都去执行,效果一样不一样呢,我去执行它和执行一效果一样不一样。
63:12
因为软连接嘛,是不是软链接,但是实际上可以做到不一样,怎么就不一样了呢?非常简单,我们可以这么玩,怎么做呢?我这不显示它的固定字符串,而显示DOLLAR0。零啥意思?到零表示程序名称,所以这时候大家再来看。结果不一样。这个技巧是不是很有用?虽然你都是同一个文件的软链接,但是我可以让你执行结果不一样,我可以这么玩,我再来一次test,我再炒几个TEST2。
64:07
有了啊,有了,那我就换一个。那这时候大家看我这个T1和T三都是它的软硬机,但是我去执行T1和T3的效果不行。他们都从一个地方来。但是最终结果。这个技巧很有意义的。是不是就将来我们创建不同的软连接,我就可以实现不同的效果?程序是来自于同一个,既然效果不一样。是吧,很有价值。啊,刚才这个超总已经头脑都晕了。晕了是吧?啊,晕了就晕了吧,习惯就好了,那当然我们今天内容确实有点量大,你看我们今天学了什么正则表达式。
65:03
正则表达式本身就是个难点,对吧,今天又学习了脚本编程,所以这两个难点足够大家消化吸收了啊,内容不少,我也很理解你们,但是我刚才说过了,这部内容是个难点,确实重点,但是别害怕,这部分内容我们后面会反复的用,那后面的课程中我们也会经常用,那日积月累时间长了,大家就掌握了,尤其脚本编程啊,我这个提前给大家说一下,脚本编程这一部分一定要自己动手写脚本。什么时候写上一个什么5000行以上的脚本,5000行我说的是5000行,5000啥你累积累计啊,我不是说让你敲A口敲5000遍啊,你把这个我们讲的各种脚本,你写上5000行累积起来,慢慢你就有感觉了,你没有到5000行之前,你你说你没学好这个,你只能说你5000行没到那个数,到那个数了你自然就会了,听了吧,所以你们现在键盘没敲烂前,千万不要说自己学不会,因为你还没有把键盘敲坏,键盘敲坏了你就不会问我这问题了,因为你肯定都不完了,明白了吧?啊,所以大家继续努力啊,今天呢,咱们有没有学习新的命令啊,把那个新的命令总结总结。
66:45
新的命令总结总结今天有学习命令吗?有,有啥有吗?有没有有啥?
67:05
B有吗?没有是吧?C有吗?有啥什么号是吧。还有啥?D有吗?D有一个,不过我们没怎么用,那S可以声明环境变量嘛,实际上它还有个DR是可以声明主动变量,不过这两个我们因为不太用啊,这个跟R呢,就相当于一个port嘛,跟X呢就相当于一个port啊,这个写错了啊,这个是这是。还有吗?这是不是有1F有没有?哎,E1GRA是不是我们今天学的强大的三剑客之1F有没有?H有没有,还有吗?还没了是吧。
68:46
M,有没有?今天实际上命令不多,命令学的不多,不过有一个F,这个是不支持正能表达式,这个是扩展的正能表达啊,MM没了,有没有新的没了哈,PPP有吗?
69:19
那有啊,今天我讲了一个扫描工具吗?对吧?屁有吗。R,有不要。没了啊,S今天主要政治表达式讲了很多,然后后面呢,咱们讲这个脚本编程都是变量赋值啊什么的,这个就没什么了,T应该没什么新命令对吧,不过呢,你看我们才上课上了这是。
70:17
两周吧,第二周也就是第二周,那第二周你看咱们瞬间都学了200个命令了,所以大家进步飞快啊,最起码现在山根这个东西应该掌握的很深刻。我们学会了各种三根方法,那今天学习的重点重点啊,今天是20020年0805重点知识第一正则表达式第二的用法。
71:05
第三脚本格式要求脚本调试方法,调试方法啊,第五脚本的。执行方法,执行方法是我讲了五种方法呢,是吧,还有就是变量的类型,变量类型我们学过有什么普通变量,环境变量,位置变量,只都变量,对吧?重点啊,今天光列重点就练这么多,包括我上课的时候写了那个脚本,你们下来照着抄,抄一遍不要复制粘贴,不要复制粘贴照着抄,不会写抄知道吧,咱们学运维的,学的好就是抄的好,要想学的好就得抄的好,抄的多了你就成了你的了,你就会了,刚开始就抄别人,你小时候写作文不就抄别人,是小时候我写作文。
72:35
分,那当时三年级的时候,那写作文写的很糟糕,甚至有一次考试我都是作文都是空卷,我就交了,因为不会写,有一次就是老师布置了一个初中,就是期中考试,布了一个作文的题目叫园丁,就意思让我们老让我们学生夸老师好的,结果我当时竟然不知道园丁是啥意思,不知道园丁是啥意思,你让我写作文,我都不知道园丁什么意思啊,没听说过呀啊,所以我那个我就空卷交了,当时那个作文分是30分,其他卷面分是70分,100分,我就答了70分,作文不会写,所以老师就后来找我,老师说你的卷子丢了,怎么没有作文啊,我很老实,我说我没写作文,后来痛定思痛,后来我就让父母给我定了好多小作文的那个。
73:35
杂志,哎,就是那个小学作文是吧,小学生作文哎,发给我以后,我每天就看,刚开始就抄,老师布置一篇文章,我就从那里面抄出一个和他相关题材的东西抄,抄到高,抄到这个五年级的时候,我就班里头就成了范文了,每次我写作文,老师就拿我那作文开始念,那老师这个这个王老师把这个王同学是吧,呃,写得好,写得好,实际上都是抄的,但是后来就不是抄了,后来就自己有东西了,这不写,所以你们现在就是抄别人了啊,不要刚开始觉得抄不好,刚开始就是抄。
74:17
好了,今天课上到这儿吧,拜拜。
我来说两句