Unix / Linux - Shell 函数

  • 简述

    本章,我们将详细讨论shell函数。函数使您能够将脚本的整体功能分解为更小的逻辑子部分,然后可以在需要时调用它们来执行各自的任务。
    使用函数来执行重复性任务是创建 code reuse. 这是现代面向对象编程原则的重要组成部分。
    Shell 函数类似于其他编程语言中的子例程、过程和函数。
  • 创建函数

    要声明一个函数,只需使用以下语法 -
    
    function_name () { 
       list of commands
    }
    
    你的函数名称是 function_name,这就是您将用来从脚本中的其他地方调用它的内容。函数名称后必须跟括号,然后是括在大括号内的命令列表。

    例子

    以下示例显示了函数的使用 -
    
    #!/bin/sh
    # Define your function here
    Hello () {
       echo "Hello World"
    }
    # Invoke your function
    Hello
    
    执行后,您将收到以下输出 -
    
    $./test.sh
    Hello World
    
  • 将参数传递给函数

    您可以定义一个在调用函数时接受参数的函数。这些参数表示为$1, $2 等等。
    下面是一个例子,我们传递两个参数ZaraAli,然后我们在函数中捕获并打印这些参数。
    
    #!/bin/sh
    # Define your function here
    Hello () {
       echo "Hello World $1 $2"
    }
    # Invoke your function
    Hello Zara Ali
    
    执行后,您将收到以下结果 -
    
    $./test.sh
    Hello World Zara Ali
    
  • 从函数返回值

    如果你执行一个 exit 来自函数内部的命令,它的作用不仅是终止函数的执行,而且是终止调用该函数的 shell 程序的执行。
    如果你只想终止函数的执行,那么有办法从定义的函数中出来。
    根据情况,您可以使用函数从函数中返回任何值 return 命令的语法如下 -
    
    return code
    
    这里 code 可以是您在此处选择的任何内容,但显然您应该选择在整个脚本上下文中有意义或有用的内容。

    例子

    以下函数返回值 10 -
    
    #!/bin/sh
    # Define your function here
    Hello () {
       echo "Hello World $1 $2"
       return 10
    }
    # Invoke your function
    Hello Zara Ali
    # Capture value returnd by last command
    ret=$?
    echo "Return value is $ret"
    
    执行后,您将收到以下结果 -
    
    $./test.sh
    Hello World Zara Ali
    Return value is 10
    
  • 嵌套函数

    函数更有趣的特性之一是它们可以调用自己和其他函数。调用自身的函数称为recursive function.
    以下示例演示了两个函数的嵌套 -
    
    #!/bin/sh
    # Calling one function from another
    number_one () {
       echo "This is the first function speaking..."
       number_two
    }
    number_two () {
       echo "This is now the second function speaking..."
    }
    # Calling function one.
    number_one
    
    执行后,您将收到以下结果 -
    
    This is the first function speaking...
    This is now the second function speaking...
    
  • 从提示中调用函数

    您可以将常用函数的定义放在 .profile. 无论何时登录,这些定义都将可用,您可以在命令提示符下使用它们。
    或者,您可以将定义分组在一个文件中,例如 test.sh,然后通过键入在当前 shell 中执行文件 -
    
    $. test.sh
    
    这具有导致内部定义的函数的效果 test.sh 被读取并定义到当前 shell 如下 -
    
    $ number_one
    This is the first function speaking...
    This is now the second function speaking...
    $
    
    要从 shell 中删除函数的定义,请使用 unset 命令和 .f选项。此命令还用于删除 shell 的变量定义。
    
    $ unset -f function_name