规范大型运维脚本函数结构需按入口层、能力层、基础层三级分层;函数命名动词开头、全小写、下划线分隔;参数显式声明,变量local化;严格source路径与错误处理,确保可定位、可复用、可测试、可协作。

规范大型运维脚本的函数结构,核心是让函数可定位、可复用、可测试、可协作——不是堆功能,而是建接口。
按职责分层组织函数
避免所有函数平铺在主脚本里。推荐三级结构:
-
入口层(main.sh):只含
main()函数和极简调度逻辑,调用各模块函数,不写具体操作 -
能力层(lib/*.sh):按领域拆分,如
lib/network.sh(端口检测、curl封装)、lib/file.sh(安全拷贝、校验、归档) -
基础层(lib/utils.sh):提供通用工具,如
log_info、die_if_missing、is_root,不依赖其他模块
函数命名与接口设计统一
名字即契约,参数即协议:
- 函数名全小写,用下划线分隔,动词开头,体现意图:
backup_mysql_db、wait_for_service_up,不叫do_backup或check - 每个函数只做一件事,输入明确、输出可控;避免“万能函数”带一堆
if分支 - 必需参数全部显式接收,不依赖全局变量;可选参数通过配置变量或默认值处理,例如:
deploy_app() { local app_name="${1?Error: app_name required}"; local env="${2:-prod}"; ... }
导入与作用域严格管控
防止隐式依赖和变量污染:
- 所有外部库用绝对路径
source,推荐写法:source "$(dirname "$0")/lib/utils.sh",避免source ./lib/utils.sh在不同目录执行失败 - 函数内一律用
local声明变量,禁止意外覆盖全局状态;特别注意循环变量、临时文件名、状态码等 - 敏感操作(如
rm -rf、systemctl restart)单独封装,强制要求传入--force或--dry-run开关,默认禁用真实变更
错误处理与可观测性内置
函数不是黑盒,要自带诊断能力:
- 每个函数开头加
set -euo pipefail(或继承自主脚本),保证内部命令失败立即中断 - 关键步骤前加日志,用统一
log_debug/log_warn函数输出上下文,例如:log_info "Starting backup for ${DB_NAME} to ${BACKUP_DIR}" - 返回值明确区分:
return 0仅表示流程成功;数据结果统一用echo输出,由调用方用$(...)捕获;不混用return传数值











