【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

否则会导致主脚本退出。

相关推荐
小溪彼岸2 小时前
谷歌上线Gemini in Chrome,想免费使用还需打怪升级
chrome·google
Moment2 小时前
腾讯终于对个人开放了,5 分钟在 QQ 里养一只「真能干活」的 AI 😍😍😍
前端·后端·github
比尔盖茨的大脑2 小时前
AI Agent 架构设计:从 ReAct 到 Multi-Agent 系统
前端·人工智能·全栈
天才熊猫君2 小时前
使用 Vite Mode 实现客户端与管理端的物理隔离
前端
HelloReader2 小时前
React Hook 到底是干嘛的?
前端
用户60572374873082 小时前
OpenSpec 实战:从需求到代码的完整工作流
前端·后端·程序员
寅时码2 小时前
React 正在演变为一场不可逆的赛博瘟疫:AI 投毒、编译器迷信与装死的官方
前端·react.js·设计模式
忆江南3 小时前
HTTP 各版本演进与 HTTPS 原理详解
前端
忆江南3 小时前
对组件化与模块化的思考与总结
前端