重击功能
Bash函数本质上是一组可以多次调用的命令。 函数的目的是帮助您使bash脚本更具可读性,并避免重复编写相同的代码。 与大多数编程语言相比,Bash函数有所限制。
在本教程中,我们将介绍Bash函数的基础知识,并向您展示如何在Shell脚本中使用它们。
定义Bash函数
声明bash函数的语法很简单。 函数可以两种不同的格式声明:
第一种格式以函数名称开头,后跟括号。 这是首选且使用较多的格式。
function_name () { commands }
单行版本:
function_name () { commands; }
第二种格式以保留字开头
function
,然后是函数名称。function function_name { commands }
单行版本:
function function_name { commands; }
需要注意的几点:
- 花括号之间的命令(
{}
)称为函数的主体。 花括号必须与正文之间用空格或换行符分隔。 - 定义函数不会执行它。 要调用bash函数,只需使用函数名称。 只要在shell脚本中调用函数,花括号之间的命令就会执行。
- 函数定义必须放在对函数的任何调用之前。
- 使用单行“压缩”功能时,请使用分号
;
必须遵循函数中的最后一条命令。 - 始终尝试使函数名称保持描述性。
为了更好地理解这一点,请看以下示例:
〜/ hello_world.sh
#!/bin/bash
hello_world () {
echo 'hello, world'
}
hello_world
让我们逐行分析代码:
- 在第3行中,我们通过给函数命名来定义函数。 大括号
{
标记函数主体的开始。 - 线
4
是功能主体。 函数主体可以包含多个命令,语句和变量声明。 - 线
5
,右花括号}
,定义结尾hello_world
功能。 - 排队
7
我们正在执行功能。 您可以根据需要多次执行该功能。
如果运行脚本,它将打印 hello, world
。
变量范围
全局变量是可以从脚本中的任何位置访问的变量,而不管其范围如何。 在Bash中,即使在函数内部声明,默认情况下所有变量也都定义为全局变量。
局部变量可以在函数体内通过以下方式声明: local
关键字,并且只能在该函数内部使用。 您可以在不同的函数中使用具有相同名称的局部变量。
为了更好地说明变量作用域如何在Bash中工作,让我们考虑以下示例:
〜/ variables_scope.sh
#!/bin/bash
var1='A'
var2='B'
my_function () {
local var1='C'
var2='D'
echo "Inside function: var1: $var1, var2: $var2"
}
echo "Before executing function: var1: $var1, var2: $var2"
my_function
echo "After executing function: var1: $var1, var2: $var2"
该脚本首先定义两个全局变量 var1
和 var2
。 然后有一个设置局部变量的函数 var1
并修改全局变量 var2
。
如果运行脚本,应该会看到以下输出:
Before executing function: var1: A, var2: B
Inside function: var1: C, var2: D
After executing function: var1: A, var2: D
从上面的输出中,我们可以得出以下结论:
- 当在函数体内设置与现有全局变量同名的局部变量时,它将优先于全局变量。
- 全局变量可以在函数内部进行更改。
返回值
与“真实”编程语言中的函数不同,Bash函数不允许您在调用时返回值。 bash函数完成后,其返回值是该函数中执行的最后一条语句的状态, 0
表示成功,如果非十进制数字为1-255,则表示失败。
退货状态可以通过使用 return
关键字,并将其分配给变量 $?
。 的 return
语句终止功能。 您可以将其视为函数的退出状态。
〜/ return_values.sh
#!/bin/bash
my_function () {
echo "some result"
return 55
}
my_function
echo $?
some result
55
要从函数实际返回任意值,我们需要使用其他方法。 最简单的选择是将函数的结果分配给全局变量:
〜/ return_values.sh
#!/bin/bash
my_function () {
func_result="some result"
}
my_function
echo $func_result
some result
从函数返回值的另一个更好的选择是将值发送到 stdout
使用echo或 printf
如下图所示:
〜/ return_values.sh
#!/bin/bash
my_function () {
local func_result="some result"
echo "$func_result"
}
func_result="$(my_function)"
echo $func_result
some result
我们不是简单地执行将消息打印到stdout的函数,而是将函数输出分配给 func_result
使用 $()
命令替换。 以后可以根据需要使用该变量。
将参数传递给Bash函数
要将任意数量的参数传递给bash函数,只需将其放在函数名称之后,并以空格分隔即可。 最好对参数加双引号,以免参数中带有空格的配置错误。
- 传递的参数是
$1
,$2
,$3
…$n
,对应于函数名称后的参数位置。 - 的
$0
变量是为函数名称保留的。 - 的
$#
变量保存传递给函数的位置参数/参数的数量。 - 的
$*
和[email protected]
变量保存传递给函数的所有位置参数/参数。- 双引号时,
"$*"
扩展为由空格分隔的单个字符串(IFS的第一个字符)-"$1 $2 $n"
。 - 双引号时,
"[email protected]"
扩展为单独的字符串-"$1" "$2" "$n"
。 - 如果不加双引号,
$*
和[email protected]
是相同的。
- 双引号时,
这是一个例子:
〜/ passing_arguments.sh
#!/bin/bash
greeting () {
echo "Hello $1"
}
greeting "Joe"
Hello Joe
结论#
Bash函数是旨在执行特定操作的可重用代码块。 定义后,可以在脚本中多次调用该函数。
您可能还想阅读有关如何使用Bash函数为较长的命令创建令人难忘的快捷键命令的信息。
如果您有任何疑问或反馈,请随时发表评论。
bash终端