Unix / Linux - Shell 函数
在本章中,我们将详细讨论 shell 函数。 函数使您能够将脚本的整体功能分解为更小的逻辑子部分,然后可以在需要时调用它们来执行各自的任务。
使用函数执行重复性任务是创建代码重用 的绝佳方式。 这是现代面向对象编程原则的重要组成部分。
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 等表示。
下面是一个例子,我们传递了两个参数 Zara 和 Ali 然后我们在函数中捕获并打印这些参数。
#!/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
嵌套函数
函数的一个更有趣的特性是它们可以调用自身以及其他函数。 调用自身的函数称为递归函数。
下面的例子演示了两个函数的嵌套 −
#!/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 中删除函数的定义,请使用带有 .f 选项的 unset 命令。 此命令还用于将变量的定义删除到 shell。
$ unset -f function_name