shell脚本中的函数与数组

204 阅读4分钟

shell脚本中的函数

一、函数的介绍

在编写脚本时,有些脚本可以反复使用,可以调用函数来解决。

语句块定义成函数约等于别名。

1.函数的作用

  • 使用函数可以避免代码重复;

  • 使用函数可以将一个大的工程分割为若干小的功能模块,代码的可读性更强。

2.函数的使用方法

  • 定义函数

  • 再引用函数

3.函数的定义

第一种格式

function 函数名 {

命令序列;

}

image.png

第二种格式

函数名() { 

命令序列 

}

image.png

第三种格式

unction func_name () {

命令序列

}

注意

  • 直接写函数中调用函数,直接写函数名
  • 同名函数,后一个生效
  • 调用函数一定要先定义
  • 只要先定义了调用的函数,与其他函数定义顺序无关
  • 函数是将脚本定义成一个命令,调用命令时记得使用 命令,调用结果。

4.查看与删除函数

查看函数的列表:declare -F

image.png

查看函数的具体命令:declare -f

image.png

删除函数:unset 函数名

image.png

二、函数值返回值 return 、echo

获得函数返回值的两种方式

  1. return表示退出函数并返1. 回一个退出值,脚本中可以用$?变量显示该值。
  2. 在函数体中用 echo 输出返回值。并在函数体外使用变量赋值后,可再进一步对函数的返回值进行加工操作。

使用原则

  • 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码;
  • 退出码必须是0-255,超出的值将为除以256取余。

image.png

image.png

问题:怎么解决超过255?

答:因为return的返回值的范围是0-255,超过部分除以256取余,得不到我们想要的结果,此时可以直接在函数体中使用echo命令。

image.png

image.png

三、函数的传参

示例1

image.png

image.png

示例2

image.png

image.png

示例3

image.png

image.png

四、函数的变量范围

  • 函数在shell脚本中仅在当前的shell环境中有效;

  • shell脚本中函数的变量默认全局有效;

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

image.png

shell脚本中的数组

一、数组的介绍

  • 数组就是把n个变量或者字符内容集合起来用一个名字命名,接着用编号对它们区分的元素集合,这个名字叫数组名;

  • 区分不同内容的是编号,叫数组下标;

  • 有了数组,就能用一样的名字引用不同的变量或者变量值,并通过数字来识别它们;

  • 使用数组也能使代码缩短简洁等好处。

  • 使用数组也能使代码缩短简洁等好处

例如:

将班级里的各位同学的姓名存入到变量中,需要每一个学生对应一个变量,100个学生需要 100个变量,不好维护 name1=张三 name2=李四 ...... 我们可以只用一个变量 将所有学生的都存入student变量中, 将来会取用某一个的学生时,需要用到编号,专业的称呼,下标。数组里的东西都是有相同属性的元素 数组只有一个名字,减少了变量的个数。

  • 变量:存储单个元素的内存空间;

  • 数组:存储多个元素的连续的内存空间,相当于多个变量的集合。

二、数组的定义

1.数组的类型

  • 普通数组可以不事先声明,直接使用 declare -a ARRAY_NAME

  • 关联数组必须先声明,再使用 declare -A ARRAY_NAME

2.数组的定义方法

数组名=(value0 value1 value2...)

a=(10 20 30 40 50)
数组名=([0]=value [1]=value [2]value)

b=([0]=10 [1]=20 [2]=30)
列表名="value0 value1 value2..."

数组名=($列表名)

b="1 2 3 4 5 6" a=($b)
数组名[0]="value"

数组名[1]="value"

数组名[2]="value"

a[0]=10

a[1]=20

a[3]=30

三、关联索引

1.下标可以是文字:称为关联索引值对的关系是一个公司的的属性。

公司名对应的下标为 name

总经理对应的下标为 ceo

所在地对应的下标为 南京

注册资金对应的下标为 money

2.下标可以不连续,称为稀疏格式 定义关联数组,一定要先申明。

四、数组相关命令

1.数组包括的数据类型

●数值类型

●字符类型:

使用" "或' '定义

获取数组长度

a=(1 2 3 4 5) 
echo ${#a[*]} //显示下标总个数 
echo ${#a[@]} //显示下标总个数