00:00
我们已经了解了shell编程当中变量的基本概念,而且知道了系统给我们预定义的变量里边,啊,全局的环境变量,局部的环境变量分别是怎么样去查看有哪些,那接下来呢,我们当然就要看一看自己用户个人怎么样去自定义变量。那自定义变量的方式其实非常非常的简单,我们知道如果在一些静态类型的编程语言里边啊,比如说像C,像Java啊,那这些编程语言里边,我们如果想要定义一个变量的话,肯定必须得先指定类型啊,比方说Java里边你到底是定义一个整形的int a等于一。啊,那或者说你要定义一个字符串string。Sa等于。比方说A。必须要用这种方式去定义,先把当前数据的类型指明,而对于我们当前的这样一个shell啊,一个脚本语言而言呢,它其实类型并不是静态的啊,也或者说我们当前的类型系统是非常简单的,我们直接不需要指定类型,上来之后直接给一个变量名,然后加等号。
01:11
后边紧接着给一个变量的值就可以了啊,这里需要注意的是等号前后呢,不能有空格,哎,这是shell编程里面定义变量的一个非常重要的特点,接下来我们就在控制台里边来尝试一下,我们先把前面的内容都清掉,然后接下来我们可以直接定义,比方说我直接定义一个A等于二。然后我接下来可以直接eo一下,看一下有没有这个AA,我们看现在就有一个A变量,它的值是二,非常的简单。那比方说我们想复杂一点的话。我们可以看一下有没有,首先看一下啊,有没有这样一个变变量,比方说就叫做my VAR,我的变量my variable。啊,那当然肯定是没有的啊,但是没有我们也可以直接echo啊,有些编程语言里面我们知道,如果这个变量没有声明过的话,直接是会报错的啊,那现在没有的话就是空嘛,非常简单,所以接下来我要给它赋个值YVR。
02:08
比方说我们可以直接等于就叫哈。接下来echo一下MYVR。那现在就有了,它的值是一个哈,所以我们看根本不关心这个变量是什么类型,只要等号后边给它赋值就可以了啊,那另外你给它赋值了之后呢,还可以再更改,更改的时候跟一开始定义的这个一样啊,比方说我把这个哈变成一个大写的H,然后我们再来艾口,完全没有问题,直接去更改就可以了。这里需要注意的就是我们在进行赋值的时候千万不要,呃,可能有些同学在一些编程语言里边习惯啊,看着舒服一点,在等号两边是要加一个空格的,你一旦要加了空格的话,这里边它就会说未找到命令,哎,为什么呢?前面我们说过啊,你如果直接分开这么写的话,它默认你前面这个是当前shell里面的一个命令,那直接到B或者S病下面去找的话,他根本找不到,当然他就说未找到命令了,如果连起来写,Shell是可以直接把它解析成一个变量赋值的表达式的,所以这样的话,我们就可以直接把它理解出来,解析出来了。
03:16
啊,这是我们当前对于这个变量声明和赋值的一个基本操作,那我们可能会想到,诶,那这个你看到这个过程是直接给他等于一个字符串啊,当前就是一个词,假如说我这是一句话呢。比方说我现在就想把它要赋值叫做hello word,那如果是hello word的话,本身中间比方说就有一个空格,那这个时候又怎么办呢?你直接这么敲肯定是不行,又没有找到命令嘛,哎,Word这明显不是一个命令嘛,所以这个时候我们就需要用引号把它引起来。然后接下来我们再来echo一下,这个就可以看到变成了hello word啊,当然了,你这个如果用。双引号或者用单引号,这个其实是没关系的啊,用哪个都可以,比方说我们再改一下,然后再来做一个eo也是可以去更改的啊,这就是我们使用。
04:09
自定义变量的一个过程啊,可以去给它声明出来,然后去对它赋值进行更改,整体整体来讲这个使用非常非常简单啊,但是我们可能会想到,哎,那定义出来的这样的一个变量,这到底是全局变量还是局部变量呢?哎,那首先我们可以去想一下啊,之前我们不是有env吗?啊,Env我们可以直接grape一下MY,看看有没有这东西,当然是没有的啊,那另外呢,我们之前不是还有set吗?Set里边看一下,诶,Set是真的有的,所以我们当当时说set里边是包含了当前所有的系统预定义的和用户定义的全局变量,局部变量所有的东西都有,哎,所以在这儿找到了有有这个东西,但是这个东西到底是是不是真的是一个局部变量呢?哎,这看起来好像应该是一个局部变量啊。哎,那我们还是要确认一下,因为ENV里边能看到的是系统帮我们定义出来的全局变量。
05:07
那用户定义的显然也不会在EV里面啊,所以接下来我们还是打开一个子shell bash确认一下,好,当前已经进入到了一个子bash里边,然后我们执行这个杠F的时候,很明显是基于子bash,然后呃,创建出来的一个新的进程,所以接下来。那我们再去看一下E一下当前的麦网。我们看到现在没有这个变量了啊,哎,那自然我们就想到了退出去之后,有在子代里边没有,那很明显这就是一个局部变量,那这样一个局部变量,我们有时候我们可能希望你到那个子,但是里边还能获取到这个值啊,我希望把这个值传进去,那怎么办呢?那就需要把它定义成一个全局变量。定义全局变量的方式呢,稍微有一点特殊,它是要求我们就像现在这样,先声明一个局部变量,那就直接定义啊,直接把它赋值,用的就是一个局部变量,然后呢,我们可以把它提升成一个全局变量,怎么样提升呢,要用到一个叫做。
06:13
Export啊,我们知道有导出啊,输出这样一个意思,就是说我们要把当前在负shell里边定义出来的局部变量导出,变成一个全局变量,哎,这样的话就相当于设置了一个全局变量,所以这个xport的时候直接可以加上当前的名称。Myone。先把它做一个当前的这个XEXP导出声明成全局变量啊,我们首先先看一下啊,外边能看到我们当前是在。负L里边,然后接下来敲一个BA进入。子she,诶,我们看到现在的这个原刚才的杠F,我们基于的这个PPID啊,它的附进程是我们外边的初始登陆的bash,现在的杠F,它的附进程是下边我们这个子bash,诶所以这个很明显啊,它的这个继承关系一目了然,所以接下来我们现在在子代里边去看一下。
07:15
我们直接可以。Echo my现在可以看到,Hello word能够访问到,说明我们现在的这个MY就已经成了一个全局变量。这里需要给大家多做一点说明的是,现在既然已经是全局变量了,我在哪都能访问到,诶那是不是我现在在这个子代里边,我对它做一个更改也可以呢?比如说我们把这个改了,我现在不叫hello word了,我叫hello Linux。如果改成这个的话,首先我们在这儿直接去看一下啊子里边改了当然就改了,呃,就变成hello Linux了,这个完全没有问题,现在我要退出。退出子白。确认一下,现在是在外边的负拜式里边,负山里边,哎,那这个在外部,如果再去看这个值的话,我们会发现它还是hello word并没有做更改。
08:08
这就是我们说的啊。我们在外边定义的一个全局变量,它的作用范围是在当前的这个shell shell以及它嵌套的子shell里面都能看得到,但是对他的更改呢,哦,那就只在当前更改的这个范围内有效,退出了之后,诶,那就已经看不到了,当然了就是你如果在这个子shell里边还有子shell的话,你在这个子she里边啊,把把它如果再更改了之后,再把它声明成全局变量,那是可以去在里边生效的啊,但是在外边就没有用了。啊,那那有同学可能会想到你要这么说的话,我是不是在里边啊,我们进入这个Excel里边。现在是子SH,如果说我们把它做的这个更改。还要再做一次export。把它声明成全局变量,是不是就可以在外面看到了呢?诶,我们可以做一个尝试,现在已经把它做了一个声明哈,Linux,然后我们再来看一眼。
09:07
发现还是没变,哎,所以大家一定要注意啊,就是在子shell里边进行更改的,它不会影响到负shell里面的效果。那如果说在父shall里边,我们声明xport啊,把它声明成了全局变量的话,那么子LL里边就都能访问得到了,这就是Linux里边这种父子shall之间的关系啊,对于这个环境变量,局部变量,全局变量的一个相关的影响。那前面我们其实都是非常简单的啊,在在这个当前的shell里边,又使用BA命令去打开了一个子shell,这个看的其实还是有点乱,跳来跳去,我们一直都是通过这个命令啊,看他们的父子继承关系来确定当前到底是在父she还是子shell里面,那我们知道了,你如果要是测试的更加清楚一点的话,我们还是应该用脚本了啊,其实前面说了这么多,关键就是要解释脚本里边,如果说诶,我们做了一些当前的这个全局变量和局部变量的引用和呃使用的话。
10:08
到底他有没有效,能不能拿得到,哎,主要就是想看这个事情,所以接下来呢,我们可以进入到当前的脚本里面去,我们不是有一个hello.sh吗。我们之前是直接echo了一个ho啊,那接下来我们可以直接echo一个Dollar。MY。我们可以直接把它做一个保存,然后接下来我们会想到啊,我以不同的方式先去做一个调用。我直接首先我们用这个S的方式啊,S方式我们知道它本身就是在当前的这个best环境里面执行的嘛,所以这个肯定没有问题,哎,直接这个两个hello word都输出了,那如果说我们直接使用这个相对路径或者绝对路径的方式去执行,能不能看到呢?没有问题,可以看到,因为当前的麦已经是一个。全局变量啊,所以就是你在里边,我们说它使用这种相对路径绝对路径的方式执行脚本的时候,打开了一个子bash,子bash也能访问到啊,所以当然可以输出对应的结果,那现在呢,我们就再增加一个局部变量,我们这里边啊,比方说我们先看有没有这样一个东西啊,我把它叫做new吧,一个新的变量,首先没有好,没有的话我们给它赋个值。
11:22
这个我们叫做hello。Linux。先给他做一个局部变量的声明,然后接下来我们知道如果到子代式里面的话,应该就看不到它了,所以接下来我们到哈点SH里边去新增一行eo。New。那我们会想到接下来如果再去执行这样一个脚本的话,会是什么效果呢?我们执行直接使用相对路径的方式去执行,我们看到前两行hello word正常输出了,因为呃,第一行这是本来就是echo出来的字符串嘛,第二行呢,是一个全局变量,第三行是一个局部变量,所以没有输出。
12:07
哦,那当前如果说我们想要把这个hello links也输出,那怎么办呢?一种方式是我可以使用S。命令去执行啊,或者说我们知道用点也可以啊点儿,然后哈点SH,哎这个就直接输出了,因为它就是在当前办事环境里面执行的嘛,那另外一种情况,如果说我就想让使用这种相对路径直接调用的方式也要输出,那怎么办呢?哎,那我们就在外边把新定义的这个。New one做一个export,注意export的时候只要给这个变量名就行了,不需要加Dollar符啊,所以接接下来我们直接export,然后我们再来执行一下。我们看现在使用这个相对路径的方式直接执行,前面这样执行是不行的,现在export之后可以得到。这就是我们给大家解释的。全局变量和局部变量的不同,以及他们在这个父子shell之间使用不同方式执行脚本的时候具体对他们的影响。
我来说两句