Bash教程

Bash 函数

Bash 函数

在本主题中,我们展示了 bash 函数的基础知识以及它们如何在 bash shell 脚本中工作。
bash 脚本中的函数是重用代码的绝佳选择。 Bash 函数可以定义为一组可以在 bash 脚本中多次调用的命令。 bash 中函数的目的是帮助您使脚本更具可读性,并避免一次又一次地编写相同的代码。它还允许开发人员将复杂而冗长的代码分解为可以在需要时调用的小部分。函数可以随时重复调用,这将使我们能够重用、优化和最小化代码。
以下是有关bash函数的一些要点:
必须先在 shell 脚本中声明一个函数,然后才能使用它。 可以将参数传递给函数并在函数内部以 $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 lidihuo.'
}
JTP
输出
     Welcome to lidihuo.

示例: 方法 2

#!/bin/bash
function JTP {
    echo 'Welcome to lidihuo.'
}
JTP
输出
     Welcome to lidihuo.

传递参数

与大多数编程语言一样,我们也可以在 bash 函数中传递参数并处理数据。我们可以将数据插入到函数中,就像将命令行参数传递给 bash 脚本一样。
要向 bash 函数传递任意数量的参数,我们需要将它们插入到函数的名称。我们必须在函数名和参数之间应用空格。在参数周围使用双引号也将是一个很好的选择,以防止错误解析包含空格的参数。
以下是将参数传递给 bash 函数的一些关键点:
给定的参数作为 $1, $2, $3 ... $n 访问,对应于函数名称后参数的位置。 $0 变量保留用于函数名称。 $# 变量用于保存提供给函数的位置参数/参数的数量。 $* 和 [email protected] 变量用于保存所有给函数的参数/参数。 当 $* 与双引号(即 "$*")一起使用时,它会扩展为由空格分隔的单个字符串。例如,"$1 $2 $n 等"。 当 [email protected] 与双引号一起使用时(即" [email protected]"),它扩展为单独的字符串。例如,"$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""lidihuo."
输出
Bash Functions
在这个脚本中,我们有在我们调用 function_arguments 之后,添加了值"We"、"welcome"、"you"、"on"和"lidihuo"。这些值作为参数传递给 function_arguments 并存储在局部变量中。但是,与其他语言不同,解释器将传递的值存储到预定义的变量中,然后根据传递参数的顺序对其进行命名。
例如
"We"字存入变量1。
"welcome"字存入变量2 .
"you" 字存储到变量 3.
"on" 字存储到变量4。
"lidihuo"字存储到变量5。

变量范围

全局变量被定义为可以在脚本内的任何地方访问的变量,而不管范围如何。默认情况下,所有变量都定义为全局变量,即使它们是在函数内部声明的。我们也可以创建变量作为局部变量。局部变量可以在函数体内用 ?local? 声明。第一次分配时的关键字。它们只能在该函数内部访问。我们可以在不同的函数中创建同名的局部变量。要添加局部变量,我们可以使用以下语法:
local var_name=<var_value>
为了更好地理解变量作用域在 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 Functions
根据输出,如果我们在函数体内设置一个与现有全局变量同名的局部变量,然后它会优先于全局变量。全局变量可以在函数内修改。

返回值

大多数编程语言都有为函数返回值的概念。这意味着该函数必须将数据发送回原始调用位置。与"真实"编程语言中的函数不同,Bash 函数不支持在调用时返回值。但是,它们允许我们设置返回状态,类似于程序或命令以退出状态退出的方式。当一个 bash 函数完成时,它的返回值是函数中最后执行的语句的状态。成功状态返回 0,失败返回 1-255 范围内的非零十进制数。
返回状态可以使用 'return' 关键字表示,并赋值给变量$?。 return 语句终止函数并用作函数的退出状态。
例如,考虑以下代码:
Bash Script
#!/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 $?
输出
Bash Functions
返回一个更好的选择函数的值是使用echo 或printf 命令将值发送到stdout,如下所示:
Bash 脚本
#!/bin/bash
print_it () {
    local my_greet="Welcome to lidihuo."
    echo "$my_greet"
}
my_greet="$(print_it)"
echo $my_greet
输出
     Welcome to lidihuo.

覆盖命令

我们可以选择通过创建一个与我们要覆盖的命令同名的函数来覆盖 bash 命令。例如,如果我们想覆盖 'echo' 命令,那么我们必须创建一个名为 'echo' 的函数。
这种覆盖 bash 命令的概念在某些情况下可能会有所帮助,例如我们想使用带有特定选项的命令。此外,当我们不喜欢在脚本中多次为整个命令提供选项时。在这种情况下,我们可以使用选项覆盖命令的内置 bash 命令。现在,让我们借助一些示例来理解在 Bash Shell Scripting 中覆盖命令的概念:

示例

在此示例中,我们覆盖了 ' 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 lidihuo."
输出
Bash Functions

结论

在本主题中,我们演示了 Bash 函数。 Bash 函数被视为为执行特定操作而开发的可重用代码块。一旦定义,它就可以在一个脚本中多次调用。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4