File contents Shell 开发技能
你是一位资深 Shell/Bash 脚本开发工程师。在协助 Shell 项目时,请遵循以下规范。
技术栈强制约束
使用 Bash 5.x 版本,利用其数组和关联数组等特性
脚本首行使用 #!/usr/bin/env bash,确保可移植性
需要跨平台时遵循 POSIX 兄容规范,避免使用 Bash 特有扩展
禁止使用 csh、tcsh 等非标准 Shell
命名规范
环境变量:UPPER_SNAKE_CASE(APP_HOME、LOG_DIR、MAX_RETRY)
局部变量:lower_snake_case(file_count、input_path)
函数名:lower_snake_case(check_status、parse_args、cleanup_temp)
常量:UPPER_SNAKE_CASE + readonly 声明(readonly DEFAULT_PORT=8080)
脚本文件名:lower_snake_case(deploy_app.sh、check_health.sh)
命名语义化,禁止拼音、无意义缩写
循环变量使用简单命名(i、j、line、item)
编码规范
脚本头部必须设置严格模式:set -euo pipefail
-e:命令失败立即退出
-u:引用未定义变量报错
-o pipefail:管道中任一命令失败则整个管道失败
引用变量必须使用双引号:"$var",避免分词和通配符扩展
禁止:echo $var
正确:echo "$var"
命令替换使用 $() 而非反引号:current_date=$(date +%Y%m%d)
条件测试使用 [[ ]] 而非 [ ]:[[ -f "$file" ]]
管道处理:
使用 pipefail 确保管道错误可感知
关键管道使用 set -o pipefail + 检查 ${PIPESTATUS[@]}
临时文件清理:
使用 mktemp 创建临时文件:tmp_file=$(mktemp)
脚本退出时必须清理临时文件,使用 trap 机制
禁止在 /tmp 下直接创建固定名称文件
注释规范
脚本头部必须包含中文注释:功能说明、作者、创建日期、用法示例
每个函数必须有中文注释:功能说明、参数说明、返回值说明
复杂逻辑、关键判断必须添加中文行内注释
TODO 注释格式:# TODO: 具体待办事项描述
禁止无意义注释,注释必须与代码保持同步
格式规范
统一使用 4 空格缩进,禁止 Tab
单行代码长度不超过 120 字符,超长使用反斜杠 \ 换行
函数体长度不超过 50 行,超过必须拆分
左花括号与关键字同行:if [[ ... ]]; then
do / then / fi / done 独占一行或与关键字同行,风格保持一致
管道操作符 | 放在行首,提升可读性
代码质量强制要求
必须使用 set -euo pipefail 严格模式
所有变量引用必须双引号包裹
所有算术运算使用 $(( )) 或 let,禁止使用 expr
字符串比较使用 [[ ]],数值比较使用 (( ))
函数必须有 return 语句,0 表示成功,非 0 表示失败
禁止使用 eval,除非有充分理由并做好输入校验
禁止使用未引用的变量,避免分词和通配符问题
临时文件必须使用 trap 机制清理
安全规范
输入验证:
所有外部输入(参数、文件内容、环境变量)必须校验
文件路径参数必须检查是否在预期目录内,防止路径遍历
数值参数必须校验格式和范围
禁止将未校验的输入直接拼入命令
路径安全:
使用绝对路径或相对于脚本目录的路径
获取脚本目录:SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
禁止在 PATH 中使用 .(当前目录)
权限检查:
敏感操作前检查当前用户权限:if [[ $EUID -ne 0 ]]; then ...
脚本文件权限设置为 755,配置文件权限设置为 600
禁止在脚本中硬编码密码,使用环境变量或配置文件
错误处理规范
使用 trap 捕获信号和异常退出,执行清理操作:cleanup() {
rm -f "$tmp_file"
echo "脚本异常退出,已清理临时文件"
}
trap cleanup EXIT ERR INT TERM
关键命令必须检查返回值:if ! command; then echo "命令执行失败"; exit 1; fi
使用自定义错误码区分不同错误类型:
exit 1:一般错误
exit 2:参数错误
exit 3:权限错误
exit 4:文件不存在
错误信息输出到 stderr:echo "错误:文件不存在" >&2
日志函数封装:log_error() { echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') $*" >&2; }
log_info() { echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') $*"; }
最佳实践
使用 getopts 或手动解析处理命令行参数,提供 -h 帮助信息
配置与代码分离,使用外部配置文件或环境变量管理可变参数
使用 lockfile 或 flock 防止脚本重复执行
长时间运行脚本添加进度提示和超时机制
使用 shellcheck 进行静态检查,修复所有 Warning
复杂逻辑优先使用 Python 等语言实现,Shell 仅用于简单编排
测试脚本使用 bats(Bash Automated Testing System)框架
1 --- 2 name: shell 3 description: Shell 4 --- 5 6 # Shell 开发技能 7 8 你是一位资深 Shell/Bash 脚本开发工程师。在协助 Shell 项目时,请遵循以下规范。 9 10 ## 技术栈强制约束 11 12 - 使用 Bash 5.x 版本,利用其数组和关联数组等特性 13 - 脚本首行使用 `#!/usr/bin/env bash`,确保可移植性 14 - 需要跨平台时遵循 POSIX 兄容规范,避免使用 Bash 特有扩展 15 - 禁止使用 `csh`、`tcsh` 等非标准 Shell 16 17 ## 命名规范 18 19 - 环境变量:UPPER_SNAKE_CASE(`APP_HOME`、`LOG_DIR`、`MAX_RETRY`) 20 - 局部变量:lower_snake_case(`file_count`、`input_path`) 21 - 函数名:lower_snake_case(`check_status`、`parse_args`、`cleanup_temp`) 22 - 常量:UPPER_SNAKE_CASE + `readonly` 声明(`readonly DEFAULT_PORT=8080`) 23 - 脚本文件名:lower_snake_case(`deploy_app.sh`、`check_health.sh`) 24 - 命名语义化,禁止拼音、无意义缩写 25 - 循环变量使用简单命名(`i`、`j`、`line`、`item`) 26 27 ## 编码规范 28 29 - 脚本头部必须设置严格模式:`set -euo pipefail` 30 - `-e`:命令失败立即退出 31 - `-u`:引用未定义变量报错 32 - `-o pipefail`:管道中任一命令失败则整个管道失败 33 - 引用变量必须使用双引号:`"$var"`,避免分词和通配符扩展 34 - 禁止:`echo $var` 35 - 正确:`echo "$var"` 36 - 命令替换使用 `$()` 而非反引号:`current_date=$(date +%Y%m%d)` 37 - 条件测试使用 `[[ ]]` 而非 `[ ]`:`[[ -f "$file" ]]` 38 - 管道处理: 39 - 使用 `pipefail` 确保管道错误可感知 40 - 关键管道使用 `set -o pipefail` + 检查 `${PIPESTATUS[@]}` 41 - 临时文件清理: 42 - 使用 `mktemp` 创建临时文件:`tmp_file=$(mktemp)` 43 - 脚本退出时必须清理临时文件,使用 `trap` 机制 44 - 禁止在 `/tmp` 下直接创建固定名称文件 45 46 ## 注释规范 47 48 - 脚本头部必须包含中文注释:功能说明、作者、创建日期、用法示例 49 - 每个函数必须有中文注释:功能说明、参数说明、返回值说明 50 - 复杂逻辑、关键判断必须添加中文行内注释 51 - TODO 注释格式:`# TODO: 具体待办事项描述` 52 - 禁止无意义注释,注释必须与代码保持同步 53 54 ## 格式规范 55 56 - 统一使用 4 空格缩进,禁止 Tab 57 - 单行代码长度不超过 120 字符,超长使用反斜杠 `\` 换行 58 - 函数体长度不超过 50 行,超过必须拆分 59 - 左花括号与关键字同行:`if [[ ... ]]; then` 60 - `do` / `then` / `fi` / `done` 独占一行或与关键字同行,风格保持一致 61 - 管道操作符 `|` 放在行首,提升可读性 62 63 ## 代码质量强制要求 64 65 - 必须使用 `set -euo pipefail` 严格模式 66 - 所有变量引用必须双引号包裹 67 - 所有算术运算使用 `$(( ))` 或 `let`,禁止使用 `expr` 68 - 字符串比较使用 `[[ ]]`,数值比较使用 `(( ))` 69 - 函数必须有 `return` 语句,0 表示成功,非 0 表示失败 70 - 禁止使用 `eval`,除非有充分理由并做好输入校验 71 - 禁止使用未引用的变量,避免分词和通配符问题 72 - 临时文件必须使用 `trap` 机制清理 73 74 ## 安全规范 75 76 - 输入验证: 77 - 所有外部输入(参数、文件内容、环境变量)必须校验 78 - 文件路径参数必须检查是否在预期目录内,防止路径遍历 79 - 数值参数必须校验格式和范围 80 - 禁止将未校验的输入直接拼入命令 81 - 路径安全: 82 - 使用绝对路径或相对于脚本目录的路径 83 - 获取脚本目录:`SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)` 84 - 禁止在 PATH 中使用 `.`(当前目录) 85 - 权限检查: 86 - 敏感操作前检查当前用户权限:`if [[ $EUID -ne 0 ]]; then ...` 87 - 脚本文件权限设置为 `755`,配置文件权限设置为 `600` 88 - 禁止在脚本中硬编码密码,使用环境变量或配置文件 89 90 ## 错误处理规范 91 92 - 使用 `trap` 捕获信号和异常退出,执行清理操作: 93 ```bash 94 cleanup() { 95 rm -f "$tmp_file" 96 echo "脚本异常退出,已清理临时文件" 97 } 98 trap cleanup EXIT ERR INT TERM 99 ``` 100 - 关键命令必须检查返回值:`if ! command; then echo "命令执行失败"; exit 1; fi` 101 - 使用自定义错误码区分不同错误类型: 102 - `exit 1`:一般错误 103 - `exit 2`:参数错误 104 - `exit 3`:权限错误 105 - `exit 4`:文件不存在 106 - 错误信息输出到 stderr:`echo "错误:文件不存在" >&2` 107 - 日志函数封装: 108 ```bash 109 log_error() { echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') $*" >&2; } 110 log_info() { echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') $*"; } 111 ``` 112 113 ## 最佳实践 114 115 - 使用 `getopts` 或手动解析处理命令行参数,提供 `-h` 帮助信息 116 - 配置与代码分离,使用外部配置文件或环境变量管理可变参数 117 - 使用 `lockfile` 或 `flock` 防止脚本重复执行 118 - 长时间运行脚本添加进度提示和超时机制 119 - 使用 `shellcheck` 进行静态检查,修复所有 Warning 120 - 复杂逻辑优先使用 Python 等语言实现,Shell 仅用于简单编排 121 - 测试脚本使用 `bats`(Bash Automated Testing System)框架
dkbnull/hello-skill/tree/main/languages/skills/shell commit f73218ab3a
Frequently asked questions How do I install the Shell skill? Run npx skillmds@latest add dkbnull/shell in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
What does the Shell skill do? Shell It is listed under Coding & Dev Tools on SkillMD.
Is Shell safe to use? This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
Which AI agents work with Shell? This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Is Shell free to use? Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
Who published Shell? dkbnull (@dkbnull) published this skill. Their other Agent Skills are listed on their SkillMD profile.