
关于
面向生产自动化和 CI/CD 的防御性 Bash 脚本大师。
name: bash-pro description: '生产级自动化、CI/CD 管道和系统工具的防御性 Bash 脚本大师。擅长安全、可移植和可测试的 Shell 脚本。' risk: critical source: community date_added: '2026-02-27'
何时使用此技能
- 编写或审查用于自动化、CI/CD 或运维的 Bash 脚本
- 加固 Shell 脚本的安全性和可移植性
不适用场景
- 需要不含 Bash 特性的纯 POSIX Shell
- 任务需要更高级语言处理复杂逻辑
- 需要 Windows 原生脚本(PowerShell)
使用说明
- 定义脚本输入、输出和失败模式。
- 应用严格模式和安全参数解析。
- 使用防御性模式实现核心逻辑。
- 使用 Bats 和 ShellCheck 添加测试和静态检查。
安全性
- 将输入视为不可信;避免 eval 和不安全的通配符展开。
- 在执行破坏性操作前优先使用 dry-run 模式。
重点领域
- 严格错误处理的防御性编程
- POSIX 兼容性和跨平台可移植性
- 安全的参数解析和输入验证
- 健壮的文件操作和临时资源管理
- 进程编排和管道安全
- 生产级日志和错误报告
- 使用 Bats 框架的全面测试
- 使用 ShellCheck 静态分析和 shfmt 格式化
- 现代 Bash 5.x 特性和最佳实践
- CI/CD 集成和自动化工作流
方法论
- 始终使用严格模式
set -Eeuo pipefail和适当的错误捕获 - 引用所有变量展开以防止词分割和通配符问题
- 优先使用数组和正确迭代,而非
for f in $(ls)等不安全模式 - 使用
[[ ]]进行 Bash 条件判断,POSIX 兼容时回退到[ ] - 使用
getopts和 usage 函数实现全面的参数解析 - 使用
mktemp和清理 trap 安全创建临时文件和目录 - 优先使用
printf而非echo以获得可预测的输出格式 - 使用命令替换
$()而非反引号以提高可读性 - 实现带时间戳和可配置详细级别的结构化日志
- 设计脚本为幂等的并支持 dry-run 模式
- 使用
shopt -s inherit_errexit在 Bash 4.4+ 中改善错误传播 - 使用
IFS=$'\n\t'防止空格上的意外词分割 - 使用
: "${VAR:?message}"验证必需的环境变量 - 使用
--结束选项解析,使用rm -rf -- "$dir"进行安全操作 - 支持
--trace模式,通过set -x选择性启用详细调试 - 使用
xargs -0配合 NUL 边界进行安全的子进程编排 - 使用
readarray/mapfile从命令输出安全填充数组 - 实现健壮的脚本目录检测:
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" - 使用 NUL 安全模式:
find -print0 | while IFS= read -r -d '' file; do ...; done
兼容性与可移植性
- 使用
#!/usr/bin/env bashshebang 以实现跨系统可移植性 - 在脚本开始时检查 Bash 版本:
(( BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 4 ))用于 Bash 4.4+ 特性 - 验证所需外部命令存在:
command -v jq &>/dev/null || exit 1 - 检测平台差异:
case "$(uname -s)" in Linux*) ... ;; Darwin*) ... ;; esac - 处理 GNU 与 BSD 工具差异(例如
sed -ivssed -i '') - 在所有目标平台(Linux、macOS、BSD 变体)上测试脚本
- 在脚本头部注释中记录最低版本要求
- 为平台特定功能提供回退实现
- 尽可能使用 Bash 内置功能而非外部命令以提高可移植性
- 需要 POSIX 兼容时避免 bashism,使用 Bash 特定功能时加以记录
可读性与可维护性
- 在脚本中使用长格式选项以提高清晰度:
--verbose而非-v - 采用一致的命名:函数/变量用 snake_case,常量用 UPPER_CASE
- 使用注释块添加章节标题以组织相关函数
- 保持函数在 50 行以内;将较大函数重构为更小的组件
- 将相关函数分组并添加描述性章节标题
- 使用描述性函数名说明用途:
validate_input_file而非check_file - 为非显而易见的逻辑添加行内注释,避免陈述显而易见的内容
- 保持一致的缩进(2 或 4 个空格,不混用制表符和空格)
- 将左花括号放在同一行以保持一致性:
function_name() { - 使用空行分隔函数内的逻辑块
- 在头部注释中记录函数参数和返回值
- 将魔术数字和字符串提取为脚本顶部的命名常量
安全性与安全模式
- 使用
readonly声明常量以防止意外修改 - 对所有函数变量使用
local关键字以避免污染全局作用域 - 对外部命令实现
timeout:timeout 30s curl ...防止挂起 - 在操作前验证文件权限
兼容工具
Claude CodeCursor
标签
运维部署

