Linux 脚本最佳实践
本文最后更新于:2025年7月12日 下午
前文
可以直接把这篇文章喂给 AI, 可以放到 AI 角色设定里,也可以直接作为提示词.
这样,你只管提需求,写脚本就让 AI 来.
一、基础原则
-
明确用途
-
脚本开头用注释说明功能、作者、版本和修改记录
-
示例:
1
2
3
4#!/bin/bash
# Purpose: Backup MySQL databases
# Author: John Doe
# Version: 1.2 (2023-08-20)
-
-
选择合适的解释器
-
显式指定解释器(避免依赖默认 shell):
1
2
3#!/usr/bin/env bash # 推荐(兼容性更好)
# 或
#!/bin/bash # 明确版本
-
二、代码规范
-
变量管理
-
命名全大写 + 下划线,局部变量用小写
1
2readonly CONFIG_FILE="/etc/app.conf"
local temp_file="$(mktemp)" -
引用变量加双引号(防止空格 / 特殊字符问题):
1
cp "$source" "$dest"
-
-
错误处理
-
启用严格模式(脚本开头添加):
1
set -euo pipefail # -e: 错误退出 -u: 未定义变量报错 -o pipefail: 管道错误检测
-
关键操作检查返回值:
1
2
3
4if ! mkdir "/backup"; then
echo "Failed to create directory" >&2
exit 1
fi
-
-
函数使用
-
功能模块化,限制函数作用域:
1
2
3
4process_data() {
local input_file=$1
# 函数逻辑。..
}
-
三、安全性
-
输入验证
-
检查用户输入 / 参数:
1
2
3
4if [[ $# -lt 2 ]]; then
echo "Usage: $0 <source> <dest>" >&2
exit 1
fi
-
-
权限控制
-
避免使用 root 执行非必要操作:
1
2
3
4if [[ $(id -u) -ne 0 ]]; then
echo "Requires root privileges" >&2
exit 1
fi
-
-
敏感信息
- 密码 / 密钥等不要硬编码,使用环境变量或配置文件(权限设为 600)
四、可维护性
-
日志记录
-
重要操作输出日志:
1
2
3
4log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "/var/log/script.log"
}
log "Starting backup process..."
-
-
配置文件分离
-
将配置参数提取到单独文件(如
config.cfg
):1
source ./config.cfg || exit 1
-
五、调试与测试
-
调试模式
-
运行时显示命令执行:
1
2
3bash -x script.sh
# 或在脚本内启用
set -x
-
-
单元测试
- 为关键函数编写测试用例(可使用
bats
框架)
- 为关键函数编写测试用例(可使用
六、性能优化
-
减少子进程调用(如避免循环内调用
grep
/awk
) -
使用内置字符串操作替代外部命令:
1
2# 替代:echo "$str" | cut -d':' -f2
echo "${str#*:}" -
大文件处理时使用流式处理(避免全量加载到内存)
模板示例
1 |
|
Linux 脚本最佳实践
https://ewhisper.cn/posts/48106/