如何在 Shell 脚本中使用函数 ?

How to define and use functions in Linux Shell Script

函数是一个可重用的代码块。我们经常把重复的代码放入一个函数中,并从不同的地方调用该函数,库是函数的集合。我们可以在库中定义常用的函数,其他脚本可以使用它们而无需复制代码。

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_msg
 Hello, World

在上面的例子中,我们直接在终端上创建了函数,我们也可以将这个函数存储在文件中。

#! /bin/bash
 function print_msg {
       echo "Hello, World"
 }
 print_msg

我们在 function.sh 文件中定义了这个函数,现在让我们执行这个脚本:

$ chmod +x function.sh
 $ ./function.sh
 Hello, 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 -a

       echo
       echo "### 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"

       echo
       echo "### 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 {
            clear
            while [ 1 ]
            do
                  date +'%T'
                  sleep 1
                  clear
            done
 }

Creating library

库是函数的集合,在文件中创建库定义函数,并在当前环境中导入该文件。

假设我们已经在 utils.sh 文件中定义了所有函数,然后使用下面的命令在当前环境中导入函数。

$ source utils.sh

此后,您可以像执行其他 bash 命令一样执行库中的任何函数。

我的开源项目

酷瓜云课堂-开源知识付费解决方案

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值