00:00
上节课呢,我们使用shell脚本写了一个非常简单的hello word进行了输出,而且我们了解了执行脚本的三种不同的方式啊,那这里我们讲到的第三种啊,做一个了解扩展的这种方式比较特殊,就是在脚本的路径前面直接加上一个点命令或者SS命令来进行执行,这种方式我们说它的特殊点就在于。前两种方式我们其实本质上都是要打开一个子shell去执行脚本的,而这种方式呢,不需要打开exce,直接就在当前的。BA shell这个环境里边去执行脚本啊,那关于这个父子shell的内容呢,我们也可以来做一个非常简单的测试,诶,那就是怎怎么样就叫做子shell呢,非常简单,比方说我们在这里啊,当前的shell环境里边可以直接杠EF以下啊,这个可能会比较多,我们直接杠F,不要看所有的,只要看当前控制终端相关的。当前用户啊,和当前这个控制台相关的就可以了,我们看到诶这里就有一个BA-bash,这是我们登录进来之后启动的bash这个进程,然后接下来如果我们直接打开,另外打开一个bash,呃,之前我们说这个BA如果后面加上脚本名称,那是执行吗?如果我们什么都不加,就敲一个bash,那会是什么样子呢?
01:21
哎,其实现在我们看一下杠F,我们会看现在其实就多了一个BA,那这个BA进程呢,它是我们前边这个BA5283的。紫禁城,哎,所以这就是我们所说的子dash子shell环境。所以接下来我们做的所有操作啊,现在进行,比方说这里边执行各种脚本,诶我们这里直接哈点SH执行一下,其实就是在当前的子shell里边去进行执行的。那如果这个子筛执行完了之后,它会怎么样呢?我们可以直接exit退出,哎,我们看如果在外边退出的话,我们其实就断开远程连接了嘛,现在退出没关系。
02:02
还是root登录的状态,这是为什么呢?因为之前我们在的是子she在还在里边呢,之前我们说这是嵌套的嘛,啊,所以前面我们这里杠F的时候,是在这里边去做的杠F,然后啊把这个xit退出来之候,那外边是不是还有一层啊,诶,所以我们看这也是shell的这种特点啊,它是外壳嘛,所以我们可以套娃啊,一层外面再套一层,一层层层嵌套,它都是一层壳,所以我们就会发现这个退出之后,然后你再看的话,杠F现在就又没有子。我们可以理解成之前如果说我们使用了这个SOS或者是点命令的话,那就是不带这个子she,直接就在当前的best she里面去执行,而如果说我们使用了前两种方案的话,执行的时候,那就是打开了这个子she去执行的。这就是我们前面说的一个最大的不同。那当然了,这个开不开子shell,这么看的话,好像除了多了一层套娃之外,也没什么区别。
03:05
其实最大的区别在于啊,这里我们文档也列出来了,最大的区别在于环境变量的继承关系。是有问题的啊,就是比如说在子LL里边设置的一些当前的局部变量,在负shell里边是不可见的啊,那同样就是比方说负shell里边定义了全局变量,在子shell里边如果做了更改的话,回到负she也是相当于没变的。诶,这样说的话可能稍微有一点绕,这主要是涉及到了Linux shell编程里边的环境变量的这样一个概念,所以接下来呢,第三章我们就重点来介绍一下什么是shell编程里面的变量。啊,那简单来说什么叫变量呢?其实就是我们临时的在当前shell绘画当中想要去保存的一些信息,呃,本质上来讲,我们可以知道它就是在内存里边啊,我们想临时的保存一些东西,比方说哎,我这儿开辟了一块空间,我想存一个我当前的一个数,比方说当前是20。
04:08
我把它叫做AA,那这就是一个变量,如果之后这个数又变了,那A的值就变了,变成21,那A的值就变成21了,所以这个变量啊,所谓变量我们可以认为就是内存当中存储的一块数据。那对于Linux系统而言啊,Be she其实也是一样的,Be she里边它就有这样的一个特性,就叫做环境变量啊,它就使用变量来存储跟我们当前的摄像、绘画和工作环境相关的一些信息啊,所以就一般啊,这个变量也可以叫做环境变量,Environment variable啊,啊这就是基本的一个定义,然后在shell里边的变量呢,其实整体来讲可以分成两大类。一大类,那就是。系统给我们直接定义好的所有的变量,另外一大类呢,那就是用户自定义的变量啊,所以从这个角度来划分的话,那就是系统这块,System意大利变量,那然后呢,呃,剩下的有一部分我们是可以自己去定义,自己去控制的,那就是用户自定义变量,这是一种划分的维度,另外还有一种划分维度。
05:24
She里边的环境变量可以分为全局的环境变量和局部的环境变量。这个名词一提出来的话,如果我们有编程基础的话,就会发现啊,呃,这个概念明显就出来了,什么叫全局,什么叫局部呢?啊,很明显全局的环境变量,那它应该可见范围是非常大的啊,那在Linux系统里边,它是指什么叫全局变量呢?就是指对于当前的这个shell绘画,比方说我们起了一个这个bash进程。打开了一个控制台终端的这个对话框。然后接下来呢,呃,那如果在里边我们再去启动了bash进程,那这是它的子进程,当然里边就是一个子shell了。
06:07
如果我们设置的是全局变量,在这个BA里边设置的全局变量的话,那就相当于对于当前外边的bash和它里边的子bash啊,子shell绘画,你里边还可以嵌套层层套啊,对于里边的里边所有的shell绘画都是可见的。那与之对应啊,那如果是局部变量的话,就是只针对当前的拜事环境是有效的,可见的,那如果里边你还创建了这个子she的话,子shell也不能访问外边复shell的局部变量。呃,这个可能跟有一些我们的那个编程语言里边的习惯不太一样,这个大家先要把这个概念树立起来,就是所谓的局部,就是只对当前的有效,全局的话就是它的它的子shell也有效。啊,那对于这个系统自定义的变量呢,其实我们知道啊,大部分都是全局变量,当然了也有一些也只是局部变量啊,所以这其实是它呃嵌套在我们两种划分方式啊,彼此之间是有是有交叉的环节的,那Linux本身在启动系统开始bash会话的时候,就我们直接啊这个远程链连接,直接打开一个bash控制台窗口的时候,其实就设置了一些全局的变量啊,那系统的这个全局环境变量啊很多。
07:29
我们其实都非常熟悉,之前可能也也已经用过了,比如说Dollar后,这就是当前的主目录加目录,那Dollar p WD当前的工作目录,那Dollar shell,我们当前使用的shell解析器,还有Dollar user当前的用户啊,这是非常常用的一些系统变量啊,那我们发现它的特点就是以Dollar符开头,后边呢,跟着的都是大写字母的名称,哎,这就是环境变量的一个特点啊,系统给我们定义的这些环境变量基本上都是这样。
08:02
当然了,你如果想看它具体的这个环境变量的值的话,怎么看呢?诶那非常简单,就是你echo的时候带上Dollar服去看一下就可以了,诶那我们看到当前的这个主目录加目录是在杠root下边。那如果说我想查看当前所有的环境变量,那怎么看呢?如果想看所有的全局环境变量的话,有一个非常简单的命令,就叫env。哎,我们看这里边显示的非常非常多啊,所以如果要是想要更加清楚的看到的话,我们可以less一下。可以看到上面啊,当然了,这里还有这个term shell啊,我们当前shell是啊,你看还有这个s sh client啊,我们当前使用这个S进行远程登录它的客户端,哎,当前的这个主机名,端口端口号,哎,以及。我我们当前本身啊,主机这边连接客户端的端口号和连连接远程SHHD服务开启的端口号,这个都列在这儿了啊,那后面这还有user啊对应的这些信息后。
09:03
Log name啊,这些全部都能够看到,这就是我们全局的环境变量。除了这个命令之外,另外还有一个叫做print env。跟env基本上是一样的,也可以直接打印出当前所有的系统全局变量,注意这里是全局变量啊,啊,那当然了,就是如果你想看单独的一个的话啊,比方说我们直接这里print env,然后你可以直接print,比方说Dollar user。哦,这里在print的时候,我们就不需要去加上Dollar符了,就是你想看哪一个环境变量的名称直接看就可以,那这样的话,我们一看当前的user就是root,当然了名称该大写还是要大写,这个就是非常简单的一些操作啊呃,那前面我们也看到了,就是你如果假如啊,我们eo的时候带上这个Dollar符的话,相当于就可以随时随地去使用这个变量了,你这里边这个env或者是这个print env的时候。
10:02
这里它是比较比较特殊的一个,就是要打印当前环境变量信息的一个命令嘛,诶所以后边可以不加Dollar,那一般情况下你如果把这个当变量使用,用它的值的话都要加上,比如说诶,我们可以直接LS,我们当前是在工作目录是在呃,Scripts下边,那我们比方说可以查看一下当前主目录的。下面的内容,那那就可以看到,确实是直接可以打印出来的。而且我们对于这里提到的这些全局的环境变量,我们也可以做一个校验,哎,凭什么说它是全局的呢?我们说全局的特点就是你再打开一个子bash。里边同样还可以获取到这些东西啊,比方说我们进去之后看一眼哦,现在已经是一个子bash了,然后接下来啊,我们去直接echo一下当前的后。是不是一样呢?没有问题,都能够看得到,然后我们可以exit退出。那同样有全局环境变量,那就有局部环境变量,如果要是局部变量的话,它就只在当前定义的这个拜里边是可见的,在。
11:10
如果说你打开了一个子SH的话,子CE的话,诶,那里边其实就看不到了啊呃,本身Linux系统也给我们定义了一些标准的局部变量的啊,这个并不一定是系统定义的变量就全都是全局的,那我们如果想看到当前定义出来的所有变量怎么看呢?啊,有一个命令我们可能也知道啊,直接set。Set,这里就能看到当前定义的所有变量,当然后面还有这个函数,我们可以太多的话,我们可以直接做一个less。我们看在这个set里边就能看到我们之前在environment啊,Env里边看到的所有信息,包含了所有的全局变量,当然还有一些是那边没有的啊,那没有的有一些就是局部变量。局部变量啊,其实这里面不光是有这个系统定义的全局变量和局部变量啊,后面我们会发现就是即使你用户自定义的变量在这个set里边也能够看到,诶,所有的内容都在这里都能够看到。
12:10
这就是关于Linux shell当中环境变量的概念,以及系统给我们预定义的全局变量、局部变量的概念。
我来说两句