【Shell 函数库介绍】

文章目录

  • 前言
  • [一、什么是 Shell 函数库?](#一、什么是 Shell 函数库?)
    • [1. 普通函数示例](#1. 普通函数示例)
    • [2. 函数库的基本思想](#2. 函数库的基本思想)
  • 二、函数定义详解
    • [1. 定义方式一(推荐)](#1. 定义方式一(推荐))
    • [2. 定义方式二(POSIX兼容)](#2. 定义方式二(POSIX兼容))
    • [3. 参数获取](#3. 参数获取)
    • [4. 返回值机制](#4. 返回值机制)
  • 三、如何编写函数库
    • [1. 创建函数库文件](#1. 创建函数库文件)
    • [2. 编写 common.sh](#2. 编写 common.sh)
    • [3. 在主脚本中使用](#3. 在主脚本中使用)
  • [四、source 与 . 的区别](#四、source 与 . 的区别)
  • 五、函数库设计规范
    • [1. 命名规范](#1. 命名规范)
    • [2. 防止重复加载](#2. 防止重复加载)
    • [3. 严格模式(推荐)](#3. 严格模式(推荐))
  • [六、函数库 vs 可执行脚本](#六、函数库 vs 可执行脚本)

前言

在日常开发与运维工作中,我们经常会编写大量 Shell 脚本来完成自动化任务,例如部署、备份、监控、日志分析等。如果每个脚本都重复写相同的逻辑代码,不仅效率低下,而且维护成本极高。

这时,函数库(Library) 就显得尤为重要。


一、什么是 Shell 函数库?

在 Shell 中,函数库本质上是:

一个包含多个函数的 .sh 文件,用于被其他脚本加载并复用。

类似于:

  • Python 的模块
  • Java 的工具类

1. 普通函数示例

bash 复制代码
#!/bin/bash

hello() {
    echo "Hello, $1"
}

hello "Shell"

2. 函数库的基本思想

假设有多个脚本都需要:

  • 打印日志
  • 判断命令是否成功
  • 检查文件是否存在

那就可以提取为:

复制代码
lib/common.sh

然后通过:

bash 复制代码
source lib/common.sh

进行加载。


二、函数定义详解

1. 定义方式一(推荐)

bash 复制代码
function log_info() {
    echo "[INFO] $1"
}

2. 定义方式二(POSIX兼容)

bash 复制代码
log_info() {
    echo "[INFO] $1"
}

3. 参数获取

bash 复制代码
my_func() {
    echo "第一个参数: $1"
    echo "参数个数: $#"
    echo "所有参数: $@"
}

4. 返回值机制

Shell 函数:

  • 只能返回 0~255
  • 通过 return 返回状态码
bash 复制代码
check_file() {
    if [ -f "$1" ]; then
        return 0
    else
        return 1
    fi
}

使用:

bash 复制代码
check_file test.txt
if [ $? -eq 0 ]; then
    echo "文件存在"
fi

⚠ 推荐方式:

bash 复制代码
if check_file test.txt; then
    echo "文件存在"
fi

三、如何编写函数库

1. 创建函数库文件

复制代码
project/
│
├── lib/
│   └── common.sh
│
└── main.sh

2. 编写 common.sh

bash 复制代码
#!/bin/bash

# ==========================
# 日志函数
# ==========================

log_info() {
    echo -e "\033[32m[INFO]\033[0m $1"
}

log_error() {
    echo -e "\033[31m[ERROR]\033[0m $1"
}

# ==========================
# 工具函数
# ==========================

check_file_exists() {
    if [ -f "$1" ]; then
        return 0
    else
        return 1
    fi
}

check_command_exists() {
    command -v "$1" >/dev/null 2>&1
}

3. 在主脚本中使用

bash 复制代码
#!/bin/bash

source ./lib/common.sh

log_info "程序启动"

if check_file_exists "/etc/passwd"; then
    log_info "文件存在"
else
    log_error "文件不存在"
fi

if check_command_exists git; then
    log_info "git 已安装"
fi

四、source 与 . 的区别

两种写法等价:

bash 复制代码
source file.sh
bash 复制代码
. file.sh

区别:

  • source 是 bash 内置命令
  • . 是 POSIX 标准

建议:写成 source 可读性更好。


五、函数库设计规范

1. 命名规范

推荐:

bash 复制代码
lib_log_info
lib_check_file

避免函数冲突。


2. 防止重复加载

bash 复制代码
if [ -z "$_COMMON_SH_LOADED" ]; then
    _COMMON_SH_LOADED=1
    # 函数定义
fi

3. 严格模式(推荐)

在主脚本加:

bash 复制代码
set -euo pipefail

含义:

  • -e 出错立即退出
  • -u 未定义变量报错
  • pipefail 管道出错也算失败

六、函数库 vs 可执行脚本

类型 用途
函数库 被 source 加载
可执行脚本 独立运行

不要在函数库中写:

bash 复制代码
exit

否则会导致主脚本退出。

相关推荐
Profile排查笔记1 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
lzhdim2 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
denggun123452 小时前
yield
前端·数据库·python
前端snow2 小时前
ai agent -- prompt汇总
前端
muddjsv3 小时前
前端性能优化实战:从加载到渲染的全面提速指南
前端·性能优化
deli0070074 小时前
JSON 树形查看器:粘贴即解析,折叠展开一目了然
前端·数据库·json·ai编程
guanguan0_04 小时前
PageProxy:页面维度接口地图 + 一键场景切换
前端·ai编程·请求代理·proxy工具
liangshanbo12154 小时前
虚拟列表深度面试题整理
java·开发语言·前端
IT_陈寒5 小时前
Redis内存警告竟是因为这个不起眼的配置项
前端·人工智能·后端
lilian2335 小时前
Harmony os 技术实战|拼豆制图43:压缩字符矩阵上线前如何拦住错位图纸
开发语言·前端·华为·矩阵·harmonyos