文章目录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` 循环里的命令抢走 stdin22. 改了 `IFS` 不还原23. `21` 写反顺序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 条,按危险程度分级。标注「实测」的条目均在本机跑过并附真实输出。快速索引#易错点等级一句话后果1rm -rf $DIR/*变量未定义💀 致命从根目录开始删2变量含空格却不加引号删除💀 致命删错文件3cd失败不检查继续删💀 致命