Linux Shell脚本复用的核心是设计可导入、可维护、可测试的函数库:独立命名、无副作用、前缀防冲突、位置参数传值、严格加载机制、输入校验、返回值控制流程,并配合shellcheck与单元测试保障可靠性。

Linux Shell 脚本复用的核心在于函数库的合理设计与加载机制——不是简单地复制粘贴代码,而是让函数像模块一样可导入、可维护、可测试。
函数库文件要独立、命名清晰、避免执行副作用
把通用函数(如日志打印、路径检查、配置读取)统一放在 lib/common.sh 这类路径下。文件本身不应直接运行逻辑,只定义函数和少量必要变量(如 LIB_DIR=$(dirname "$(readlink -f "$0")"))。避免在库文件顶部写 main 或调用函数,否则被 source 时会意外触发。
- 函数名加前缀防冲突,例如
log_info、fs_is_writable - 用
return 0表示成功,非零值表示具体错误类型(如return 1表示参数缺失) - 不依赖全局变量传参,优先用位置参数;必须共享状态时,用只读变量并加注释说明用途
主脚本通过 source 安全加载,支持相对/绝对路径回退
在主脚本开头用健壮方式引入库:
- 先尝试从当前目录同级的
lib/加载:source "${0%/*}/../lib/common.sh" 2>/dev/null || { echo "无法加载函数库"; exit 1; } - 若失败,再查环境变量
LIB_PATH或系统级路径(如/usr/local/lib/shell/) - 用
set -o nounset和set -o pipefail开启严格模式,防止未定义变量或管道错误被忽略
函数内部做输入校验,对外暴露简洁接口
每个函数应自行判断关键参数是否存在、是否合法,而不是把校验责任推给调用方:
- 例如
require_cmd() { command -v "$1" >/dev/null || { echo "缺少命令: $1"; return 127; } } - 对路径类参数,用
[[ -d "$1" ]] || return 1明确拒绝非法输入 - 返回值用于流程控制,不混用
echo输出业务数据;需输出内容时,统一用子shell捕获:value=$(get_config_value DB_HOST)
配合 shellcheck + 单元测试提升可靠性
函数库不是“写完就扔”,需要验证行为一致性:
- 用 shellcheck 扫描语法隐患,特别关注未引号变量、未声明变量、危险重定向
- 为关键函数写轻量测试:用临时文件模拟输入,比对 stdout/stderr 和退出码(例如用
diff ) - CI 中自动运行测试 + shellcheck,确保每次修改不破坏已有功能
函数库不是越全越好,而是越稳越小。一个能被 5 个不同脚本稳定调用的 log_debug,比十个只用一次的“炫技函数”更有价值。










