【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

否则会导致主脚本退出。

相关推荐
农夫山泉不太甜8 小时前
Nuxt 4 完全指南:从入门到精通
前端
Momo__8 小时前
Vue 3.4+ 被低估的 3 个 API,让你的代码更优雅
前端·vue.js
dishugj8 小时前
HANA数据库常用命令总结
java·前端·数据库
clove8 小时前
JavaScript 提升(Hoisting)与声明优先级:一篇文章说透
前端
七牛开发者8 小时前
不写框架、不用 npm,我用 AI Coding 做了一个家庭记忆站
前端·人工智能·npm
@PHARAOH8 小时前
WHAT - npm和corepack
前端·npm·node.js
不爱学英文的码字机器8 小时前
被 AE 的关键帧折磨过的人,应该试试这个用 React 写视频的路子
前端·react.js·音视频
Csvn8 小时前
组合式函数
前端·vue.js
CodeSheep9 小时前
中国编程第一人,一人抵一城!
前端·后端·程序员