00:00
我们现在已经了解了Linux shell当中自定义变量的用法,那不管是局部变量还是全局变量,我们现在其实都已经知道它应该怎么样去定义,怎么样去使用了啊,那另外呢,我们其实也知道了一个shell脚本到底应该怎么样去编写。然后怎么样去执行,我们讲了三种不同的执行方法,我们也了解了他们之间的区别,我们做了很多的测试,那在这个测试的过程当中,我们会发现啊,那整体来讲,不管是使用bash去执行,还是后面我们讲到的使用source命令或者点命令去执行。他们看起来都是执行了我们当前在Linux当中的一个命令,一个指令,然后呢,把当前的脚本文件当成了参数传进去了,哎,那另外一种方式呢,就是我们说的直接使用相对路径或者绝对路径直接去执行这个脚本,诶这两种方式从本质上来讲确实是完全不同的。
01:01
那我们就会发现,那这种直接执行的方式,这看起来跟直行一个命令好像是差不多的呀,啊比方说我们到控制台里边直接去敲一个LS,查看当前目录下的内容,诶这跟我们执行一个脚本效果不是非常类似吗?所以我们直接切换到当前scripts下边,就想要直接去敲一下哈,点SH,想要直接去运行它,那当然了,我们知道之前也测过了,它会提示未找到命令,因为确实当前系统当中是没有这个命令的。那我们能不能做到直接把它当成一个命令来运行呢?哎,其实也是可以的,因为我们知道平常我们想要去运行的那些命令一般都在哪里呢?哎,都是在根目录下的病目录或者是目录下边。所以我们自然就想到了,那如果我把这个哈点SH啊,如果要是直接放到并目录下边,那不就应该可以直接执行了吗?哎,其实确实是这样的,假如说这里我们直接用一个CP哈点SH,把它直接copy到并目录下边的话,我们接下来再来直接执行,诶,我们看这个就完全可以了啊,这里后面显示了两个空行,是因为我们当时eo的两个局部变量现在都已经被撤销掉了啊,那这个看起来就是完全合理的一个结果了啊,那当然了,我们会想到啊,这个还是不是太靠谱,因为这个病目录下边我们都是系统本身就给我们生成好的一些命令啊,那一般情况啊,最好我们不要直接把这里边的东西再去做一些更改啊,所以我们还是把这个哈,点SH还是删掉吧,那如果删掉之后,如果想直接运行,那肯定就没法运行了,我们就只能带上路径啊,或者是使用SS或者点命令,或者使用bash命令去直接执行了。
02:48
哎,那我们想有没有更好的方法能够不改变并目录,同时也能够直接把它当成命令一样去执行呢?哎,有这种方法啊。哎,我们自然就想到了,你像前面我们执行的这个命令,它可以在病目录下边,也可以在S病目录下边,诶那我们知道有可能还有其他的一些路径啊,比如说什么user local b下面这些都是可以的,显然这是一个可以配置,可以定义的东西,就是我们当前找的系统命令的路径,它是可以配置。
03:19
那这个配置通过什么呢?哎,那就是我们说的前面讲到的系统环境变量里边有一个叫做pass的东西。啊,所以我们就知道这个pass它到底是什么呢?我们当前默认的就是user local sb user local病,还有user s病,User,还有root下边的病,这些路径是我们当前直接执行的。哎,那有同学可能说,诶,那这个看起来没有我们说的直接跟目录下的病和S病啊,呃,其实我们知道这两个目录它本身也只是一个链接而已。并目录本身链接到的就是user下边的并,所以我们比方说直接执行一个LS命令,它是在这个并下来,下面的话,本质它其实是放在了user病下面啊。
04:06
那所以我们只要路径包含了这些,当然就没有问题了啊,所以我们这里面看到,诶别的这个不好说,那我们这里这个root并其实是可以把我们当前这个直接放到root并下边就可以直接执行了啊,那或者呢,我直接把当前的这个目录scripts目录,它的绝对路径添加到这个pass环境变量里边,跟到后边,我们看就是拿冒号分割嘛,一个一个把它跟到后边,那其实接下来我们也就可以直接执行它。所以这是关于这个环境变量啊,一些更改和我们直接执行命令的一些方式。通过这样的一个介绍,其实我们也就发现,对于一个脚本而言啊,本质上我们看起来好像跟这个系统里边的命令没多大差别。那如果要这么说的话,我们执行一个命令的时候,那有时候我们是后面不跟任何参数啊,直接就是执行命令,然后接下来看到一个结果就好了,那有时候呢,后边是可以跟参数的。
05:03
对于脚本,我们想的也是这样啊,我们并不希望每一次执行脚本得到的都是完全一样的内容,有时候就像这个哈,那我我们可能是向不同的人去打交道,不要每次上来都是hello word啊,那比方说我们先跟小明打一个招呼,诶之后呢,有有又有可能跟小亮打一个招呼,这个时候打招呼的这个人名,那应该作为参数传给脚本去执行。那这个时候我们想要传入的参数又用什么样的方式来获取呢?哎,这就涉及到了linknu shell当中的另外一大类比较特殊的变量啊,那这一部分变量呢,主要就是用来处理我们脚本的输入参数,对它进行捕获和处理的这样的一些特别的变量啊,那首先我们要介绍的就是这个Dollar n,这里的N呢,并不是,实际上就是我们使用的时候直接写Dollar n啊呃,这个N是要替换成一到九的数字。
06:00
那所以如果是DOLLAR1的话,其实指的就是我们当前脚本输入的第一个参数,那如果是DOLLAR2的话,当然就是第二个参数了,一到九是这样,那如果说我有十个以上参数呢?啊,也简单啊,加一个花括号,把它括起来,为了防止我们跟前面的这个DOLLAR1这样的一个变量进行混淆,所以说我们把后面的多位数字括起来就可以了。除了这些之外呢,还有一个比较特殊的叫DOLLAR0,它表示的是当前脚本本身的名称,好,我们可以来具体来测试一下啊,在控制台里面试一下,那我们现在就直接把hello.sh做一个更改吧,啊,那这两行我们这个变量都已经onet了,所以现在我们直接把它删掉,然后接下来呢,直接可以echo一个。哎,当前我们直接hello加一个DOLLAR1,哎,那当前的这个DOLLAR1明显是一个变量,它是一个当前的位置参数变量,也就是说现在我并不知道它是什么,但是呢,呃,在调用这个脚本的时候,后面可以跟上一个参数对应的就输入到这儿了,接下来我们可以看一下。
07:09
那现在我们如果要调用这个脚本的话,那就是hello sh,如果直接回车的话,那很显然这里是没有任何东西的,如果说我们想要真正的打招呼,那就hello,后面跟上小明,哎,这样的话就是哈小。那如果我们调用的时候改成哈小亮的话,当然输出的就是哈小亮了。这就是关于这个脚本的参数的用法。啊,当然了,后面我们还可以输入多个参数,那为了更加清楚的测试特殊变量的一些用法啊,我们还是另外的新建一个脚本吧,呃,我们把这个脚本叫做专门跟参数有关啊,就叫做parameter,好了,点SH把它放进去,那同样一开始啊,我们还是应该井号,然后叹号。Ban dash。啊,接下来我们可以直接echo啊,那这里呢,我们首先先来一个分割线吧,看清楚一点,我们现在测试的是什么啊,我们现在要测试的是未知参数,就是这个Dollar n啊,不过这里我们要注意,如果你用双引号把它引起来的话,这里是表示变量的,我们当前有没有N这个变量呢?呃,当前并没有这个变量,所以那相当于它是空的嘛。
08:17
为了让他不要认为当前我们这是一个变量的表达,我们把这个双引号改成单引号。单引号的特点就是里边它不会认为Dollar是一个变量的表示符,而是把里边原封不动的输出,哎,这样的话就符合我们的要求,然后接下来呢,我们可以eo,首先我们先输出一下当前的DOLLAR0吧,啊,DOLLAR0比较特殊啊,它其实是我们当前的脚本的名称,诶,所以我们可以把这个再加一个描述信息啊。Name啊,那这里是DOLLAR0。然后接下来是我们的第一个输入参数。Parameter。是DOLLAR1。然后接下来当然还可以有第二个参数parameter。
09:04
二。好,我们把这个写完了之后保存一下退出,接下来我们可以啊,当然了,我们还需要先把这个parameter本身它是没有这个可执行权限的嘛,所以我们需要先把这个X权限先要先要加上。然后接下来就可以执行这个脚本了,执行的时候加上对应的参数啊,比方说我们第一个参数就叫ABC。呃,第二个参数叫DEF。我们可以看到当前脚本的名称叫做parameter.sh啊,注意这里的名称,它其实是带着我们执行对应的这个路径的,那你如果要是绝对路径去执行的时候,它这里会直接输出我们的绝对路径啊,然后第一个参数ABC,第二个参数是deff都可以获取得到。啊,当然了,有同学可能觉得,哎,那你这里如果要是绝对路径去去输入这一个。调用这个执行这个脚本的话,那这显得就会非常的麻烦嘛,Script,然后parameters,那这样的话输出的是一大串啊,这并不是我们想要的那个脚本名称,我只要最后这个就够了,那怎么样去获取只获取当前的这个名称呢?诶这可以使用另外一个比较简单的一个小命令叫做。
10:20
Base。这就相当于是可以获取到我们当前一个文件的本身的名称,去掉它的路径啊,当然了,这个如果调用的时候,我们可以把它当成一个命令,也可以把它当成一个系统给我们提供的函数啊,这个我们放到后边讲到函数部分的时候再统一来做介绍。这就是关于位置参数的一个用法,那除了位置参数之外,还有一些比较特殊的变量,比如说这里还有一个。Dollar井啊,Dollar井号是什么意思呢?它指的是获取我们当前输入参数的个数。所以本质上来讲,这是一个。
11:02
参数个数统计的变量啊,那一般情况有什么用途呢?啊,那就一般我们可以把它用在循环里面啊,有时候也可以一开始上来之后啊,先做一个一符判断,就判断这个参数是否符合我们的要求,比方说我们当前必须这个命令啊,或者说这个脚本要输入两个参数,那如果这个参数个数不对的话,显然是要报错的,哎,所以这也是一个用途啊。啊另外就是说我们用在循环里边,按照这个总的参数个数作为我们循环的次数的标准,然后就可以获取到每一个参数进行处理了。接下来我们也可以在当前的脚本里边去把它做一个测试。同样我们还是直接为parameter,那接下来呢,在下边直接去新增一行,我们就直接把上面这个做一个copy吧。当然了,当前就是测试的是Dollar z。然后现在我们需要直接输出当前就是parameter的个数numbers。
12:07
好,把它保存一下,然后直接可以去执行,我们可以看到当前如果什么都不跟的话,给出的个数当然就是零了,那如果说我们还是像前面这样给ABCDEF2个参数的话,这里给的就是二,所以它直接指定的是当前参数的个数。好,那除了Dollar z之外呢,啊,另外还有比较特殊的两个。变量,那就是Dollar新和Dollar at,它们俩放在一起介绍,主要就是因为他们的功能有点类似,主要就是获取当前命令行里边提供的所有参数,他们都是可以获取到所有参数,那它俩的区别在哪里呢?哎,那就是Dollar芯儿,是把所有的参数看成一个整体,哎,也就是说如果我们输入了ABCDF2个参数的话,Dollar芯获取到的哎,相当于就是一个东西,就叫ABC空格DEF。
13:06
那如果是Dollar at呢?Dollar at,我们可以认为获取到的是一个啊,相当于是一个所有参数构成的一个集合,或者说我们可以理解成得到的是这样的一个数组ABC,然后DEF。哎,所以在具体使用的过程当中,他们就又会有所不同了,Dollar芯往往就是直接看一下所有拿到的参数是什么就可以了,那如果是Dollar at的话,就可以使用for循环去遍利里边的每一个参数了,它是区别对待的。当然了,现在我们还没有讲到后边的循环,哎,所以当前我们能够看到的也就是所有参数的整体,我们可以也把这一部分做一个打印。同样还是进到当前的。Parameter里边,然后把对应的这一行复制一下。
14:00
当前是一个Dollar芯儿。然后接下来我们直接echo当前的Dollar芯。做一个打印输出啊,那当然了,我们也可以把这两行统一复制一下,然后打印输出一个Dollar at,我们现在如果不做循环遍历的话,那其实会发现他们俩应该没什么区别。我们保存一下,然后去执行。我们可以看到啊,我们这里应该是写错了,不是Dollar号啊,我们把这个还是改过来,上面应该是Dollar心。Dollar芯下边是Dollar at,然后接下来我们直接来运行一下,可以看到输出的结果都是一样的,就是ABCDEF,所有的参数列表全部放在这里。最后呢,我们再来介绍另外一个比较特殊的变量,那就是Dollar问号,这个其实跟前面已经完全不同了啊,之前的那些特殊变量都是跟我们当前脚本的输入参数有关的,而do问号呢,它其实是相当于是我们整个脚本的返回值啊,它是表示我们当前最后一次执行的命令的返回状态。
15:10
哎,那所以如果说我们最后一次执行的命令就是调用了脚本去执行的话,那我们就可以获取到脚本的返回状态。那最长见的情况应该是为零,脚本就正常的执行结束了,那如果要是不正确的话,那就是其他的一些数值了,一般画的一个错误报错,那我们就知道返回的应该是一,如果返回一的话,那就是一个一般化的错误啊,当然还有其他的一些情况,比如说我们这里。前面已经执行过一次脚本,那这里如果直接eo dollar0的话。Dollar问号的话。就会看到它的返回值其实是零,因为我们之前都是正常执行的,那假如说我们现在是比方说直接parameter.sh,直接做一个运行,我们会发现它是未找到命令,那如果是这样的话,我们再来看一下,它的返回变成了127啊,那这127表示就是我们当前没有对应的命令,这是一种特殊的不正常返回报错的形式。
16:12
这就是关于shell里边的特殊变量,我们做了一个简单的介绍。
我来说两句