shell非常实用的函数功能

与大多数开发语言一样,Shell同样支持函数功能。函数就是给一段代码起一个别名,也就是函数名,定义函数名的规则与定义变量名的规则基本一致,但是函数名运行以数字开头。

使用函数可以方便地封装某种特定的功能代码,在调用函数时不需要关心它是如何实现的,只需知道这个函数是做什么的,就可以直接调用它完成某项功能。函数必须先定义,才能被调用。

合理地使用函数可以将一个大的工程分割为若干的小功能模块,代码的可读性更好,还可以有效的避免代码重复。

函数定义方式

定义函数的语法格式多种,可以任选一种方式,调用函数时直接写函数名即可。

方式一:

如果你嫌麻烦,函数定义时也可以不写 function 关键字

函数名称() {
	代码序列
}

由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

方式二:

function 函数名() {
	代码序列
}

function是 Shell 中的关键字,专门用来定义函数;

方式三:
如果写了 function 关键字,也可以省略函数名后面的小括号

function 函数名 {
	代码序列
}

语法格式演示

在命令行就可以直接演示函数的定义和调用,例如:

在这里插入图片描述

定义函数并不会导致函数内的任何命令被执行,仅当通过函数名称调用时。函数内的命令才会被触发执行。

在实际编写脚本时,经常会使用函数的功能给脚本编写提示信息,比如脚本的帮助或用法信息。下面就是这样的示例脚本文件。

功能描述:使用函数输出帮助信息.

#!/bin/bash


function print_usage() {
    cat << EOF
Usage: --help | -h
  Print help information for script.
Usage: --memory | -m
  Monitor memory information.
Usage: --network | -n
  Monitor network interface information.
EOF
}
case $1 in
--memory|-m)
    free;;
--network|-n)
    ip -s link;;
--help|-h)
    print_usage;;
*)
    print_usage;;
esac

通过上面的示例可以知道,函数其实类似于别名,就是给一段代码起一个别名,当调用该别名时函数中的代码就会触发执行。但是,前面示例中函数并不能被反复调用,因为函数体内编写的代码用全部都是常量,所以在第二次被调用时就会创建名称一样的目录与文件。

这样的函数并不灵活。怎么解决这个问题呢?答案是使用变量! shell中的函数支持传递参数,可以通过向函数体内传递变量参数,确保函数可以被反复调用。可以通过变量$1,$2读取位置参数,在调用函数时添加相应的参数即可,或者读取其他全局变量都可以实现传递变量参数的功能。

下面我们可以编写一个监控服务器功能,可以写成函数,通过传递变量就可以编写一个通用的监控服务是否启动的脚本。

功能描述:使用函数检查服务是否启动的案例脚本.

#!/bin/bash

date_time=$(date +'%Y-%m-%dT%H:%M:%S%z')

function check_services() {
    for i in "$@" #$@表示函数的所有参数
    do
        if systemctl --quiet is-active ${i}.service; then
            echo -e "[$date_time)]: \033[92mservice $i is active\033[0m"
        else
            echo "[$date_time]: service $i is not active" >&2
        fi
    done
}

check_services httpd sshd vsftpd

编译输出:
在这里插入图片描述

上面的脚本在调用函数时添加了不止一个参数,而在函数体内通过$@就可以读取所有位置参数,并通过for循环遍历每个参数,在for循环内部使用if语句判断服务是否启动。

这个脚本中定义的函数也可以被反复调用,每次调用时添加不同的位置参数,即可检查不同的服务的状态。

shell非常实用的函数功能_第1张图片
欢迎关注微信公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:

shell非常实用的函数功能_第2张图片

你可能感兴趣的:(Linux,shell)