学科分类
目录
Linux编程

Shell中的函数

函数将某个要实现的功能模块化,使代码结构和程序的工作流程更为清晰,也提高了程序的可读性和可重用性,是程序中重要的部分。本节将从函数的定义、调用方法、函数中的参数这三个部分着手,讲解Shell中函数的相关知识。

1、 函数的定义

shell中的函数相当于用户自定义的命令,函数名相当于命令名,代码段用来实现该函数的核心功能。shell中函数的格式如下:

[function] 函数名[()]{
  代码段
  [return int]
}

在shell脚本中定义函数时,可以使用function关键字,也可以不使用;函数名后的括号可以省略,若省略,则函数名与“{”之间需要有空格;shell脚本中的函数不带任何参数;shell脚本中可以使用return返回一个值,也可以不返回,若不设置返回值,则该函数返回最后一条命令的执行结果。

2、 函数的调用

shell脚本是逐行执行的,所以其中的函数需要在使用前定义。下面通过案例来展示shell脚本中函数的使用方法。

案例14:定义一个hello函数,该函数可以输出“hello itheima”,并在脚本中使用该函数。

 1    #!/bin/sh
 2    #function hello
 3    function hello(){
 4        echo "hello itheima."
 5    }
 6    #main
 7    hello                            #hello函数调用
 8    exit 0

执行该脚本,输出结果如下:

hello itheima.

3、 函数中的参数

若大家学习过C语言,应该知道,在C语言中有参数列表的概念,参数列表一般在函数名后的括号中,用于函数间的数据传递。类似的,Shell脚本的函数中也会有数据的传递,但是Shell中的函数没有参数列表,那么Shell脚本中的函数是如何传递数据的呢?

前面小节中介绍了shell中位置变量的概念,其中$0代表Shell脚本的名称,$1~$n代表脚本中的位置变量$1~$n,这些变量可以依次获取执行脚本时传入脚本的参数。Shell脚本的函数中也使用此种方式获取参数,其中$0代表函数名,$n代表传入函数的第n个参数。

需要注意的是,函数中的位置变量不与脚本中的位置变量冲突。函数中的位置变量在函数调用处传入,脚本中的位置变量在脚本执行时传入。下面通过案例来展示函数中参数的传递方式。

案例15:分别为脚本中的位置变量和函数中的位置变量传参。

 1    #!/bin/sh
 2    #function
 3    function _choice(){
 4        echo "Your chioce is $1."
 5    }
 6    #main
 7    case $1 in
 8        "C++" ) _choice C++ ;;
 9        "Android" ) _choice Android ;;
 10        "Python" ) _choice Python;;
 11        *) echo "$0:please select in (C++/Android/Python)"
 12    esac
 13    exit 0

在命令行输入“sh fun2 C++”,执行该脚本,执行结果如下:

[itheima@localhost ~]$ sh fun2 C++
Your chioce is C++.

分析案例15代码:案例15中的代码可视为两个部分,在“#function”和“#main”之间的部分为函数“_choice”,“#main”之后为脚本部分。脚本主体为case…in…esac结构,结构中的变量为脚本的位置变量$1;结构中的匹配项共调用了三次_choice函数,调用的同时为_choice函数传递一个参数,该参数被函数中的位置变量$1接收。

4、 函数中的变量

在C语言中,函数内部定义的变量为局部变量,当函数调用结束时被销毁;shell脚本的函数中也可以定义变量,那么其中的变量是否是一个局部变量呢?我们可以通过一个案例来验证。

案例16:验证shell脚本函数中定义的变量是否是局部变量。

 1    #!/bin/sh
 2    function fun(){
 3        a=10
 4        echo "fun:a=$a"
 5    }
 6    a=5
 7    echo "main:a=$a"
 8    fun                #函数调用
 9    echo "main:a=$a"
 10    exit 0

执行该脚本,输出结果如下:

main:a=5
fun:a=10
main:a=10

分析输出结果:脚本中首先定义了全局变量a并输出,得到结果为“main:a=5”,此时全局变量a值为5;之后调用函数fun,函数中也定义了一个a,并被赋值为10,输出该变量,值为10,函数调用结束;再次在脚本中输出变量a,输出结果为“main:a=10”。由程序打印结果可知,函数中的变量a是脚本中定义的全局变量a,而非由函数重新定义的局部变量。

通过案例3可以看出,shell变量中的变量可以方便地在函数体与函数外传递,但是也许有时仅仅想使用与全局变量相同的变量名,而非要修改全局变量的值,此时便需在函数中定义一个局部变量。在shell脚本的函数中定义局部变量的方法很简单,只需在变量前添加“local”关键字即可,如此一来,函数中定义的同名变量的作用范围便被限制在函数之中。下面通过案例来展示local的用法。

案例17:使用local在函数中定义一个局部变量。

 1    #!/bin/sh
 2    function fun(){
 3        local a=10
 4        echo "fun:a=$a"
 5    }
 6    a=5
 7    echo "main:a=$a"
 8    fun             #函数调用
 9    echo "main:a=$a"
 10    exit 0

执行脚本,输出结果如下:

main:a=5
fun:a=10
main:a=5

根据输出结果可知,在函数调用前后,脚本中全局变量a的值一致,说明使用关键字local定义在函数中的变量是一个局部变量。

点击此处
隐藏目录