在本章中,我们将详细讨论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 gingerbeer
执行后,您将收到以下结果-
$./test.sh
Hello World gingerbeer
从函数返回值
如果从函数内部执行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 gingerbeer
# Capture value returnd by last command
ret=$?
echo "Return value is $ret"
执行后,您将收到以下结果-
$./test.sh
Hello World gingerbeer
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...
从prompt中调用函数
您可以在*.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