00:00
接下来我们要介绍的呢?啊,那其实就是link shell,我们把它看作一个编程语言的话,应该就是最后一部分重要内容了,就是所谓的函数方式,那函数这个概念其实我们并不陌生啊,它几乎在这个所有的编程语言里边都有这样一个概念,当然了,在C里边的话,本身它就叫函数,那如果要是在Java里边的话,呃,大家可能熟悉的是管它叫做方法。哎,所以我们会认为啊,方法可以认为也就是函数的另外一种说法,那到底什么是函数呢?呃,在计算机编程领域的话,函数一般我们认为的就是。一段代码的集合啊,就是我们把一些代码啊,逐步执行的一些代码,把它包装起来,它可以完成某个特定的功能,诶那可能我们调用它的时候呢,呃,就是可以传入一些参数,然后得到某个返回值,这样的话,我们就相当于把这部分代码模块化包装起来之后,就会非常方便的重复调用。
01:02
这就是所谓函数的概念和意义,其实就像我们之前啊,在这个脚本里边,我们曾经写过一个非常简单的a.SH那其实我们知道在这个A里边我们做的操作就是传入两个参数,然后得到它们相加的一个结果,这个和把它echo打印到当前的控制台里面,所以我们会发现啊,呃,如果我们经常用到这个功能的话,就可以把这个操作包装成一个函数。想要做两数加法的时候,我们直接调用这个函数就完事了啊啊,那所以在Linux系统里边也是这样的啊,它有很多现成的系统函数,我们可以直接调用这个功能,当然了也可以做用户自定义的函数声明和使用,这些就是接下来我们所要了解的内容。啊,当然了,在这个过程当中我们会发现啊,那你要这么说的话,我们前面不是把这个都已经写成脚本了吗?刚才我们又说,诶,可以把这个功能再包装成一个函数,这跟我们现在写成的这个a.SH脚本这功能不是一样的吗?这有什么区别呢?
02:09
诶,其实确实是这样的啊,因为前面我们说了,脚本本质上来讲,它是一个我们可以认为是一个代码的源文件嘛,它其实本质上来讲也是一段代码的集合,然后完成一个特定的功能,如果我们想要给它传递参数的话,那我们就是调用脚本的时候,用未知参数啊,特殊变量DO1DO2对应的把它传进去,所以本质上来讲,这跟函数的使用就完全是一样的。只不过那区别就在于,首先脚本我们看到它本身没有对应的一个返回值,如果说要有返回值的话,其实就是我们说的啊,那个Dollar问号。当前到底执行的对不对啊,那相当于是我们执行命令,但里边自动给我们的一个返回啊,就只有零或者其他的一些错误代码。那这个并不是往往并不是我们所需要的这样的返回值啊,这是其一,然后第二呢,脚本的调用过程毕竟还是显得太笨重啊,就是我们每次调用的时候,你还得在这儿去敲命令,然后给他传对应的参数,那如果说我们想要重复调用的话,每次都得手动敲命令,这个很麻烦啊,那相对于这个脚本而言,函数那就会轻量级很多函数的话,我们可以在一个文件里边重复的定义很多函数,然后想要使用的时候可以重复调用很多次,甚至你可以直接把它放在一个for循环里边啊,重复调用这这个的话就相当于灵活性更高啊,所以我们可以认为啊,从某种意义上来讲,函数就是一个。
03:40
缩小版的简化版的脚本,灵活版的脚本,那脚本呢,就是一个笨重版的复杂化的函数。那如果这么说的话,我们就发现了所谓的系统函数是什么呢?其实就是系统啊,Linux shell当中已经给我们提供了的可以执行的这种轻量级的脚本,直接就可以调用,诶,那我们知道系统内置的脚本。
04:07
这不就是我们所说的系统命令吗?啊,本质上来讲,跟我们之前讲的命令是一样的,所以我们讲了这么多概念啊,本质上都是一回事啊,就是我们所说的这个函数,这是从编程语言的角度来讲啊,那从编程的角度来讲,我们可以调用某一个特定的功能模块,我们管它叫做系统函数,那从之前我们讲这个Linux shell的角度,本质来讲的话,这些其实就是系统命令。啊,当然了,就是关于这个系统命令,它也分前面我们提到啊,也分这个内置命令,Shell的内嵌命令和外部的命令,那外部命令的话就是在shell之外,我们可以去安装,哎,然后放到这个user并下面,我们不就可以去直接使用这个命令了吗?诶,那所以有时候这些功能复杂的外部命令呢,我们又会把它叫做。一些工具,哎,所以大家就会发现啊,这些概念本质上来讲。
05:00
都是差不多的啊,不管我们是说函数也好,还是说脚本也好,还是说命令也好,还是说工具也好,其实都是功能化,模块化的,能够实现我们某个特定需求的这样的一个代码的集合啊,只不过就是他们的可能这个轻量重量级的程度有所不同啊,另外就是说本身我们调用的过程方式有所不同。那其实我们会想到,既然所有的这个命令都可以看作系统函数,那自然我们在脚本里边想要调用系统函数的时候,之前我们讲过的所有命令都可以调。啊哎,那这里可以举一个简单的例子啊,比如说诶,我们知道啊,就是当前我们有一个系统命令叫date嘛,可以显示当前的日期啊,那我们除了显示日期之外,还可以直接在后边加百分号S,这个表示显示当前的时间戳啊,这个其实是非常有用的啊,我们往往就可以比方说在实际生产环境里边啊,那往往我们。
06:02
会产生大量的日志数据,对吧?我们要写入日志文件,那有时候呢,我们可能就会把对应的这些日志放在一个特定的文件里面,或者说放在一个特定的文件夹里面,这个时候文件或者文件夹的命名怎么样呢?往往就会带着一个时间信息,年月日,或者是带着一个时间戳信息,表示当前的这个文件到底是怎哪个时间点产生的。日志,因为它是流水产生的嘛,所以哎,那我们就可以做这样一个操作啊,比如说我们直接可以。重新创建一个测试的脚本文件啊,那我们就把这个叫做这个算是命令调用,或者说系统函数的一个测试啊,我们就叫command test吧。点SH我们可以进来,首先先把当前的文件头先写上井号、叹号BBA。然后接下来我们想要做的操作,其实就是呃,定义这样一个文件的名称吧,一个日志文件的名称啊,我们定义一个file name。
07:04
这个file name等于什么呢?呃,那我们可能传入一个我们想要的一个,比方说用户的名称啊,我们把这个就当成DOLLAR1吧,从外部传进来一个用户的名称,然后接下来呢,后边跟上一个下划线。然后说哎,这是当前它的log,然后再跟一个下划线,跟上当前的时间戳,那这个时间戳怎么办呢?我们可以直接调用当前的系统命令,相当于就是当前的系统函数了嘛,啊,那我们当前要调用的就是date,那直接这么调date可以吗?这当然不行,那这相当于是拼接了一个字符串嘛,所以我们现在要调用系统命令的时候要用到,诶,又来了Dollar符。然后括号把它括起来啊,其实前面。我们讲到运算符的时候就说过啊呃,如果说我们想要比方说把那个expression啊,EXPR。表示的某一个运算的值想要赋给某个变量的话,哎,那我们需要加上Dollar符,然后把后面这个括起来,我们管这个叫做命令替换,对吧?啊,那所以我们在调用系统函数的时候,或者说使用系统命令在脚本里边使用的时候。
08:13
就要使用到命令替换,哎,那这里边我们就里边是一个命令。Date,然后加百分号S,这样的话就是我们当前所定义的这个文件的名称啊,这里我们也不做太多的这个文件的写入啊,我们直接就eo一下这个名称,我们输出看一眼就可以了。File name,然后接下来保存退出,好,那我们首先还是更改一下它的权限,加上执行权限。然后接下来直接做一个调用啊,那里边我们可以传一个用户啊,比方说我们艾特硅谷。我们看到当前生成的文件名称就是at硅谷下划线log,然后下划线当前的时间戳,诶这个在呃,定义一些日志文件的时候啊,使用脚本自动生成的时候,其实是非常有用的一个一个功能啊,所以我们可以了解一下,就是关于这个系统函数到底应该怎么样去使用,其实非常简单,就是使用一个这个Dollar加小括号,把它括在里面啊,这变成形成了一个所谓的命令替换的状态,那这里可以多给大家解释一句啊,这里我们管它叫做命令替换,其实我们看如果你从函数的角度来讲,这相当于什么呀。
09:23
这其实就是相当于调用了一下系统的date函数,那后边的这个是什么呢?后边这个不就是相当于给他传的参数吗?实参嘛,啊,当前这个date函数,系统函数肯定是需要参数的,那我们传一个实参进去,然后接下来它得到的返回结果就是这个命令的。得到的值,哎,那么用这个Dollar符包起来。得到这个函数的调用结果,将返回值做一个字符串的拼接,得到了当前的file name文件名称,哎,所以。我们就会发现这个使用还是非常简单的啊,前面我们已经介绍过各种各样的系统命令了,那不管是文件目录类的啊,还是进程管理类的啊,亦或是关于我们这个磁盘啊,分区之类的啊,所有的命令,只要我们想用的东西都可以在这里作为脚本里边的系统函数来调用。
10:18
那我们这里就不再去重复介绍之前讲过的东西了啊,那接下来呢,我们再来介绍两个新的在实际应用当中啊,比较常见的系统函数啊,其实也比较简单,首先一个叫做base啊,这个是干啥的呢?我们先来回忆一下之前的一个需求啊,我们回忆一下之前的特殊变量里面的Dollar n。我们应该还记得刀人,一般情况我们管它叫做位置参数,哎,那就是跟上一个从一开始的一个整数表示第几个参数,那如果是零的话,到零表示的是当前的脚本名称,也就是说获取到的是当前这个脚本本身的文件名。但是之前我们还记得啊,在做测试的时候,我们我们再来重新看一下,当前我们测试的其实就是这个,应该是parameter.shr,我们看一眼。
11:08
parameter.sh。哎,我们看就是这个里边我们打印script name dollar0,如果我们直接这里打印的话,大家其实会发现执行parameter.sh啊,后面我们跟一个参数就好了,然后我们会发现这里打印出来的其实是带着路径的,比如说我们用相对路径去执行的话,这里它获取到的就是点杠parameter.sh那假如说我们用绝对路径去执行呢?呃,Root scripts,然后parameter.sh啊,随便给一个AB。那后面我们看到这里,它输出的脚本名称就是带着绝对路径的脚本名称。诶,这个我们就不太舒服对吧,那就比方说有时候我们可能根据当前执行的这个脚本名啊,可能要去再做一些拼接,比方说拼接一个这个日志文件的名字啊,前面可能要把它单独提出来,诶那我们其实是有这样的一个需求,就是不要加前面的完整的路径。
12:02
我们就想知道他这个名字叫什么就够了,那能不能做到呢?哎,能做到就使用这里的这个。Base name这样一个命令就可以了啊,它的语法结构其实也非常简单啊,就是base name后边直接加一个当前的这个字符串类型的名称就可以了啊,那我们可以这里直接测试一下啊,比方说base name。然后直接跟上root scripts parameter.sh我们一敲,诶,就发现它直接获取到的就是最后的这个文件的名称。那当然了,其实本质上来讲啊,呃,就这里边的这个。后面的这个名称啊,甚至我们这里的这个对应的路径,你看我可以随便写。它其实本质上并不是要找到我们当前这个目录下的文件,它其实啊,我们就发现了,这其实它就是做了一个字符串的剪切,对吧?啊,它其实找的就是我们最后一个斜杠,这个目录斜杠之前的东西全部切掉,它就保留这个之后的最后的这一部分内容。
13:06
这是关于这个base STEM的一个基本使用啊呃,那这里我们还会发现,有时候呢,你你假如说真的是要做这个文件名拼接的话,日志文件拼接的话,那显然你后边也不应该带上这个点SH后缀也应该删掉啊,那他能不能把这个后缀也删呢?当然可以了,既然我们想到它本质就是做了一个字符串的剪切嘛,那你能切前面就能切后面,所以它可以跟对应的这样一个参数,这个参数叫six,那six我们知道这是一个后缀的意思,如果我们跟上一个指定的后缀的话,那么。Basename这个命令就会把我们得到的文件名称里边的后缀直接都去掉啊,我们直接使用一下就知道了啊。我们看后边这个是有后缀的,我们再加上一个点SH,这是它后缀名,一看诶得到的就只有perter这个名称了,诶所以这个使用起来还是非常简单的啊呃,那有了这个工具之后,那我们就可以来尝试的改一下之前的parameter.sh了,因为我们之前显示的是带着路径的嘛,那现在如果不带路径怎么去显示呢?
14:14
诶,这里面就需要用到一个base name这样一个命令,哎,那我们在脚本里边,那必须得去做一个命令,替换了Dollar括号。然后到括号里边直接调用的是base name。传入的,给他传入的第一个参数啊,当然就是当前你要指定的那个名称嘛,DOLLAR0直接传进来没问题,截取它,然后呢,我们还要把后边的点SH后缀名去掉,这样括起来就可以。哎,所以整体来讲这个过程还是非常简单的啊啊,那接下来我们保存退出再来运行一下parameter.ab我们看现在得到的脚本名称就是只有parameter。
15:00
我们不相信的话,也可以再拿绝对路径重新再执行一下啊,之前的话,这两种执行情况是不一样的,现在我们看到现在就完全一样,得到的就只有当前的脚本名称,而且不带后缀。这就是basename的一个基本的用法。这个非常简单啊,但是比较实用啊,我们往往在生成这些对应的一些名称的时候啊,用到当前文件的名名字,而且去掉后缀,可以使用这样一个命令。啊,当然了,我们在脚本里面是把它当成系统函数来用的。呃,除了这个之外呢,我们再来介绍另外一个就是。Name directory name,顾名思义,前面这个base name指的是文件的基本文件名称,只要文件名,那前面这个呢?呃,明显就是当前文件的路径名称了啊,它所返回的就是我们当前某一个文件的路径啊,这里希望截取的是这个文件的绝对路径,其实这个不一定啊,我们可以直接在这个控制台做一个测试,就是Di。
16:03
前面我们不是做过测试吗?哎,那这个root scripts,然后parameter.sh,你看这么一节的话,跟前面的base name刚好相反,Basena是截取最后一个斜杠之后的文件名,而它呢,是截取最后一个截斜杠之前的绝对路径啊,那自然我们就想到了,那假如说我之前这个不是绝对路径,假如说是一个比方说这样的一个相对路径,那其实它是不管的啊,就我们说的这个dina,其实跟basena是一样的,它只是针对当前。输入的字符串做的一个切分,哎,做的一个剪切,你假如说随便输一堆东西啊,那那我们这里面又是乱七八糟输一通。他其实一样,他就把我们最后一个斜杠之前的当做当前的这个路径切下来就可以了。所以这就是DR name的一个使用的过程啊,那有了这个之后呢,我们对于前面的这个脚本呢,也就可以再做一些进一步的改良了,我们就可以再加一些信息了,哎,我们直接小写O插入一行,在这里直接就echo。
17:09
不光有script name,我们还可以有当前脚本的执行路径,Pass也可以列举出来啊,因为有时候这个路径还是比较重要的啊,我们获取到路径在脚本里边,可能在这个路径下面就要做一些事情啊,我们往往在脚本里面就要获取路径,创建文件,创建目录啊,所以这些事情我们都是要需要知道,那这里面怎么获取当前的路径呢?哎,那有同学可能说,那你这个DOLLAR0里边不就有路径吗?你直接用这个Di name,然后DOLLAR0把它拿出来不就完事了吗。呃,其实我们会想到啊,没有那么简单,因为我们当前如果获取这个路径的话,是不是有可能你这个d dollar0有可能是一个相对路径啊,那如果是相对路径截取出来,你最后打印出它的相对路径的话,有可能就会出现一些问题啊,当然很多场景下,可能相对路径你去创建文件也是可以的啊啊,但是相对路径就会有可能你这个执行脚本的位置不同,就会导致对应进入的目录就会不一样,所以一般情况我们最好在里面的操作都把它转换成绝对路径。
18:16
那这个绝对路径又怎么转呢?啊,这里有一个方法啊,有一个取巧的方法,我们可以首先在这里切换当前的工作目录,我们直接CD到当前的这个DO0对应的目录里边来,哎,那怎么CD呢?当然对应的目录我们还是要命令替换使用Di内。然后DOLLAR0把这个当前的工作目录要切出来的,对吧?啊,它所在的工作目录我们先切出来,然后CD,其实我们知道CD的话,还应该是在当前所在的这个目录下边,应该是一样的,然后接下来呢,我们后边再做一个PWD。我们知道PWD这样一个命令是直接获取当前工作路径的全路径,绝对路径,那这样的话就符合我们这里显示的要求啊,那所以。
19:07
现在在在这里啊,真正要显示的就是直接调用PWD这样一个系统函数,当然了现在是命令,所以我们要做一个命令替换啊,放在这里的话,我们直接调用就完事。当然如果大家觉得这个就是有点麻烦的话,我们也可以这样啊,直接把上面的这一部分copy过来。我们copy在这儿,后边呢,直接加一个分号分割,我们知道在一行里边分号分割的话,就相当于这两条命令先后执行,然后再把它放在一个命令替换符里边,这样的话就相当于先执行前面的CD,后边再来做一个PWD,获取当前的绝对路径,然后返回输出在这里就可以了。啊,那有了这个之后,哎,那上面这一行我们就可以不要了,把它删掉,接下来我们看一下效果怎么样。保存退出。直接做一个运行。执行当前的这个脚本,我们传入两个AB参数,诶,我们看到直接它就输出了当前script name是parameter,它的pass绝对路径杠root-scripts,所以这个就一目了然,尽管我们是使用相对路径去调用的,同样在这里可以找到它的绝对路径,甚至你随便换一个。
20:18
换一个当前的工作目录啊,如果说我们想要去找到这个脚本去做调用的话,诶,我们可以直接比方说使用当前的这个相对路径去调用,再往后退,退到root目录下边去,然后进入scripts,然后调用parameter.sh。AB,我们看得到的还是一样,完全没有问题。好,这就是我们使用DR name获取当前路径的这样一个功能啊,对于这个系统函数的调用呢,本质上来讲就是一个命令的使用,在脚本里边,我们主要需要注意的就是加上do符括号,把要使用的这个命令放在这里,这就变成了一个系统函数的调用方式啊。
21:01
Linux里面往往把它叫做命令替换,我们可以认为命令替换就是系统函数的调用。
我来说两句