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


前言


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


管理函数

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

定义函数

#语法一:
func_name (){
 ...函数体...
 }
#语法二:
function func_name {
 ...函数体...
 } 
#语法三:
function func_name () {
 ...函数体...
 }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
[root@mdns zaishu]#hi() {
> echo "hello hi"
> }
[root@mdns zaishu]#hi
hello hi
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

交互式环境调用函数

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

[root@zaishu sh]# hello() {
> echo "helloworld"
> }
[root@zaishu sh]# hello
helloworld
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
[root@zaishu sh]# function hi {
> echo "hellworld"
> }
[root@zaishu sh]# hi
hellworld
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
[root@zaishu sh]# function nihao() {
> echo "hellworld"
> }
[root@zaishu sh]# nihao
hellworld
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

查看函数

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

删除函数

unset func_name
  • 1.
[root@zaishu sh]# unset nihao
[root@zaishu sh]# declare -F nihao
[root@zaishu sh]#
  • 1.
  • 2.
  • 3.

脚本中的函数

定义及使用函数

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

#! /bin/bash
# for example: add 1 2
add(){
  a=$1;
  b=$2;
  z=$((a+b));
  echo "The sum is $z";
}
add $1 $2
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
[root@zaishu sh]# ./add_num.sh 1 2
The sum is 3
  • 1.
  • 2.
#!/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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
[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]#
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

使用函数文件

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

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

环境函数

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

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

示例

查看环境函数:

export -f
 declare -xf
  • 1.
  • 2.

定义普通函数

[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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
[root@mdns zaishu]#declare -xf hi
[root@mdns zaishu]#export -f
hi () 
{ 
    echo "hello hi"
}
declare -fx hi
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

总结

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