核心用法
本技能提供 Bash 脚本编写的系统性最佳实践,聚焦四大核心领域:
1. 引号与变量处理
- 强制使用
"$var"而非裸$var,防止空格导致的 word splitting - 数组必须使用
"${arr[@]}"遍历,保持元素独立性 - 单引号
'$var'为纯字面量,双引号支持变量扩展
2. 现代测试语法
- 优先使用
[[ ]]替代[ ],避免 word splitting,原生支持&&/||和正则匹配=~ - 文件测试务必引用变量:
[[ -f "$file" ]]
3. 严格模式三件套
set -e:命令失败立即退出(但 if/&&/|| 中除外)set -u:访问未定义变量报错set -o pipefail:管道中任意命令失败即整体失败
4. 进程与作用域管理
- 管道会创建子 shell,导致变量修改丢失;改用进程替换
< <(cmd)或重定向 ( )为子 shell,{ }为当前 shell 代码块- 函数内务必使用
local声明变量
5. 参数扩展技巧
${var:-default}提供默认值,${var:=default}设置并返回默认值${var:?error}未定义时报错退出,适合必填参数校验- 字符串操作:前缀移除
${var#pat}、子串提取${var:0:5}
显著优点
- 权威性高:内容源自 POSIX 和 Bash 官方文档及多年社区实践验证
- 问题导向:以常见陷阱(quoting、subshell、word splitting)为线索组织,学习曲线平滑
- 实用性强:直接给出可复制的代码模式,如严格模式配置、数组遍历、错误处理 trap
- 现代性:推广
[[ ]]、进程替换、local等现代 Bash 特性,告别 POSIX sh 的兼容性包袱
潜在局限
- Bash 专属:大量语法(
[[ ]],${arr[@]},< <())不可移植到 POSIX sh 或老旧系统 - 版本敏感:部分特性需 Bash 4.0+(如关联数组),文档未明确标注版本要求
- 场景有限:聚焦脚本编写,不涉及交互式 shell 技巧或高级进程管理
- 缺少集成:未涉及 CI/CD、容器化等现代 DevOps 场景下的 Bash 实践
适合人群
- Linux/macOS 后端开发者需要编写部署脚本、构建脚本
- 运维工程师(SRE/DevOps)编写自动化巡检、日志处理工具
- 需要维护遗留 shell 脚本但希望引入现代安全实践的开发者
- 有一定命令行基础、希望系统提升脚本健壮性的中级用户
常规风险
- 兼容性风险:在 Alpine Linux(默认 ash/dash)、老旧嵌入式系统上可能失效
- 过度严格:
set -e在某些复杂控制流中行为反直觉,可能掩盖错误处理逻辑缺陷 - 路径隐患:未提及
PATH注入风险,依赖外部命令时建议全路径或使用command -v验证 - 并发缺失:未覆盖 flock/lockfile 等并发控制,多进程场景需额外研究
建议配置模板
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"