函数是一个可重用的代码块。我们经常把重复的代码放入一个函数中,并从不同的地方调用该函数,库是函数的集合。我们可以在库中定义常用的函数,其他脚本可以使用它们而无需复制代码。
Calling function
在 Shell 中,调用函数和调用其他命令完全相同。例如,如果你的函数名是 my_func,那么它可以像下面这样执行。
$ my_func
如果函数接受参数,则可以从命令行提供这些参数,如下所示:
$ my_func arg1 arg2 arg3
Defining function
使用下面的语法来定义函数:
function function_name {Body of function}
函数体可以包含任何有效的命令、循环约束、其他函数或脚本,我们创建一个显示消息的简单函数。
function print_msg {echo "Hello, World"}
现在让我们执行这个函数:
$ print_msgHello, World
在上面的例子中,我们直接在终端上创建了函数,我们也可以将这个函数存储在文件中。
#! /bin/bashfunction print_msg {echo "Hello, World"}print_msg
我们在 function.sh 文件中定义了这个函数,现在让我们执行这个脚本:
$ chmod +x function.sh$ ./function.shHello, World
More about functions
在前一节中,我们定义了非常基本的函数。然而,在软件开发过程中,我们需要更高级的功能,可以接受各种参数和返回值。在本节中,我们将讨论这些函数。
向函数传递参数
和其他命令的参数一样,我们可以给函数提供相同的参数。我们可以使用 $ 符号从函数中访问这些参数。例如,$1 表示第一个参数,$2 表示第二个参数,依此类推。
修改上面的函数以接受 message 作为参数,修改后的函数如下:
function print_msg {echo "Hello $1"}
在上面的函数中,我们使用 $1 访问第一个参数。让我们执行这个函数:
$ print_msg "LinuxTechi"
当执行此函数时,它将生成以下输出:
Hello LinuxTechi
从函数返回值
像其他编程语言一样,Bash 提供了返回语句,我们可以使用它将值返回给调用者。
function func_return_value {return 10}
上面的函数返回值 10 给它的调用者。让我们执行这个函数:
$ func_return_value$ echo "Value returned by function is: $?"
当您执行上面的函数时,它将生成以下输出:
Value returned by function is: 10
注意: 在 bash 中我们必须使用 $?捕获函数的返回值。
Function recipes
到目前为止,我们对 bash 函数有了很好的了解。现在让我们创建一些有用的 bash 函数,它们可以使我们的工作更轻松。
Logger
让我们创建 logger 函数,它将打印日期和时间以及日志消息。
function log_msg {echo "[`date '+ %F %T'` ]: $@"}
让我们执行这个函数:
$ log_msg "This is sample log message"
当您执行此函数时,它将生成以下输出:
[ 2018-08-16 19:56:34 ]: This is sample log message
显示系统信息
Let us create a function to display information about GNU/Linux system
function system_info {echo "### OS information ###"lsb_release -aechoecho "### Processor information ###"processor=`grep -wc "processor" /proc/cpuinfo`model=`grep -w "model name" /proc/cpuinfo | awk -F: '{print $2}'`echo "Processor = $processor"echo "Model = $model"echoecho "### Memory information ###"total=`grep -w "MemTotal" /proc/meminfo | awk '{print $2}'`free=`grep -w "MemFree" /proc/meminfo | awk '{print $2}'`echo "Total memory: $total kB"echo "Free memory : $free kB"}
当您执行上面的函数时,它将生成以下输出:
### OS information ###
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic### Processor information ###
Processor = 1
Model = Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz### Memory information ###
Total memory: 4015648 kB
Free memory : 2915428 kB
从当前目录中查找文件或目录
下面的函数从当前目录中搜索文件或目录
function search {find . -name $1}
让我们使用下面的命令搜索目录 dir4
$ search dir4
当您执行上述命令时,它将生成以下输出:
./dir1/dir2/dir3/dir4
数字时钟
下面的函数在终端上创建一个简单的数字时钟
function digital_clock {clearwhile [ 1 ]dodate +'%T'sleep 1cleardone}
Creating library
库是函数的集合,在文件中创建库定义函数,并在当前环境中导入该文件。
假设我们已经在 utils.sh 文件中定义了所有函数,然后使用下面的命令在当前环境中导入函数。
$ source utils.sh
此后,您可以像执行其他 bash 命令一样执行库中的任何函数。
我的开源项目
- course-tencent-cloud(酷瓜云课堂 - gitee仓库)
- course-tencent-cloud(酷瓜云课堂 - github仓库)