文章目录

  • 前言
  • 管理函数
  • 定义函数
  • 交互式环境调用函数
  • 查看函数
  • 删除函数
  • 脚本中的函数
  • 定义及使用函数
  • 使用函数文件
  • 环境函数
  • 示例
  • 总结
  • 友情链接


前言


函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分 函数和shell程序比较相似,区别在于Shell程序在子Shell中运行,而Shell函数在当前Shell中运行。因此在当前Shell中,函数可对shell中变量进行修改


管理函数

函数由两部分组成:函数名和函数体
帮助参看:help function

定义函数

#语法一:
func_name (){
 ...函数体...
 }
#语法二:
function func_name {
 ...函数体...
 } 
#语法三:
function func_name () {
 ...函数体...
 }
[root@mdns zaishu]#hi() {
> echo "hello hi"
> }
[root@mdns zaishu]#hi
hello hi

交互式环境调用函数

交互式环境下定义和使用函数

[root@zaishu sh]# hello() {
> echo "helloworld"
> }
[root@zaishu sh]# hello
helloworld
[root@zaishu sh]# function hi {
> echo "hellworld"
> }
[root@zaishu sh]# hi
hellworld
[root@zaishu sh]# function nihao() {
> echo "hellworld"
> }
[root@zaishu sh]# nihao
hellworld

查看函数

#查看当前已定义的函数名
declare -F
#查看当前已定义的函数定义
declare -f
#查看指定当前已定义的函数名
declare -f func_name
#查看当前已定义的函数名定义
declare -F func_name
[root@zaishu sh]# declare -F
declare -f __HOSTNAME
declare -f __SIZE
declare -f __SLAVEURL
declare -f __VOLNAME
....
declare -f __expand_tilde_by_ref
[root@zaishu sh]# declare -f hi
hi () 
{ 
    echo "hellworld"
}
[root@zaishu sh]# declare -F nihao
nihao

删除函数

unset func_name
[root@zaishu sh]# unset nihao
[root@zaishu sh]# declare -F nihao
[root@zaishu sh]#

脚本中的函数

定义及使用函数

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

#! /bin/bash
# for example: add 1 2
add(){
  a=$1;
  b=$2;
  z=$((a+b));
  echo "The sum is $z";
}
add $1 $2
[root@zaishu sh]# ./add_num.sh 1 2
The sum is 3
#!/bin/bash
fun1() {
    echo "this is fun1()"
}

fun2() {
    echo "this is fun2()"
}

fun3() {
    echo "this is fun3()"
}

fun4() {
    echo "this is fun4()"
}

fun5() {
    echo "this is fun4()"
}

fun6() {
    echo "this is fun4()"
}

PS3="请选择相应的函数编号(1-7): "
MENU=(
    "1:函数fun1"
    "2:函数fun2" 
    "3:函数fun3"
    "4:函数fun4"
    "5:函数fun5"
    "6:函数fun6"
    "7:退出"
)

select C in ${MENU[*]}; do
    case $REPLY in
        1) 
        fun1
        ;;
        2) 
        fun2
        ;;
        3) 
        fun3
        ;;
        4) 
        fun4
        ;;
        5) 
        fun5
        ;;
        6) 
        fun6
        ;;
        7) 
        break 
        ;;
        *) echo "请输出1-7"
        ;;
    esac
done
[root@mdns zaishu]# ./hello.sh 
1) 1:函数fun1  3) 3:函数fun3  5) 5:函数fun5  7) 7:退出
2) 2:函数fun2  4) 4:函数fun4  6) 6:函数fun6
请选择相应的函数(1-7): 1
this is fun1()
请选择相应的函数(1-7): 3
this is fun3()
请选择相应的函数(1-7): 8
请输出1-7
请选择相应的函数(1-7): 7
[root@mdns zaishu]#

使用函数文件

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

  1. 创建函数文件,只存放函数的定义
  2. 在shell脚本或交互式shell中调用函数文件,格式如下:
. filename 或 source   filename
[root@mdns zaishu]#cat funs 
#!/bin/bash
fun1(){
    echo "this is fun1"
}
fun2(){
    echo "this is fun2"
}
[root@mdns zaishu]#source funs # . funs
[root@mdns zaishu]#fun1 
this is fun1
[root@mdns zaishu]#fun2 
this is fun2
[root@mdns zaishu]#declare -f fun1
fun1 () 
{ 
    echo "this is fun1"
}
[root@mdns zaishu]#declare -f fun2
fun2 () 
{ 
    echo "this is fun2"
}

环境函数

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

export -f function_name 
declare -xf function_name
定义环境变量:declare -x 变量名
修改环境变量为本地变量: declare +x 环境变量名

示例

查看环境函数:

export -f
 declare -xf

定义普通函数

[root@mdns zaishu]#hi() {
> echo "hello hi"
> }
[root@mdns zaishu]#hi
hello hi
[root@mdns zaishu]#declare -f
hi () 
{ 
    echo "hello hi"
}


[root@mdns zaishu]#declare -F
declare -f hi
[root@mdns zaishu]#declare -xf hi
[root@mdns zaishu]#export -f
hi () 
{ 
    echo "hello hi"
}
declare -fx hi

总结

shell当中的函数详解,管理函数,定义函数,交互式环境调用函数,查看删除函数,脚本中的函数,定义和使用函数文件,环境函数和示例。