00:00
我们已经简单的回忆了一下shell是什么,那接下来呢,我们就要直接上手去做操作来写一个shell脚本了啊,那写脚本的话,这个基本的例子,当然我们用的还是hello word了,我们都知道啊,编程语言的学习,一般上手的入门案例都是hello word啊,那所以接下来我们就尝试使用一个shell脚本,输出一句hello word。那这里我们可以给大家先做一个基本的介绍,就是关于这个shell脚本它的格式啊啊,那我们其实可以看到,对于shell脚本而言,一般情况下默认的它的后缀名其实就是点SH啊,比如说前面我们已经列举出来看到的这样一个脚本。那当然了,对于shell解析的过程当中,它其实对于后缀名是没有要求的,只要诶我们是一个可执行的文件,然后里边你会发现它是按照这个shell的标准去写的话,那其实无所谓啊,是什么后缀都无所谓,你不写后缀名也一样,只不过约定俗成,一般我们加一个点SH作为后缀,那我们这里可以就来瞄一眼这个脚本到底长什么样啊,来学习一下,看看它到底应该怎么写啊,这里我们就直接用less吧,Less去找到并目录下边的。
01:13
Unix go。LPR啊,我也不知道它是干什么用的,但是我们至少可以看到它里面的格式啊,其实我们看一进去就发现了啊,啊,那上边这个带井号的这一部分明显就都是。注释,然后下边诶,这里正式的这就开始有等号,明显这就开始给赋值了嘛,啊,然后后边啊各种等于,你看这后面明显是一个路径啊,然后后面可能做各种各种各样的操作,这个我们就不管了,具体语法不管,关键先看它的开头。开头看起来是注释部分,里边有一句非常特殊的第一行注释,那就是井号,后边跟着的是一个叹号,然后加上。杠B,然后杠SH,这指的是什么呢?这指的就是当前默认选择的命令行的解析器,我们当前shell的解析器用的是谁啊,当然了,这里面用的是SH,那我们知道SH在三到七里边默认就指向链接指向了bash嘛啊,所以大家其实会发现啊,我们一般在写这个shell脚本的时候,往往直接第一行这里指定指定的解析器就是b bash。
02:24
啊,所以这里我们可以先做一个基本的了解,就是脚本一般都是乙。第一行先写这么一句,就是井号,然后感叹号b bash指定我们当前的解析器是。好了,那既然有了这个基本的概念,接下来我们就来看一看到底应该怎么写吧,啊,那首先我们先把对应的目录创建好,我现在是在root的主目录下边啊,自己的加目录,那我为了方便管理啊,这里面东西有点太多了,我们直接创建一个单独的文件夹,就叫shells啊,或者我们管这个叫做。Scripts。
03:00
因为我们知道这是属于shell脚本啊,我们直接把这个创建出来,然后进入scripts下边去创建一个文件啊,比方说我们第一个文件就叫做hello。点啊,默认我们约定俗成啊,把这个脚本后面加上一个SH,你不加其实也可以,接下来我们就去编辑为hello.sh。好,进来之后,那当然我们首先要写的就是井号,然后叹号杠丙,当然你这里边直接写这个SH也行啊,我们一般都写成fish。接下来我们就是说要去输出一条信息了啊,输出一个hello word怎么输出呢。其实我们仔细观察就会发现啊,当前这个脚本它也是一行一行解析的呀。就跟我们在外边命令行控制台里边去输出一条命令啊,去写一条命令执行一模一样啊,所以本质其实一回事,所以这里边我们在外边如果想要控制台打印一行这个hello word怎么打印呢?诶,当然是使用这个。
04:01
Echo命令嘛,哎,所以这里边我们可以直接echo,然后后边哎,我们可以加上引号引起来,Hello。Work。所以这个其实非常简单直接,这样就写好了。然后接下来我们就可以尝试去对它进行一个执行,哎,当前我们先看一下啊这个脚本,我们当前想要执行的话,怎么样去执行呢?这里涉及到不同的执行方式,我们可以看一下文档里边对于执行方式的说明。首先第一种最简单的就是直接使用dash或者SH,然后呢,后边跟参数跟着的就是脚本的相对路径或者绝对路径,直接就可以运行它了,诶其实这个我们也很好理解啊,因为当前对这个脚本进行解析,你肯定是需要用一个命令行解析器啊,用一个shell解析器去进行解释的嘛,那到底用谁呢?诶那就你相当于把这个当成一个命令去执行,后边跟上对应的脚本名字就可以了,所以接下来我们可以直接用这种方式来试一下啊,那我们就直接BA。
05:08
啊,当然了,我现在本来这个目录啊,当前的工作目录已经到了scripts下边,所以我这里的相对路径就可以不加了啊,直接best hello.sh,它这完全没有问题,我们可以看到直接在控制台打印出了一行hello word,所以我们这个脚本就已经写成功,而且执行成功了。呃,那当然了,我们如果要是退到了其他的工作目录的话,那我们找这个脚本能不能执行呢?诶,当然也是可以的,但SH,那就直接去找到它的相对路径或者绝对路径,那首先我们看相对路径,相对路径简单一点啊呃,我们直接当前的目录下边有一个scripts目录,然后找到对应的hello.sh直接执行,诶,这个是没有问题的,那或者呢,我们也可以使用绝对路径,那就是杠root下边的scripts,然后hello.sh,这也是完全没问题。啊,那对应的我们其实知道啊,因为当前的SH其实就是bash的一个软链接嘛,所以他们俩本质上完全一样啊,我在这里执行SH,然后去执行它,效果是完全等同的,这就是我们所说的第一种执行方式,使用bash或者是SH直接去对当前的脚本进行一个解析执行。
06:24
然后接下来呢,啊,这种执行方式我们会发现啊,它比较简单,比较直接啊,他也不需要额外的任何操作啊,但是。它其实在实际运运用的过程当中啊,执行脚本往往我们不用这种方式。那我们往往使用的是什么方式呢?啊,其实大家知道这个脚本啊,本质上来讲,它不就应该可以直接执行吗。啊,你就像我们有一些这些,呃,对应的这个SH这个脚本文件啊,我们想着就应该是直接一敲这个文件名,然后就相当于把它执行起来,直接就应该可以跑了呀,诶那你现在能不能直接去执行这个文件,不要用其他的一些工具去解析了呢。
07:03
呃,本质上是可以的,因为我们当前的这个进程就是一个BA,你不用再去指定bash了,所以接下来的第二种方式。那就是直接输入脚本的绝对路径或者相对路径执行脚本,好,那接下来我们就看一下,相当于就是把上面的这个。但是直接给省了。我们直接把这个办事省了之后,直接绝对路径找到当前的哈点SH做一个执行,但是我们发现它会提示权限不够。哎,这为什么权限不够呢?其实这个我们也知道啊,我们LL一下当前目录下的script。我们能够看到这一个hello.sh,他有我们当前是root用户嘛,自己创建的文件,它有读写权限,但是没有没有可执行权限,哎,所以之前我们就想到了对于这个文件的权限啊,这个X如果是文件的话,那你必须要有这个X权限才能够执行,那什么样的文件能够执行呢?诶很显然脚本文件嘛,脚本文件就能直直接执行。
08:07
当然了,如果是目录的话,你是需要这个X权限才能够执行CD啊,才能够进入,所以接下来我们想要做的操作,当然应该给这一个。文件这个脚本先要。增加一点权限了啊,那我们直接就把当前的user啊,或者说我们直接把所有的用户啊都加上可执行权限,那对应的我们需要找到scripts下的哈,点SH,然后我们看一眼,现在它就具有了X权限,我们看到它会变颜色啊,所有可执行的文件在我们当前的这个shell里面啊。可视化的这种显示的话,它是绿色的啊,所以接下来我们就可以看到,接下来直接去按照绝对路径去调用,现在真的就可以输出结果。呃,那当然了,既然可以绝对路径去调用,当然用相对路径,我们直接找当前的script。
09:03
然后下边的哈点SH直接去执行也是完全没有问题啊,就是绝对路径相对路径这个啊,随便选择一个都是可行的,这里需要呃多强调的一点是,假如我们直接进入到了当前这个scripts目录下边,诶,那我们可能想到了,那这样的话里边直接就有哈点SH啊哎,我这里可以直接这么去调吗?注意这样是不可以的。尽管我们在相对路径下边啊,我们知道工作目录下如果直接有这个文件的话,你应该直接能找到,但是我们看你直接这么敲的时候,Link shell默认它是去找命令了,把你这个当成一个命令去执行,那自然了,我们知道并目录和user并目录下边啊,或者说目录下边都根本没有这样一个命令啊,没有这样一个脚本,所以当然就未找到命令不能执行啊,那所以说如果说在当前这个scripts工作目录下怎么去执行这个脚本呢?诶,你加一个用相对路径啊,如果你用绝对路径当然是一样的啊,我们用相对路径执行的话,加一个点杠。
10:06
hello.sh,这样就可以执行啊,所以其实在真正工作当中啊,想要去执行一个脚本的时候,往往我们都是这种方式,大家一定要多熟悉一下。所以在这里如果我们比较之前的这两种执行方式的话,也就会发现啊,呃,那为什么这两种执行方式一种不需要赋予脚本X权限,另外一种必须要有可执行的这个X权限呢?呃,其实就能想到第一种方式,那是我们单独的又使用了一个拜命令啊,相当于我们又起了一个拜进程,然后。指定这个文件名,相当于这是我们bash命令的参数,接下来呢,就用这个bash啊,另起了一个BA进程去进行脚本的解析和执行,而我们下边呢,下边直接去调用这个脚本,那是让我们当前的bash这个shell环境去执行这个脚本,所以当然就必须要有可执行权限了。
11:05
前面是当成这个BA的参数传入的,不需要有可执行权限,后边就必须要有可执行权限。好,那这其实就是我们一般执行脚本的一个最常见的做法啊,那这里呢,还需要给大家再多介绍一点,扩展一点知识,那就是其实还有第三种执行脚本的方式,那就是在脚本的路径前面。使用一个点命令,或者是使用source命令来执行脚本,那我们接下来可以去尝试一下啊,用这种方式去执行。所以我们在这里就可以直接,哎,相当于用S替代了之前的bash或者SH,然后后边加上哎,比方说哈点SH,我们看直接执行也是可以的。啊,那当然了,我们这里给的是相对路径,如果给绝对路径的话,Script下边的哈点SH当然也是完全一样啊,那除了这个source之外呢,它还有一个完全等价的命令,就是我们这里所说的点这个更加的奇特,直接点空一格,然后后边哈点SH,我们看现在这样写也是对的。
12:13
直接去执行了,这个我们要区别的就是直接点,然后空格哈点SH,和之前我们介绍过的在当前工作目录下使用相对路径点杠哈点SH,这两者执行的方式是完全不同的,这个我们一定要区分开啊,尽管看看着很像啊。那这里的点杠是指的什么呢?这个点指的是我们当前的工作目录啊,然后点杠,这其实是当前哈点SH的相对路径,而后边的这个点是什么呢?这是一个命令,这是一个点命令,然后空格后边哈点SH是它的参数。这里可以多给大家介绍一下这个south和这个点命令啊,这个source命令,其实这就是我们当前这个best she的一个内置命令啊,我们可以这里直接type一下。
13:05
你可以type,我们可以看到这是shell内嵌的啊,那它本身呢,是从c shell而来。也就是前面我们看到的这个CSH。它是借鉴了这个是要实现里边的一种命令实现啊,那它的另外一种实现呢,呃,其实就是Bo恩。Shell就是我们所说的这个bash里边的这种对应实现啊,其实就是这个点,在我们当前一般的这个Linux发行版里边啊,Shell其实对这两种都是支持的,所以一般情况我们用这两种方式写,可以认为它是等价的。那这种执行方式跟我们前面介绍的两种常见的执行方式又有什么区别呢?诶,这里边多给大家提一个概念,就是所谓的子shell进程。什么意思呢?呃,就是前面我们在执行这个shell脚本的时候,不管是你使用了SH或者是bash这样的一个命令啊,这样的指令去解析执行当前脚本,还是说在后面直接使用。
14:08
绝对路径或者相对路径去进行执行,他们其实本质上都是打开了一个子shell。就是说当前我们当前的这个BA shell这个环境啊,是不受影响的,他为了执行这个脚本,单独的在里边,我们当前的这个环境,诶,这是这个大的环境啊,为了执行这个脚本,它单独的在里边嵌套的又起了一个,我们可以认为又起了一个bash。然后在这个办里边,把我们当前脚本里边的语句一句一句拿出来解释执行,最后得到结果输出,哎,所以这是我们之前执行的这种方式,而现在的这个S和这个点命令呢,它本质上来讲SS,我们知道字面上它有这个起源啊,源头根源这样一个意思,所以使用这种命令去执行脚本的时候,根本就不启动子shell进程。它是直接在当前的这个shell里边,把我们当前的这个脚本每一行命令都拿出来,一行一行解析,直接执行。
15:08
哎,所以呃,这个有什么好处呢?这就相当于没有我们父子shell的这种嵌套环境了。这个嵌套环境最大的一个影响是什么?后面我们会提到,诶,就是当前他的这个环境变量,有可能诶父子之间它的这个环境变量是获取不到它的生效的作用范围是不一样的啊,就是有可能我们在这个子she里边啊,操作了一些东西,结果操作完了之后呢,你会发现它影响不到我们副she里面,那这个怎么办呢?诶,那我干脆就不要再嵌套了,直接用一个S或者点命令,让它就在当前的这个同一个环境里面执行,那最终所有的。我们执行的内容就全部生效了啊,所以有同学如果要是对Linux修改这个配置文件啊,一些环境变量有所了解的话,大家可能知道有时候去更改一些,比如说这个。点。
16:01
就当前的一些配置文件改了之后,如果改了环境变量,当前发现它没有及时生效怎么办呢?哎,那往往就直接S。一下,然后直接去执行一下啊,刚刚修改过的一些初始化的文件啊,那然后接下来你会发现啊,所有的环境变量就都已经直接生效了。啊,所以这是关于执行脚脚本的不同的方法,也是给大家做了一些额外的扩展,那一般情况呢,我们其实啊,只要是知道前两种方法,特别是呃,只要是知道这个第二种方法啊,我们有了可执行权限之后,直接去调用,直接去执行就行了。所以脚本其实还是非常简单的。
我来说两句