shell函数和数组

88 阅读3分钟

shell函数

Shell函数的概念

函数的数学表达式sin、cos、tan 其实只是定义好的计算公式,函数就是一个功能模块,在函数中写好需要执行的命令即可

函数的作用

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

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

函数使用方法:

  1. 定义函数
  2. 再引用函数

函数使用步骤

  1. 首先是定义函数
  2. 其次是调用函数(注意:若定义完成不调用则函数无效)
  3. 查看系统限制所有函数:declare -F
  4. 查看函数定义详细内容:declare -f 函数名
  5. 删除函数:unset 函数名

定义函数基本格式

格式1:
function  函数名 () {
函数内容
}

格式2:
function 函数名 {
函数内容
}

格式3:
函数名 () {
函数内容
} 

image.png

注意事项

  1. 直接写 函数中调用函数 直接写函数名
  2. 同名函数 后一个生效
  3. 调用函数一定要先定义
  4. 只要先定义了调用的 其他函数定义顺序无关

查看函数

[root@localhost ~]# declare -F
#函数列表
declare -f __HOSTNAME
declare -f __SIZE
declare -f __SLAVEURL
[root@localhost ~]# declare -f
#函数具体的定义

image.png

删除函数

unset func_name

image.png

函数的返回值

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

使用原则:

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

image.png

image.png

image.png

  1. 解决超过255的问题

image.png

image.png

函数的传参数

image.png

image.png

函数的作用范围

函数变量的作用范围:

  1. 函数在Shell脚本中仅在当前Shell环境中有效。(即定义和调用函数要在同一个shell环境中)
  2. 脚本中定义的变量,仅在当前shell环境中有效
  3. Shell脚本中变量默认全局有效。(即在整个脚本中都生效,并非是环境变量)
  4. 将变量限定在函数内部使用 local 命令。这样变量只在当前函数内有效,不影响脚本中的其他函数和变量。

实例一:

image.png

image.png

实例二:

image.png

函数的递归

递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。所以递归要有两个基本要素,结束条件与递推关系。

阶乘:

image.png

shell数组

数组分类

  1. 关联数组:必须声明才可以使用,命令:delare -A 数组名
  2. 普通数组:利用数字下标节约变量,可以不声明也可以声明,命令:delare -a 数组名

delare -a命令也可查看有哪些普通数组

定义数组方法

  1. 普通数组
数组名=(vlaue0  vlaue1  vlaue2  ...)
 
[root@localhost ~]#a=(10 20 30)    #定义数组a,值为10 20 30 
[root@localhost ~]#echo ${a[0]}    #输出数组a下标为0的元素
10
[root@localhost ~]#echo ${a[@]}    #输出数组a中所有的元素
10 20 30
[root@localhost ~]#echo ${a[*]}    #输出数组a中所有的元素
10 20 30
[root@localhost ~]#echo ${#a[@]}   #输出数组a中元素的个数
3
[root@localhost ~]#echo ${!a[@]}   #输出数组a中元素的下标
0 1 2
[root@localhost ~]#a[0]=100        #重新定义数组a下标为0的元素为100
[root@localhost ~]#echo ${a[0]}    #输出数组a中下标为0的元素
100
  1. 关联数组定义
delare -A  数组名   #声明数组
数组名[下标]=元素    #定义关联数组
 
[root@localhost ~]#declare -A f       #声明关联数组f
[root@zrsb  ~]#f[name]=pc1        #定义关联数组f下标name的元素为pc1
[root@localhost ~]#f[ip]=10.0.0.0     #定义关联数组f下标ip的元素为10.0.0.0
[root@localhost ~]#echo ${f[@]}       #输出关联数组f的所有元素值
zrsb 10.0.0.0
[root@localhost ~]#echo ${!f[@]}      #输出关联数组f中元素的所有下标
name ip