📜  Bash函数

📅  最后修改于: 2020-12-29 10:23:18             🧑  作者: Mango

重击功能

在本主题中,我们演示了bash函数的基础知识以及它们在bash shell脚本中的工作方式。

bash脚本中的函数是重用代码的绝佳选择。 Bash函数可以定义为一组命令,可以在bash脚本中多次调用。 bash函数的目的是帮助您提高脚本的可读性,并避免一次又一次地编写相同的代码。它还允许开发人员将复杂而冗长的代码分解为小部分,可以在需要时调用它们。可以随时重复调用函数,这将使我们能够重用,优化和最小化代码。

以下是有关bash函数的一些关键点:

  • 必须先在外壳程序脚本中声明一个函数,然后才能使用它。
  • 参数可以传递给函数,并在函数内部以$ 1,$ 2等访问。
  • 可以在函数内分配局部变量,此类变量的范围仅是该特定函数。
  • Bash shell的内置命令可以使用函数覆盖。

句法

声明bash函数的语法可以用两种格式定义:

1.第一种方法以函数名称开头,后跟括号。这是最优选且最常用的方法:

function_name () {
commands
}

单行版本可以提及如下:

function_name () { commands; }

2.第二种方法以函数保留字开头,后跟函数名称:

function function_name {
commands
}

单行版本可以提及如下:

function function_name { commands; }

与大多数编程语言相比,Bash函数有所限制。让我们借助一些示例来了解概念:

示例:方法1

#!/bin/bash

JTP () {
    echo 'Welcome to Javatpoint.'
}

JTP

输出量

Welcome to Javatpoint.

示例:方法2

#!/bin/bash

function JTP {
    echo 'Welcome to Javatpoint.'
}

JTP

输出量

Welcome to Javatpoint.

传递参数

像大多数编程语言一样,我们也可以传递参数并在bash函数中处理数据。我们可以像将命令行参数传递给bash脚本一样,将数据插入到函数中。

要将任意数量的参数传递给bash函数,我们需要在函数名称之后插入它们。我们必须在函数名称和参数之间使用空格。在参数周围使用双引号以防止参数中带有空格的参数解析错误也是一个不错的选择。

以下是有关将参数传递给bash函数的一些关键点:

  • 给定的参数以$ 1,$ 2,$ 3 … $ n的形式访问,对应于函数名后参数的位置。
  • $ 0变量保留为该函数的名称保留。
  • $#变量用于保存赋予函数的位置实参/参数的数量。
  • $ *和$ @变量用于保存赋予函数的所有参数/参数。
    • 当$ *与双引号(即“ $ *”)一起使用时,它将扩展为由空格分隔的单个字符串。例如,“ $ 1 $ 2 $ n等”。
    • 当$ @与双引号(即“ $ @”)一起使用时,它将扩展为单独的字符串。例如,“ $ 1”,“ $ 2”,“ $ n”等。
    • 当$ *和$#不与双引号一起使用时,它们都是相同的。

以下是说明如何将参数传递给函数以及如何访问函数内部参数的过程的函数。

Bash脚本

#!/bin/bash
#Script to pass and access arguments

function_arguments()
    {
    echo $1
    echo $2
    echo $3
    echo $4
    echo $5
    }

#Calling function_arguments
function_arguments "We""welcome""you""on""Javatpoint."

输出量

在此脚本中,我们在调用function_arguments之后添加了值“ We”,“ welcome”,“ you”,“ on”和“ Javatpoint”。这些值将作为参数传递到function_arguments并存储在局部变量中。但是,与其他语言不同,解释器将传递的值存储到预定义的变量中,然后根据传递的参数顺序对其进行命名。

例如,

“我们”一词存储在变量1中
“欢迎”字存储在变量2中
“您”一词存储在变量3中
“开”字被存储到变量4
“ Javatpoint”字存储到变量5中

可变范围

全局变量定义为可以在脚本内的任意位置访问的变量,而不管其范围如何。默认情况下,所有变量都定义为全局变量,即使它们在函数内部声明也是如此。我们还可以将变量创建为局部变量。可以使用?local?在函数体内声明局部变量。首次分配关键字时。它们只能在该函数内部访问。我们可以在不同的函数中创建具有相同名称的局部变量。要添加局部变量,我们可以使用以下语法:

local var_name=

为了更好地理解变量作用域在Bash脚本中的工作方式,请查看以下示例:

Bash脚本

#!/bin/bash

v1='A'
v2='B'

my_var () {
local v1='C'
v2='D'
echo "Inside Function"
echo "v1 is $v1."
echo "v2 is $v2."
}

echo "Before Executing the Function"
echo "v1 is $v1."
echo "v2 is $v2."

my_var
echo "After Executing the Function"
echo "v1 is $v1."
echo "v2 is $v2."

输出量

对于输出,如果我们在函数体内设置与现有全局变量同名的局部变量,则它将优先于全局变量。可以在函数修改全局变量。

返回值

大多数编程语言都具有为函数返回值的概念。这意味着该函数必须将数据发送回原始调用位置。与“真实”编程语言中的函数不同,Bash函数不提供在调用时返回值的支持。但是,它们允许我们设置返回状态,该状态类似于程序或命令如何以退出状态退出。 bash函数完成时,其返回值是该函数最后执行的语句的状态。对于成功状态,它返回0,对于失败,则返回1-255范围内的非零十进制数。

可以使用关键字“ return”指示返回状态,并将其分配给变量$?。 return语句终止函数并用作函数的退出状态。

例如,考虑以下代码:

Bash脚本

#!/bin/bash
#Setting up a return status for a function

print_it () {
    echo Hello $1
    return 5
}

print_it User
print_it Reader
echo The previous function returned a value of $?

输出量

从函数返回值的另一个更好的选择是使用echoprintf命令将该值发送到stdout ,如下所示:

Bash脚本

#!/bin/bash

print_it () {
    local my_greet="Welcome to Javatpoint."
    echo "$my_greet"
}

my_greet="$(print_it)"
echo $my_greet

输出量

Welcome to Javatpoint.

覆盖命令

我们可以通过创建一个与要覆盖的命令同名的函数来覆盖bash命令。例如,如果要覆盖“echo ”命令,则必须创建一个名称为“ echo ”的函数。

覆盖bash命令的概念在某些情况下可能会很有用,例如当我们要使用带有特定选项的命令时。另外,当我们不希望在脚本中多次为整个命令提供选项时。在这种情况下,我们可以将内置bash命令覆盖为带选项的命令。现在,让我们借助一些示例来了解在Bash Shell脚本中覆盖命令的概念:

在此示例中,我们重写了“echo”命令,并将时间戳以参数的形式添加到了“echo”命令。

Bash脚本

#!/bin/bash
#Script to override command using function

echo () {
    builtin echo -n `date +"[%m-%d %H:%M:%S]"` ": "
    builtin echo $1
}

echo "Welcome to Javatpoint."

输出量

结论

在本主题中,我们演示了Bash函数。 Bash函数被视为开发用于执行特定操作的可重用代码块。定义后,可以在脚本中多次调用它。