【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

否则会导致主脚本退出。

相关推荐
yuki_uix2 小时前
GraphQL 重塑:从 API 语言到 AI 时代的"逻辑神经系统"
前端·graphql
奋斗吧程序媛2 小时前
Vue3初体验(2)
前端·javascript·vue.js
css趣多多2 小时前
vue3的ref响应式,取值的时候自动补全value的设置,以及两种修改方式
前端
学习3人组2 小时前
Win11 使用 Proxifier 强制本地流量通过 Fiddler Classic 代理指南
前端·测试工具·fiddler
超绝大帅哥2 小时前
vue2vue3响应式
前端
Hhang2 小时前
Pageindex -- 新一代的文档智能检索
前端·人工智能
恋猫de小郭3 小时前
Claude Code 已经 100% 自己写代码,为什么 Anthropic 还有上百个工程职位空缺?
前端·人工智能·ai编程
liann1193 小时前
4.3.2_WEB——WEB后端语言——PHP
开发语言·前端·网络·安全·web安全·网络安全·php
是欢欢啊3 小时前
前端纯原生canvas图片裁剪工具,不依赖任何插件
前端