shell脚本需规范编写以保障可读、可维护、可复用和可排查:头部声明解释器与元信息,变量命名清晰且避免硬编码,敏感信息外置,启用set -ueo pipefail等安全选项,用getopts解析参数,分层日志与错误处理。

写好 Shell 脚本不是“能跑就行”,而是要让脚本可读、可维护、可复用、可排查。规范不是束缚,是降低团队协作和长期运维成本的关键。
脚本头部必须声明解释器与元信息
每份脚本第一行必须是 #!/bin/bash(或明确指定路径如 #!/usr/bin/env bash),避免因默认 shell 差异导致语法错误。紧接着添加注释块,至少包含:
- 功能说明:一句话讲清脚本用途,例如“每日清理 /var/log/nginx/ 下 30 天前的访问日志”
- 作者与日期:便于追溯修改人和初始版本时间
-
版本号:如
v1.2,配合 Git Tag 使用更佳 -
使用示例:给出典型调用方式,如
./cleanup-nginx-logs.sh --days 30
变量命名清晰,禁止裸写字符串和魔法数字
所有路径、阈值、命令参数都应定义为变量,并采用大写+下划线风格,含义一目了然:
- ✅ 推荐:
LOG_DIR="/var/log/nginx"、RETENTION_DAYS=30、DATE_CMD="date +%Y%m%d" - ❌ 避免:
find /var/log/nginx -name "*.log" -mtime +30 -delete(硬编码路径和数字)
敏感信息(如密码、API Key)不写死在脚本中,改用环境变量或配置文件(需设置 600 权限),并在脚本开头校验是否已设置:[ -z "$API_TOKEN" ] && { echo "Error: API_TOKEN not set"; exit 1; }
启用基础安全与健壮性控制
在脚本开头统一开启关键选项:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
set -u:引用未定义变量时报错退出 -
set -e:任一命令非零退出时立即终止(慎用于需忽略失败的场景,可用command || true显式覆盖) -
set -o pipefail:管道中任意命令失败即整体失败(避免grep | awk因 grep 无匹配而静默跳过) -
IFS=$'\n\t'和set -f:防止空格路径或通配符意外展开(尤其遍历文件时)
对关键操作加日志和确认机制,例如删除前输出将删哪些文件,生产环境建议默认禁用自动删除,用 --dry-run 模式预览。
参数解析统一用 getopts,拒绝位置参数硬编码
用户传参必须结构化,不用 $1、$2 猜意图。使用内置 getopts 解析短选项(如 -d 30 或 -h),并支持长选项需搭配 getopt(注意 GNU vs BSD 版本差异)。示例骨架:
while getopts "d:h" opt; do
case $opt in
d) RETENTION_DAYS="$OPTARG" ;;
h) echo "Usage: $0 [-d DAYS]"; exit 0 ;;
*) echo "Unknown option"; exit 1 ;;
esac
done
务必校验必要参数是否提供,缺失时打印帮助并退出,不静默执行默认值(除非业务明确允许)。
日志与错误处理要分层、可追踪
不依赖 echo 打印一切。区分输出层级:
-
echo "INFO: Starting cleanup..."→ 标准输出,用于常规流程提示 -
echo "WARN: $file not found, skipping" >&2→ stderr,用于非致命异常 -
logger -t "cleanup-nginx" "ERROR: Failed to delete $file"→ 写入系统日志,便于集中采集
每个关键步骤后检查返回值,失败时记录上下文(如命令、参数、当前目录)、输出错误码,并用 exit 128 等非通用码标识特定错误类型,方便监控脚本识别故障分类。










