一、定义函数

1、语法

#语法一:

func_name (){
...函数体...
}
#

语法二:

function func_name {
...函数体...
}
#语法三:

function func_name () {
...函数体...
}

 在函数中定义本地变量,local  name=NAME

2、查看定义的函数

#查看当前已定义的函数名

declare -F#查看当前已定义的函数定义

declare -f#查看指定当前已定义的函数名

declare -f func_name#查看当前已定义的函数名定义

declare -F func_name

3、删除函数

unset func_name

4、函数调用


函数的调用方式

1可在交互式环境下定义函数

2可将函数放在脚本文件中作为脚本的一部分

3可放在只包含函数的单独文件中

调用:函数只用被调用才会执行,通过定义的函数名去定义函数,函数名出现的地方会被自动替换为函数代码

函数的生命周期:被调用时创建,返回时终止。

5、交互式调用函数

范例:

[root@centos8 ~]#dir() {

ls -l

}

[root@centos8 ~]#dir

total 4 -rw-------. 1 root root 1559 Nov 7 19:33 anaconda-ks.cfg

6、在脚本中定义并使用函数

函数在使用前必须定义,因此应将函数定义放在脚本开始部分,直至shell首次发现它后才能使用,调用函数仅使用其函数名即可

范例:

disable_selinux(){

sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

setenforce 0

echo "SElinux已禁用已生效"}

disable_firewall(){

systemctl disable --now firewalld &> /dev/null

echo "防火墙已禁用"}

set_ps1() {

echo "PS1='\[\e[1;35m\][\u@\h \W]\\$\[\e[0m\]'" > /etc/profile.d/reset.sh

echo "提示符已修改成功,请重新登录生效"}

set_eth(){

sed -i.bak '/GRUB_CMDLINE_LINUX=/s#"$# net.ifnames=0"#' /etc/default/grub

grub2-mkconfig -o /boot/grub2/grub.cfg &> /dev/null

echo "网络名称已修改成功,请重新启动才能生效"}

PS3="请选择相应的编号(1-6): "MENU='禁用SELinux

关防火墙
修改提示符
修改网卡名
以上全实现
退出
'select M in $MENU ;do

case $REPLY in1)

disable_selinux

;;

2)

disable_firewall

;;

3)

set_ps1

;;

4)

set_eth

;;

5)

disable_selinux

disable_firewall

set_ps1

set_eth

;;

6)

break

;;

*)

echo "请输入正确的数字"

esca

done

7、使用函数文件

可以将经常使用的函数存入一个单独的函数文件,然后将函数文件载入shell,再进行调用函数文件名可任意选取,但最好与相关任务有某种联系,例如:functions一旦函数文件载入shell,就可以在命令行或脚本中调用函数。可以使用delcare -f 或set 命令查看所有定义的函数,其输出列表包括已经载入shell的所有函数,若要改动函数,首先用unset命令从shell中删除函数。改动完毕后,再重新载入此文件

实现函数文件的过程:

1. 创建函数文件,只存放函数的定义

2. 在shell脚本或交互式shell中调用函数文件,格式如下

. filename 或 source filename

范例:

[root@centos8 ~]#cat functions

#!/bin/bash

#functions

hello(){

echo Run hello Function

}

hello2(){

echo Run hello2 Function

}

[root@centos8 ~]#. functions

[root@centos8 ~]#hello

Run hello Function

[root@centos8 ~]#hello2

Run hello2 Function

[root@centos8 ~]#declare -f hello hello2

hello ()

{

echo Run hello Function

}

hello2 ()

{

echo Run hello2 Function

}

8、函数返回值

函数的执行结果返回值:

使用echo等命令进行输出

函数体中调用命令的输出结果

函数的退出状态码:

默认取决于函数中执行的最后一条命令的退出状态码

自定义退出状态码,其格式为:

return

return 0

return 1-255

从函数中返回,用最后状态命令决定返回值

无错误返回

有错误返回

9、环境函数

类拟于环境变量,也可以定义环境函数,使子进程也可使用父进程定义的函数

定义环境函数:

export -f function_name

declare -xf function_name

10、函数变量

变量作用域:

普通变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程;因此,本地变量的作用

范围是当前shell脚本程序文件,包括脚本中的函数

环境变量:当前shell和子shell有效

本地变量:函数的生命周期;函数结束时变量被自动销毁

注意:

如果函数中定义了普通变量,且名称和局部变量相同,则使用本地变量

由于普通变量和局部变量会冲突,建议在函数中只使用本地变量