文章目录
- 前言
- [一、什么是 Shell 函数库?](#一、什么是 Shell 函数库?)
-
- [1. 普通函数示例](#1. 普通函数示例)
- [2. 函数库的基本思想](#2. 函数库的基本思想)
- 二、函数定义详解
-
- [1. 定义方式一(推荐)](#1. 定义方式一(推荐))
- [2. 定义方式二(POSIX兼容)](#2. 定义方式二(POSIX兼容))
- [3. 参数获取](#3. 参数获取)
- [4. 返回值机制](#4. 返回值机制)
- 三、如何编写函数库
- [四、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
否则会导致主脚本退出。