Bash函数本质上是一组可以多次调用的命令。函数的目的是帮助您使bash脚本更具可读性,并避免编写重复的代码。
与大多数编程语言相比,Bash函数能力相当有限。在本教程中,我们将介绍Bash函数的基础知识,并向您展示如何在shell脚本中使用它们。
声明bash函数的语法非常简单。它们可以以两种不同的格式声明。第一种格式以函数名称开头,后跟括号。这是首选和更常用的格式。
function_name () {
commands
}
单行版本:
function_name () { commands; }
第二种格式以function
保留字开头,后跟函数名。
function function_name {
commands
}
单行版本:
function function_name { commands; }
花括号{}
之间的命令列表是函数的主体。围绕函数体的花括号必须通过空格或换行符与主体分隔。
定义函数并不会执行它。要调用bash函数,只需使用函数名称。只要在shell脚本中调用函数,就会执行函数体的命令。
必须在调用任何函数之前定义函数。使用单行函数时,分号;
必须遵循函数中的最后一个命令。您应该始终尝试保持函数名称的描述性。
要更好地理解这一点,请查看以下示例:
在行3
中,我们通过命名方式来定义函数,并使用花括号{
标记函数体的开始。行4
是函数体。函数体可以有多个命令。
行5
,结束花括号}
,定义hello_world
函数的结尾。在行7
我们正在执行该函数。您可以根据需要多次执行该函数。如果您运行该脚本,它将打印hello, world
。
变量作用域
全局变量是可以从脚本中的任何位置访问的变量,与作用域范围无关。在Bash中,默认情况下所有变量都定义为全局变量,即使在函数内部声明也是如此。
可以使用local
关键字在函数体内声明局部变量,并且只能在该函数内部使用。您可以在不同的函数中使用相同名称的局部变量。
为了更好地说明变量作用域范围在Bash中的工作原理,让我们考虑一个例子:
脚本首先定义两个全局变量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
表示成功和非0
十进制数在1 - 255范围内表示失败。
可以使用return
关键字指定返回状态,并将其分配给全局变量$?
。return
语句会终止函数。您可以将其视为函数的退出状态。
要从函数中返回任意实际的值,我们需要使用其他方法。最简单的选择是将函数的结果分配给全局变量。
从函数获得返回值的另一个更好选择是使用echo或printf
将值发送到标准输出stdout
。
some result
55
some result
我们执行的函数不是简单地将消息打印到标准输出,而是使用$()
机制分配给变量func_result
。使用此方法func_result
变量将保存函数的结果。
Bash函数参数
要将任意数量的参数传递给bash函数,只需将它们放在函数名称后面,用空格分隔即可。最佳做法是用双引号将参数转义,以避免错误地使用带空格的参数。
传递的参数可以通过变量$1
,$2
,$3
... $n
,索引1...n
对应于参数在函数名后的位置。
$0
变量保留给函数的名称。$#
变量保存传递给函数的位置参数或者参数的数量。$*
或$@
变量保存传递给函数的所有位置参数或者参数。
Hello Joe
结论
至此,您应该很好地理解如何编写bash函数。您可能还想了解如何使用Bash函数为更长的命令创建可记忆的快捷命令。
如果您有任何问题或反馈,请随时发表评论。