Bash

🖥️ 写出健壮的 Shell 脚本

Developer Tools榜 #32

专业级 Bash 脚本编写指南,涵盖引号陷阱、错误处理、参数扩展等核心技巧,帮助开发者写出健壮的 shell 脚本。

收藏
12.1k
安装
3.2k
版本
1.0.1
CLS 安全扫描中
预计需要 3 分钟...

使用说明

核心用法

本技能提供 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)"

Bash 内容

手动下载zip · 5.2 kB
arrays.mdtext/markdown
请选择文件