00:00
好,上一节呢,我们介绍了系统函数的用法啊,那我们会发现所谓系统函数本质上来讲,其实就是Linux shell给我们提供的一些命令啊,那如果说我们想在脚本里边想要去使用这些命令,或者说调用系统函数的话,那就是直接用一个Dollar符加上小括号里边去写我们想要调用的命令就可以了啊,我们管这个叫做命令替换,可以把它看成是系统函数的调用方式。那我们知道在写脚本的过程当中呢,有一些可能功能就是系统函数现成的啊,直接调就可以了,有一些呢就需要去自己定义了,那怎么样去做自定义的函数的实现呢?我们来看一下自定义函数的基本语法。这个其实也非常简单,我们看它的语法就是前面一个方式,然后呢,后面跟着当前的函数名称方式内,然后再加上一个小括号,后边跟着的就是一个花括号。画括号里边当然就是函数体了,具体要执行的操作一步一步往下写,最后可以有一个return返回值。
01:06
哎,这里我们会发现啊,很多都用这个方括号括起来,这个是表示不是说写的时候要加方括号啊,是说这里的这一部分内容是可选的,可有可无,比如说前面这个function本身这个可以不写,因为我们知道你这里既然定义函数嘛,那把这个函数定义出来就行了,至于说是不是这个function,一目了然,你后面有花括号,这肯定就是function,那还有就是这里的小括号也可以省略。最后还有就是return这个返回语句也可以省略啊,那这个返回语句可以省略,这个还是可以比较容易理解的啊,就是有时候我们可能执行完操作就行了,不需要有任何的返回值,哎,所以它它是可以省略的,那前面这个小括号,我们一般大部分编程语言里边啊,这个小括号显然里边是要写参数列表的,那如果说把这个省了之后,我们的参数列表到哪去写呢?你所有的行参在哪里去定义呢?
02:02
这里需要注意的是,当前我们自定义函数的时候啊,给它传入的参数,这些行参不需要去定义。那默认这里边的行参是什么呢?其实我们回忆的话,之前我们做脚本去执行调用的时候,所有给脚本传入的参数都是以未知参数DOLLAR1 dollar2这些东西来获取的嘛,所以现在的函数它的行参也是这样。那就是你这里形成不用专门定义啊,在里边直接用DOLLAR1就表示我当前调用这个函数的时候传入的第一个参数,用DOLLAR2就表示调用函数的时候传入的第二个参数。诶,所以从这一点我们也可以发现啊,当前对于函数的使用真的是就跟脚本是一样的啊,前面我们也说过了,脚本可以看成是一种重量级的复杂化的函数,函数就是一个轻量级的更加灵活的脚本,它的使用规则都是完全一样的啊,参数的话就用这个位置参数来表示,那这里的返回值那我们就想到了,哎,之前我们说脚本执行的返回值是什么呢?
03:07
是Dollar问号。哎,所以这里边我们需要注意啊,那当前它的这个返回值是不是也用Dollar问号去获取呢?诶,是的,如果说我们真要平常啊,直接去获取它的返回值的话,就是直接用Dollar问号就可以,你这里写了return,那return这个值用Dollar问号就可以获取到。这是基本的一个使用的方式,在自定义函数使用的过程当中呢,我们还得需要注意一些,注意一些要点啊,这个就跟我们平常其他的一些高级编程语言还是有所不同。首先我们需要注意就是。在Linux shell里边,在调用函数之前,必须先要把函数声明出来。哎,这个也很好理解啊,因为我们知道当前Excel是一个脚本语言,它是一边解释一边执行的,当然就是从上到下逐行解释,你假如说在上面啊,还没有声明函数的地方,就已经在调用这个函数了,那当然他就不知道这是怎么回事了,诶它不像我们这个C或者Java这些。
04:07
编译型的语言啊,一开始我们有编译器,可以完整的先做一个编译,所以必须按照顺序。调用之前先要把它声明出来,这是第一点。然后第二点呢,就是关于我们这个函数返回值的一个说明,我们说当前跟脚本的返回值获取一样,必须使用Dollar问号这个系统变量来获取我们的返回值啊,那我们我们就会发现,那如果说这里边加了这个return的话,那知道啊,Return什么我就获取什么,那如果不加return,它返回的是什么呢?呃,不加return的话,返回的就是我们函数题里边最后一句命令最后执行的结果,哎,那我们提到这儿的话就会想到啊,之前我们说这个Dollar问号,这个返回值,它其实并不是我们真正意义上想返回什么就能返回什么的,它返回的其实是我们啊,就是脚本执行或者说一句命令执行的。
05:02
返回结果码,结果代码。那个码呢,就是如果是零的话,表示它执行成功,如果是哎,其他的数字啊,一啊表示执行错误,还有一些其他的额外数字啊,一般就是一到255。所以这里边的返回其实也是有限制,如果说我们这里边获取这个Dollar问号的话,你会发现它的值只能是零到255,而且只能是整数值,不能返回别的。所以这里边它其实是有局限的啊啊,那具体使用的过程当中,我们会想到,哎,那要这样的话,我想返回别的东西怎么办呢?啊,后面我们可以举具体的事例来看一看到底怎么用。呃,那我们还是举之前那个例子吧,我们之前不是做了一个a.SH这样一个两数求和的脚本吗?哎,我们说函数可以看成是一个轻量级的脚本,那我们就把这个两处求和的脚本再用一个函数来做一个包装实现啊,啊,当然了,我们可以更改一下,就不要直接在脚本外面去传入当前的参数了啊,当前要加的那两个数加数,我们可以直接在命令行里边做一个输入,就是用readid啊去读取控制台的输入,接下来我们在脚本里面去做一个实现。
06:18
啊,那这里面我们可以创建一个新的脚本,主要是测试这个函数的功能,所以就fun test,然后点SH先把它创建出来,然后我们要写上当前的头井号,叹号并BA。然后接下来首先就是要定义一个函数了,方式,呃,一般约定俗成还是把这个写出来啊,尽管可以省略,但是写出来之后。代码的可读性就会更高,我们一看就知道当前声明的是一个函数,哎,那我们直接就叫做A。加一个小括号,然后花括号括起来,在文档里边,我们这个花括号是放在下一行啊,回车过来之后去显示的,我们直接跟在后面,其实也是一样的啊,这个没有关系啊,这个位置没有关系,所以接下来。
07:02
我们在下一行开始写当前的函数题,我们要做两个数的叠加。当前的行参我们说了其实就是DOLLAR1和DOLLAR2。哎,所以其实就是他们俩做一个加法啊,那如果要做相加运算的话,很明显现在是得用Dollar。中括号,把它们括起来,这是我们的运算符的表达啊,得到的结果呢,我们再付给一个另外的变量,比如说我们就叫做S。哎,那这样的话,接下来就可以在控制台eo一下,当前这个值到底是什么了啊,我们可以再输出一个啊,比方说和冒号是多少,后面跟上到S就可以了。这只是我们对于函数的定义啊,这个就定义完了,那具体调用执行,那后面还得有具体操作了啊,中间我们空一行主要是为了显示的好好看一点啊,这个不空行也可以,那接下来呢,我们在执行的过程当中,你首先调用它得先输入对应的参数嘛,那这个参数从哪来呢?我们说是从当前的命令行的控制台去直接输入的,那是一个瑞。
08:05
Read的后面跟上一个显示的信息杠P,我们这里要啊,就是请输入第一个整数啊,我们是两个整数相加,后面呢,可以给一个当前的变量名称,我们就叫做A吧,这个其实整体来讲是非常简单的啊,然后接下来。我们可以直接把它做一个复制,然后接下来再输入第二个整数,第二个整数把它的变量名称叫做B。那接下来当然就是一行非常简单的调用啊,直接调用这个函数怎么调呢?ADD,那参数怎么传呢?啊,这里边DOLLAR1DOLLAR2是行参嘛,它的实参就像我们脚本传入参数的时候一样,后面空格啊,调用脚本的时候也是这样吧,我们后面空格,然后把Dollar a和Dollar BA和B的值传进去就可以了。这就是我们整个调用函数的过程啊,其实非常简单,接下来我们直接保存退出。
09:03
同样,还是把当前的脚本增加一个可执行的权限。然后接下来执行脚本,那现在就会有一个交互式的提醒啊,输入第一个整数,比方说我们给一个随便给一个35,然后给一个67,好,我们看到和是102,这样的话就得到了最终的显示输出。这个过程非常的简单,那大家可能会发现这里有一点问题,就是我们这个参数现在已经解决了啊,就是当前实参传入的时候,我们使用那个脚本的方式,空格调用函数后边加空格,然后传入13,那里边的行参呢,是是用这个未知参数DOLLAR1刀二来实现,那我们当前如果想要获取到它的返回值怎么办呢?诶,当前一个函数,它应该是有输入有输出嘛,输出是使用返回值的,我们这里呢,没有输出,相当于是直接把它在控制台,把这个结果啊,控制台直接打印出来了,哎,那我们知道如果这个时候你去获取Dollar问号的话,那应该是零啊,他已经执执行成功了吗?执行成功肯定就是零了,如果说这里我们想要真的去做一个。
10:09
结果的输出就是捕获到这个结果,在最后我们再做一个AO,能不能做到呢?不要在函数里边去输出到控制台,能不能做到呢?哎,可以的,我们可以试一下。这里,那就需要把这个eo。自然就想到了需要改成return。需要做一个return,这里需要注意的是,我们如果直接就这么写能行吗?哎,我们在这儿不是已经写完了吗?然后下边那自然就是。再去做一个echo当前的返回值。前面是调用,后面是返回值嘛,那就是Dollar问号,这就是前面调用ADD方法at函数的一个返回值啊,哎,那我们会想到这样能行吗?试一试,到外面去看一下。直接调用。输入来我们还是啊三十五六十七。我们看到报错了,他说我们这里边需要一个数字参数,为什么需要一个数字参数呢?哎,这就是我们说的啊,当前他这个return最后的结果是要给到这个Dollar问号,Dollar问号表示的是我们前面一条命令或者说脚本它执行的结果代码,这个结果代码只能是零到二五。
11:23
所以它不可能是字符串,只能是一个数字,哎,那所以这里我们就想到了,那你既然这么说的话,那我干脆就不要加这个和嘛,这个很简单对吧,把这个和去掉,然后在最后eo的时候,在这儿再加上这个和不就完了吗?好,我们把这个保存退出,然后接下来再来做一个执行。三十五六十七,哎,这个没问题,看起来这样就捕捉到了它的执行结果,然后得到正常的输出啊啊,但是又有另外一个问题,前面我们说了,当前return能够返回的值只有零到二五。哎,那我们当前这个整数相加,你这两个数比较小嘛,那假如说我们现在这个数比较大呢,哎,比方说我这里来一个156,然后再来一个237。
12:10
如果是它们俩做一个叠加会怎么样呢?不会报错,但是我们会发现加出来是错的,加出来一个137,这是为什么呢?啊,自然我们想到了它最大是255,哎,那肯定你如果超出去之后,它就又绕回去了嘛,哎,所以最多它只能输出一个零到255的值。那这个就太受限了,我们一个函数,呃,连最后这个一个简单的加法超出255都没没办法显示了,这还能干什么事呢?呃,不要着急,我们有别的解决方案。我们进入到脚本里面来看,因为这里如果是函数直接return返回的话,那就只能捕获到一个零到255的值,然后传递给Dollar问号,哎,那我们就想到,那我干脆就不要用Dollar问号去获取这个值了,就不要return了,哎,那怎么做呢?这里边有一个小技巧。
13:03
我们直接把它改掉。这里我们就不要return,而是直接去echo当前的Dollar s,哎,那我们知道AO到S是要做一个打印输出,诶,那这个直接打印输出了,这也不等于返回呀,那怎么办呢?我们回忆一下之前系统函数的调用方式,那是不是可以在调用之后我们做一个命令替换,然后可以把它的值返回的值再去付给另外一个变量啊,哎,那所以接下来呢,我们就可以使用当时系统函数的这种调用方式啊,直接来一个萨,再定义一个函数,它就等于做一个命令替换。Dollar,然后里边是a Dollar a Dollar b,相当于把AB加起来之后得到的结果,哎,这个得到结果是什么呢?就是我最后这一行它的结果,那我们eo这个值的话,当然得到是什么就是什么嘛,现在你不要看它的Dollar问号,肯定是执行是零嘛,执行成功了,但是我不看Dollar问号,我要看的就是当前这个值,然后把它做命令替换之后获取到再付给桑。
14:11
所以接下来我们就可以在下边这里直接打印当前Dollar sum的值了,所以整体来讲这个还是非常简单的一个操作啊啊,那当然了,这里你甚至可以就是得到这个结果,你可以不直接输出,你还可以做进一步的计算,那比方说我们这里不是给这个和是多少啊,我们直接给一个,呃。和的平方是多少?这个也是可以的,肯定没有问题嘛,那后边只不过就是要做另外一存计算Dollar sum,再去乘以Dollar some,这样不就完完事了吗?哎,那所以这里面我们可以。需要注意啊,做了计算之后,当然是要使用Dollar加中括号,把它要括起来的,哎,这个肯定是还是要继续做,做一个这样操作的啊,哎,这样就可以实现我们使用之前获取到函数的返回值,然后把它用起来,再做进一步的计算啊啊,那为了看的清楚一点,我们在这儿还是把对应的。
15:07
和还是做一个输出啊。当前我们就只输出一个Dollar s就可以了,Dollar就可以了。和是这么多好,接下来我们做一个保存退出好。那我们现在156 237,哎,我们可以看到现在就正常的叠加出了它的和是三百九十九十三,而和的平方,哎,那就是一个很大的数字了。这就是我们关于自定义函数的一些用法,涉及到一些小技巧,我们可以在具体的实践过程当中自己去体会。
我来说两句