2026/10/18 6:07:52
网站建设
项目流程
文章目录
- Bash Shell 易错点清单
- 一、💀 致命级:会丢数据或留漏洞
- 1. `rm -rf $DIR/*` 变量未定义
- 2. 变量含空格,删除时没加引号
- 3. `cd` 失败却不检查,后续命令照跑
- 4. `eval` / 拼接字符串执行
- 5. 空字符串变量拼进路径(`set -u` 也救不了)
- 6. `/tmp` 用固定文件名
- 二、🔴 高危:引号、循环、退出码
- 7. 变量不加双引号 → 单词分裂
- 8. glob 意外展开
- 9. `for f in $(ls)` —— 永远不要这么写
- 10. `${arr[@]}` 不加引号
- 11. `$*` 与 `$@` 的区别
- 12. 赋值号两侧加空格
- 13. `local x=$(cmd)` 吃掉命令的退出码(极隐蔽)
- 14. `$?` 被中间命令覆盖
- 15. `set -e` 在这些场景不生效(设计如此)
- 16. `((i++))` 被 `set -e` 误杀
- 17. 管道忘了 `set -o pipefail`
- 18. `trap ERR` 在函数内不触发
- 19. 管道 `while read` 会丢变量
- 20. `read` 不加 `-r`,反斜杠被吃掉
- 21. `while read` 循环里的命令抢走 stdin
- 22. 改了 `IFS` 不还原
- 23. `2>&1` 写反顺序
- 24. `sudo echo x > file` 权限仍然不够
- 25. `sudo echo $(id -u)` 拿到的不是 root
- 三、🟠 中级:条件、文件、环境
- 26. 文件名以 `-` 开头
- 27. 命令替换吃掉尾部换行
- 28. `[ ]` 里用 `==` 或数值用 `> <`
- 29. `[ -n $var ]` 不加引号 → 恒为真
- 30. `[[ ]]` 里正则加了引号
- 31. `08` 被当成八进制
- 32. `source` 脚本里的 `exit` 会退出当前终端
- 33. `echo` 行为跨 shell 不一致
- 34. cron 环境 PATH 过窄
- 35. 循环里反复调用外部命令
- 四、🟡 低级但很烦
- 36. locale 影响 `sort` / `awk`
- 37. `${#str}` 对中文是字符还是字节
- 38. 后台子 shell 不会继承 `trap`
- 39. alias 在非交互 shell 里不生效
- 40. 相对路径依赖当前目录
- 41. 空数组 + `set -u`(bash 4.2 特有)
- 42. `return` 用在函数外
- 五、防坑速查:脚本骨架
- 六、一条命令自查
Bash Shell 易错点清单
环境:CentOS Linux 7.9.2009| Shell:GNU bash 4.2.46(2)-release
共42 条,按危险程度分级。标注「实测」的条目均在本机跑过并附真实输出。
快速索引
| # | 易错点 | 等级 | 一句话后果 |
|---|
| 1 | rm -rf $DIR/*变量未定义 | 💀 致命 | 从根目录开始删 |
| 2 | 变量含空格却不加引号删除 | 💀 致命 | 删错文件 |
| 3 | cd失败不检查继续删 | 💀 致命 |