用途:这是 Scenescape 项目的 Shell 脚本编写标准,用于统一仓库内 .sh 脚本的风格与写法,提升可移植性、可读性与健壮性。
主要能力与约定:
- Shebang:使用 #!/usr/bin/env bash,而非 #!/bin/bash 或 #!/bin/sh。
- 代码风格:用 shellcheck 做 lint,命令为 make lint-shell;缩进用 2 个空格,不用制表符;行长目标 80-100 字符,长命令用 \ 续行。
- 最佳实践:用 set -e 出错即退出,set -o pipefail 让管道中任一命令失败即失败;关键脚本用 set -euo pipefail 严格模式;用 trap 做退出清理与错误提示。
- 变量:局部变量小写下划线,环境/全局变量大写下划线,常量用 readonly;变量始终加引号防止分词;支持 ${VAR:-默认}、${VAR:=默认}、${VAR:?错误} 等默认值写法。
- 条件与逻辑:优先用 [[ ]] 而非 [ ] 或 test,支持文件、字符串、数值测试与模式匹配;用 && 和 || 做短路逻辑。
- 函数:用 local 声明函数内变量,用 return 返回状态码。
- 命令替换:用 $() 而非反引号。
- 循环与数组:支持 for、C 风格 for、while 逐行读取;用 declare -a 声明数组,用 "${arr[@]}" 遍历。
- 错误处理:检查命令退出码,错误信息输出到 stderr,可用 set -x 调试。
- 文件与路径:读写文件、here document、mktemp 临时文件配合 trap 清理;用 BASH_SOURCE 获取脚本目录,用 dirname/basename 处理路径。
- 进程管理:后台任务与 $!、wait,进程替换 <(command)。
- Scenescape 特定模式:Docker 构建命令、必需环境变量检查、Makefile 变量读取。
- 常见模式:重试逻辑、输入校验、日志函数。
- 反模式:避免 eval、解析 ls 输出、无谓使用 cat、忽略错误。
- 测试与文档:用 bash -n 语法检查、shellcheck 检查、bash -x 调试;脚本头部与函数需写注释文档。
- 性能与可移植性:避免子 shell,优先用 bash 内建;Scenescape 使用 bash 而非 POSIX sh,[[ ]]、数组、$()、(( ))、=~ 均可用。
使用方式:按上述规范编写脚本,运行 make lint-shell 检查,必要时用 bash -n 与 bash -x 验证。
限制:资料未提供该规范的版本、适用范围之外的强制机制或与 CI 的集成细节。