shell之函数和数组

目录

一、shell函数

1、函数的基本格式

2、函数的返回值return

3、函数的调用

①调用例子

②相同函数名的调用及两个函数里的变量调用

③函数调用顺序

4、函数的作用范围

5、函数的参数

①调用函数时传入2个参数

②用户输入2个参数

6、函数的递归调用

①使用递归计算阶乘

② 用for计算阶乘

7、函数库

二、shell的数组

1、数组的分类

2、数组的定义

①直接把要加入数组的元素用小括号括起来,中间用空格分开

②精确的给每一个下表索引定义一个值加入数组,索引数字可以不连续

③先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组

④根据下表定义

3、数组的长度和元素

①数组中所有元素及总数(长度)

②根据下标获取数组元素的内容

4、数组的遍历

5、数组元素的切片(提取)

6、数组元素的临时替换

7、数组的删除

三、冒泡排序

四、总结


一、shell函数

1、函数的基本格式

[function] 函数名() {
  命令序列
[return x]                           #使用return或exit可以显示的结束函数 
}

或者

#也可以省略掉[function],它表示该函数的功能

函数名() {                            #函数名后面()是没有内容的
命令序列                             #我们执行的命令内容放在{}里面
}

函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用。定义的时候哪怕出现语法错误也没关系,不调用就不会报错,当然我们写函数最终目的还是为了调用,为了实现某个功能块。

2、函数的返回值return

表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值

使用原则:

函数一结束就取返回值,因为$?变量值返回执行的最后一条命令的退出状态码

退出状态码必须0~255,超出时值将为取余256(例如:返回码为300,那么将300%256)

shell之函数和数组_第1张图片

3、函数的调用

直接在脚本里定义函数的代码块写函数名即可完成调用 

①调用例子

shell之函数和数组_第2张图片

②相同函数名的调用及两个函数里的变量调用

函数名必须是唯一的,如果先定义了一个,再用同样的名称定义第二个,那么第二个会覆盖第一个的功能,所以这里一定要注意不要重名

2个函数里同一个变量的值不一样,第二个变量值会覆盖第一个值 

shell之函数和数组_第3张图片

③函数调用顺序

 调用函数之前,必须先进行定义!就是说函数的调用必须在函数的后面

shell之函数和数组_第4张图片

4、函数的作用范围

       在 Shell 脚本中函数的执行并不会开启一个新的子 shell,而是仅在当前定义的 shell 环境中有效。如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。

shell脚本中变量默认全局有效

local命令:将变量限定在函数内部使用

函数内与函数外定义相同变量

shell之函数和数组_第5张图片

hanshu2函数内部使用了local命令设置变量a,其作用是将变量a限定在函数内部,hanshu2函数外部同样定义了变量a,内部变量a和全局变量互不影响。脚本执行先调用了函数hanshu2,函数内部变量a为7,所以输出7,调完函数,变量a赋值为10,所以有输出10

5、函数的参数

       在shell中,调用函数时可以向其传递参数,在函数体内部,通过$n的形式来获取参数值,例如,$1表示第一个参数,$2表示第二个参数,就是使用位置参数来实现参数传递。

①调用函数时传入2个参数

shell之函数和数组_第6张图片

②用户输入2个参数

shell之函数和数组_第7张图片

6、函数的递归调用

①使用递归计算阶乘

shell之函数和数组_第8张图片

② 用for计算阶乘

shell之函数和数组_第9张图片

7、函数库

 简单的来说,就是在编辑一个脚本,其中定义多个函数,在通过其他脚本来使用。

shell之函数和数组_第10张图片

二、shell的数组

数组是Shell的⼀种特殊变量,是⼀组数据的集合,⾥⾯的每个数据被称为⼀个数组元素。

当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。数组中可以存放多个值。初始化时不需要定义数组大小(与 PHP 类似)。与大部分编程语言类似,数组元素的下标由 0 开始。Shell 数组用括号来表示,元素用"空格"符号分割开。

1、数组的分类

普通数组:不需要声明直接定义,下标索引只能是整数

关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串

数组包括的数据类型: 数值类型 字符类型: 使用“ ” 或 ‘ ’ 定义

2、数组的定义

①直接把要加入数组的元素用小括号括起来,中间用空格分开

格式: 数组名=(value0 value1 value2)

例如:num=(10 20 30 40)

②精确的给每一个下表索引定义一个值加入数组,索引数字可以不连续

格式:数组名=([0]=value [1]=value [2]=value...)

例如:num=([0]=10 [1]=20 [2]=30 [3]=40)

③先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组

格式:  变量= "value0 value1 value2 value3"

             数组=($列表名)

例如:
            list= "10 20 30 40"
            num=($list)

④根据下表定义

格式: 数组名[0]="value" 
            数组名[1]="value" 
            数组名[2]="value" 

例如: num[0]="10"    num[1]="20"    num[2]="30"

3、数组的长度和元素

定义数组最简单的办法就是:a=(10 20 30 40)

读取数组中的全部长度使用:echo ${#a[*/@]}
读取数组中的下标对应的元素长度: echo ${#a[下标]}
   
读取数组中的全部内容使用:echo ${a[*/@]}
读取数组中的下标对应的元素内容: echo ${a[下标]}

①数组中所有元素及总数(长度)

数组长度可以通过  数组名[*] "或"    数组名[@]"  来 获取。

②根据下标获取数组元素的内容

根据下标获取数组中单个元素的长度

4、数组的遍历

使用for循环。遍历输出数组中的每一个元素

shell之函数和数组_第11张图片

5、数组元素的切片(提取)

${a[*]:n:m} 提取从索引下标n开始的m个元素

${a[*]:n} 提取从索引下标n开始的所有元素

${!a[*]} 查看数组有哪些下标

6、数组元素的临时替换

${a[*]/n/m} 将a数组中的元素中有n字符串的替换为m字符串,如果一个元素有多个n字符串只替换一次

7、数组的删除

a=(45 10 100 1000 20 30) 
unset a    //删除数组 
a=(45 10 100 1000 20 30) 
unset a[3]   //删除数组a第3个元素

三、冒泡排序

类似气泡上涌的动作,会将数据的数组从小到大或者从大到小不断的向前移动

基本思想
冒泡排序的基本思想就是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。

算法思路
冒泡算法有双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少

四、总结

函数
函数的作用: 就是实现一个功能块,然后进行调用,函数名不能重复
函数中可以使用return进行返回一个状态码 ,可以根据状态码查看函数的运行效果
函数中定义变量,可以使用local关键字进行定义成局部变量 ,局部变量只能在函数中使用,不会与shell环境中的其它相同变量名冲突
函数的参数可以使用位置参数进行传参 ,在调用时可以直接输入位置参数的值。也可以调用时再定义位置变量,然后通过获取用户输入的值来传给函数中的变量。

数组
数组的定义方式有多种, 最常见的就是函数名=(元素1 元素2 元素3)

查看数组的长度: ${#数组名[*或@]},查看函数的元素内容: ${数组名[*或@]}

数组中元素的赋值,最常用的赋值为: 数组名[下标]=元素值

数组的切片:切片的意思就是将数组元素内容按照设定的内容进行输出

格式:echo ${数组名[*]:下标:需要打印的几个元素值}  
echo ${a[0]}

例如:将数组内容的第二个元素开始的3个元素输出
echo ${num[*]:1:3}
数组的替换:只是在输出的时候进行替换 (注意:在替换的时候,它找到内容是数组元素中的内容)

格式:echo ${a[*]/匹配的内容/替换后的内容} (仅替换每个元素的第一个匹配项)
例如:将输入中的内容3换成10
echo ${num[*]/3/10}

你可能感兴趣的:(javascript,前端,servlet)