shell脚本中函数与数组

目录

一、函数

二、数组

冒泡排序

我们都知道,学习一门语言,无论如何也无法脱离函数与数组,这两个东西的应用会让敲代码变得更简单巧妙,现在我们来学习shell脚本中的函数与数组

一、函数

学习函数之前,我们先要知道,什么是函数呢?是数学里面的那种y=2x+3z吗?从某种意义上来说,是有一部分相似的,我们看到 y=lg100的时候,是不是第一反应就可以得出,y=2?为什么我们会立马就算出y=2呢?后面那一坨明明也不是什么加减乘除,因为在最初学习log函数定义的时候,我们就知道,它是类似于进行一个开根运算,我们将其定义印在了脑子里,所以看到数值的时候直接将数值代入这个公式,就可以运算出结果了。

脚本中的函数差不多也是这个意思(当然java c 等语言里也一样)。我们事先编辑写好一个或一大串操作,记住了这一操作是做了怎样的一个事情后,我们给它定义一个名字,这个名字就是这个函数的函数名。接下来我们写脚本的时候,如果需要执行那一大串操作,我们可以直接调用函数就可以了。举个例子,我事先编写好求圆、梯形、长方形等图形的面积计算方式,只要输入半径或者边长就可以得出结果,接下来我计算一堆图形的总面积时就不需要一个一个单独列式计算了,直接调用n次函数,最终求和就可以了。

函数的定义防方式(规范)有两种,分别是

function 函数名 {

要执行的操作

}

还有一种就是

函数名 () {

要执行的操作

}

要想知道函数有没有成功的执行,可以在 } 结束前,加上 return 返回值,随便定义多少,只要是0-255之间的整数就可以了,执行完成后可用$?进行查看,一般情况下,0代表成功,1代表失败。

接下来讲函数的使用还有一些注意事项

我现在需要写一个函数,调用的时候就统计某某目录下有多少文件

我们可以直接定义函数,比如TJ,然后将需要执行的操作写在下面,最后脚本结束前再调用一下即可

来看一下运行结果

这个我只是演示了一下函数最基础的使用方法

函数在使用的时候,有几个注意事项

1.调用函数之前需要先定义,很简单一个道理,你不定义它,系统怎么知道如何使用它呢?

2.函数名必须是唯一,如果先定义了一个,比如LOG,你之后再定义一个LOG,那么第二个会覆盖第一个,调用的时候,就只执行后定义的那个了

3.如果一个定义的函数1里,需要用到另一个函数2,那么函数2必须在定义函数1之前先定义一下,就是你想使用一个锤子来建房子,你得先造一个锤子,然后再用锤子建房子

4.定义的函数只有当前shell脚本生效,变量也是当前的shell脚本生效,如果变量过多,函数里确实需要用到重复的变量,因为这个变量简单易理解,那么可以用local来定义这变量,使之只在这个函数里生效,用法为 local [变量名]

5.函数中也有位置变量这一说法,用法和shell脚本在Linux系统中用法差不多,调用函数时在函数后面输入 $1 $2 $3 .......的值就可以了,然后函数体内可以直接 通过 $1 $2 等来引用

二、数组

然后我们来说一下数组,数组像什么呢?硬要在已有数学模型中找一个类似的,那只能说是数列了,只不过这个数列在没有for 或者 while 循环定义的时候,它一般是有范围的,而且这数列是被定义好的,举个例子 a = (10 22 668 355 32  12)这就是一个数组,含有六个元素的数组。

有的时候一个一个将数字或者字符输入进去比较麻烦,特别是在要重复反复输入相同的数字或字符时,这时候我们就可以定义一个数组,将其一次性输入进去。

刚刚举例的时候,就是数组的第一种定义方法

还有另外几种是

数组名=([0]=55 [1]=66 [2]=77 [3]=88),因为计算机的数字都是从0开始,数组也不例外,我们认为的第一个,事实上是数组的0号位

还有一种其实大同小异

先定义一个list = "x y z a b c"

然后  数组名= ($list)                     当然,不一定是list,随便定义

最后一种就比较麻烦了,将每一个位置的元素一个一个定义

数组名[0]="10"

数组名[1]="20"

数组名[2]="30" 

数组名[3]="66"

定义完了数组后,我们可以通过如下方式来查看数组的内容以及长度(涂黑的地方忽略,我敲错了)

数组定义完成后发现有什么不对的地方也是可以进行删除或者修改的

unset 数组名   即可删除该数组

如果要删除数组里的某个元素,那就  unset  数组名[元素的位置]

修改也是可以的,比如我定义了一个数组

a=(1 2 3 4 5)

echo ${a[@]/3/55}

这样,3 就变成了 55,这个只是临时修改,要彻底修改的话需要重新赋值

a=${arr[@]/3/55}

数组还可以进行元素切片,就是按照需求,特定的输出数组里的一些元素,假如我定义了一个数组

a=(1 2 3 4 5 6 7 8)

echo ${arr[]:2:3}    输出从第二个2元素开始的3个元素

结果是输出  3 4 5    ,怎么样和你想象的一样吗?

冒泡排序

最后,学完了数组和函数,用一道经典的排序题,来学以致用吧

给没学过的伙伴普及一下,什么是冒泡排序,假如有五个数,需要从大到小排序,那么就先第一个和第二个比,如果前者大于后者则互换位置,否则不变,然后第二个和第三个比,以此类推,第一轮会进行4次对比,最大的数此时已经在最右边;然后进行第二轮对比,同样的操作,此时第二大的数在右边第二个位置,以此类推,直至数组排序完成。整个过程就像水里的气泡一样,最大的数慢慢的浮到上面来。

冒泡排序的原理明白了,我们来编写代码

首先理清思路,给定一组数,首先输入一个数组,定义一个变量来代表这个数组的长度,然后加入一个for循环,代表对比轮数,里面再嵌套一个for循环,代表某一轮中对比的次数,然后如果前者大于后者需要将二者呼唤位置,此时需要设置一个临时变量temp,来存储他们的值,将后者的值存入temp,然后后者等于前者,前者等于temp,就完成调换。最后两个循环都结束后,输出排序后的数组

需要  read -a    将用户输入的数字分隔为数组元素

lt 传入数组的长度

i需要小于长度减一,如果i从1开始的话,直接小于数组长度就可以了,下一个for循环的 j 也是同理

看一下输出结果

到这里一道数组大题就完成了,如果能只看原理,然后完整的敲出来,说明基本的数组for循环之类的已经可以融会贯通了,脚本这一块还是原理简单,但是上手后却是另一个样子,还是要多练,熟能生巧

  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值