函数介绍

函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程。

它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序 的一部分 。

函数和shell程序比较相似,区别在于:

Shell程序在子Shell中运行,而Shell函数在当前Shell中运行。

因此在当前Shell中,函数可以对shell中变量进行修改。

 

定义函数

函数由两部分组成:函数名和函数体

语法一: function f_name { ...函数体... }

语法二: function f_name () { ...函数体... }

语法三: f_name (){ ...函数体... }   (此语法最为常用)

 

函数也分为本地函数和环境函数。

set 查看本地变量及本地函数

1 [root@mmmm(mei) bin]# set
2 BASH=/bin/bash
3 BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
4 BASH_ALIASES=()
5 BASH_ARGC=()
6 BASH_ARGV=()
7 BASH_CMDS=()
8 BASH_LINENO=()

 

unset 变量名或函数名 取消变量或函数的定义
本地函数

1 [root@mmmm(mei) bin]# test () {  echo hello world; return 2; }
2 [root@mmmm(mei) bin]# test
3 hello world
4 [root@mmmm(mei) bin]# unset test
5 [root@mmmm(mei) bin]# test
6 [root@mmmm(mei) bin]#

环境函数

declare -xf mage或export -f mage
查看环环境函数
declare -xf 或export -f

1 [root@mmmm(mei) bin]# declare -xf test
 2 [root@mmmm(mei) bin]# declare -xf
 3 [root@mmmm(mei) bin]# test () {  echo hello world; return 2; }
 4 [root@mmmm(mei) bin]# declare -xf test
 5 [root@mmmm(mei) bin]# declare -xf
 6 test () 
 7 { 
 8     echo hello world;
 9     return 2
10 }
11 declare -fx test

 

函数使用

函数的定义和使用:

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


1 [root@mmmm(mei) ~]# test () { 2 > echo hello world 3 > } 4 [root@mmmm(mei) ~]# test 5 hello world


 

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


1 1 #!/bin/bash 2 2 test () { 3 3 echo hello world 4 4 } 5 5 test


 

在此需要注意一点:

        当我们需要使用函数时,直接使用函数名即可,函数名会被自动替换为函数代码 。

        但建议将函数部分的代码写在调用函数前面,使得在解释脚本时不报错。

(3)可放在只包含函数的单独文件中 ,可以在其他脚本中调用该文件的函数

 

函数是在被调用时创建,返回时终止。那么函数的返回值是什么呢?

函数的返回值也分为两种情况:
1.函数的执行结果返回值:

(1) 使用echo等命令进行输出

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

2.函数的退出状态码:

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


1 [root@mmmm(mei) bin]# test () { 2 > echo hello world 3 > } 4 [root@mmmm(mei) bin]# test 5 hello world 6 [root@mmmm(mei) bin]# echo $? 7 0


 

 

(2) 自定义退出状态码,

            其格式为: return  从函数中返回,用最后状态命令决定返回值

            return 0  无错误返回。

                   return 1-255  有错误返回     

1 [root@mmmm(mei) bin]# test () { 
2 > echo hello world
3 > return 2
4 > }
5 [root@mmmm(mei) bin]# test
6 hello world
7 [root@mmmm(mei) bin]# echo $?
8 2

 

 

接下来我们举一个简单的小例子来介绍一些函数的用法

declare -i num=100 使num的赋值只在当前函数中有效,等于同local num=100

1 1 #!/bin/bash
 2   2 test() {
 3   3         declare -i num=$1
 4   4         if [ $1 -le 1 ]; then
 5   5                 echo -e "hello\n"
 6   6         else
 7   7                 echo no
 8   8                 echo $(test $[$num-1])
 9   9 
10 10         fi
11 11         echo $num
12 12 }
13 13 test $1
14 14 echo $num
15 [root@mmmm(mei) bin]# testhanshu.sh 2
16 no
17 hello 1
18 2