【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

否则会导致主脚本退出。

相关推荐
社恐的下水道蟑螂17 分钟前
LangChain 进阶实战:从玩具 Demo 到生产级 AI 应用(JS/TS 全栈版)
前端·langchain·openai
Fairy要carry19 分钟前
项目01-手搓Agent之loop
前端·javascript·python
亲亲小宝宝鸭24 分钟前
Ctrl ACV工程师的提效之路:删掉项目中的冗余
前端
kyriewen28 分钟前
DOM树与节点操作:用JS给网页“动手术”
前端·javascript·面试
米饭同学i31 分钟前
基于腾讯云COS的小程序素材上传功能实现
前端·javascript·react.js
cxxcode31 分钟前
前端性能指标接入 Prometheus 技术方案
前端
辣椒炒代码32 分钟前
🚀 AI Agent 入门实战:基于 LangChain + MCP 构建智能导游助手
前端
ruanCat36 分钟前
前端工程化工具链从零配置:simple-git-hooks + lint-staged + commitlint
前端·git·代码规范
Jackson__1 小时前
AI时代,前端开发者到底还剩下什么?又该往哪里走?
前端·ai编程
C澒1 小时前
微前端容器标准化:容器标准化演进
前端·架构